Instagram Video Downloader API
To download an Instagram video with an API, send its public link to POST /v1/resolve with the service ID instagram. The answer is JSON with a direct MP4 URL for each video and a direct image URL for each photo. No Instagram login, cookies or Meta app review are involved.
No card needed. Failed requests cost nothing.

Key facts
- Endpoint
- POST /v1/resolve (one endpoint for every service)
- Free trial
- 20 result credits after email verification, no card
- Price
- from $19 for 7,500 results ($1.33–$2.53 per 1,000)
- Billing
- prepaid credits, no subscription, no expiry; failed or empty requests cost 0
- Credits per result
- 1 (Instagram, TikTok, X, Pinterest) or 2 (Stories, Highlights, Telegram)
- Limits
- up to 20 items per request; 120 requests per minute per account; 2 in progress at once on the trial, 8 on paid accounts
Request and response
This is the whole integration. Any language that can send an HTTPS POST can use it.
curl -X POST https://developers.getinsaver.com/v1/resolve \
-H "Authorization: Bearer $GIS_KEY" \
-H "Content-Type: application/json" \
--max-time 130 \
-d '{"service": "instagram", "url": "https://www.instagram.com/reel/SHORTCODE/", "max_results": 10}'{
"ok": true,
"service": "instagram",
"source_url": "https://www.instagram.com/reel/SHORTCODE/",
"item_count": 1,
"items": [
{
"type": "video",
"url": "https://cdn.example/media.mp4"
}
],
"metadata": {
"title": null,
"author": "creator",
"caption": null
},
"request_id": "39a3bff5-0000-4000-8000-000000000000",
"credits_used": 1
}A Reel returns one video. A carousel returns one item per slide, up to max_results (1 to 20). Each returned item costs one credit.
Which Instagram links work
| Link | Service ID | Credits per result |
|---|---|---|
instagram.com/reel/..., /p/..., /tv/... | instagram | 1 |
instagram.com/stories/username/... | instagram-story | 2 |
instagram.com/stories/highlights/... | instagram-highlight | 2 |
Only content that is publicly visible without logging in works. Private, deleted, expired and login-only posts return an error and cost nothing.
Save the video in Node.js
Media URLs expire within minutes to hours, so the script saves each file right away. It needs Node.js 18 or newer and no packages. Run it with GIS_KEY=gis_live_... node resolve.mjs.
// Node.js 18+ (built-in fetch, no packages). Run: GIS_KEY=gis_live_... node resolve.mjs
import { createWriteStream } from "node:fs";
import { mkdir } from "node:fs/promises";
import { Readable } from "node:stream";
import { pipeline } from "node:stream/promises";
const API_URL = "https://developers.getinsaver.com/v1/resolve";
const EXT = { "video/mp4": ".mp4", "image/jpeg": ".jpg", "image/png": ".png", "image/webp": ".webp", "audio/mpeg": ".mp3" };
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
async function resolveLink(service, url, maxResults = 10, retries = 3) {
for (let attempt = 0; ; attempt++) {
const response = await fetch(API_URL, {
method: "POST",
headers: { Authorization: `Bearer ${process.env.GIS_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ service, url, max_results: maxResults }),
signal: AbortSignal.timeout(130_000)
});
const data = await response.json();
if (response.ok) return data;
// 429 = rate or concurrency limit, 502/504 = platform hiccup; none of them is charged
if ([429, 502, 504].includes(response.status) && attempt < retries) {
await sleep(Number(response.headers.get("retry-after") || 5) * 1000);
continue;
}
throw new Error(`${data.code}: ${data.message}`);
}
}
// Media URLs expire within minutes to hours, so save the file right away.
async function download(item, name, folder = "downloads") {
const media = await fetch(item.url, { signal: AbortSignal.timeout(120_000) });
if (!media.ok) throw new Error(`download failed: HTTP ${media.status}`);
await mkdir(folder, { recursive: true });
const type = (media.headers.get("content-type") || "").split(";")[0];
const path = `${folder}/${name}${EXT[type] || ".bin"}`;
await pipeline(Readable.fromWeb(media.body), createWriteStream(path));
return path;
}
const result = await resolveLink("instagram", "https://www.instagram.com/reel/SHORTCODE/");
console.log(`${result.item_count} items, ${result.credits_used} credits`);
for (const [i, item] of result.items.entries()) {
console.log(item.type, await download(item, `${result.request_id}-${i}`));
}Can the official Instagram API download videos?
Not from a link. Meta’s documentation says its Instagram Platform “allows your app to access data for Instagram professional accounts” and that “your app users must have an Instagram professional account”. No call takes a public Reel link and returns its file. The older Basic Display API ended on December 4, 2024.
| Instagram API (Meta) | GetInSaver API | |
|---|---|---|
| Built for | Managing professional accounts that connect to your app | Getting files from public links |
| You need | A Meta app, and app users with a professional account | An email address and an API key |
| Public Reel by link | No such call | Yes |
| Publishing, comments, insights | Yes | No |
Use Meta’s API to publish, answer comments or read insights for accounts you manage. Use this API when your product receives public links and needs the files. One product can use both.
Speed and limits
In the 30 days to 4 November 2026, successful Instagram requests took 5.1 seconds on average. Slow cases can take up to two minutes, so set your client timeout to 130 seconds. The limit is 120 requests per minute per account, with 2 in progress at once on the trial and 8 after buying credits.
Errors
| HTTP | Code | What to do |
|---|---|---|
| 402 | INSUFFICIENT_CREDITS | Top up, or lower max_results: a request reserves max_results times the credits per result first. |
| 422 | UPSTREAM_REJECTED | The post is private, deleted, expired or login-only. Show the message to your user. Nothing was charged. |
| 429 | RATE_LIMITED, CONCURRENCY_LIMIT | Wait for Retry-After seconds and retry. 120 requests per minute per account; 2 at once on the trial, 8 after buying credits. |
| 502, 504 | UPSTREAM_* | Temporary platform failure. Safe to retry. Nothing was charged. |
Every error body is JSON with a stable code and a readable message. The API reference has the full list.
FAQ
Is there a free Instagram video downloader API?
You can test this one with 20 free results after email verification, with no card. It is a trial, not a recurring free plan. Prepaid credits start at $19.
Can the Instagram Graph API download Reels from other accounts?
No call takes a public Reel link and returns its video file. Meta's API is built for professional accounts that connect to your app.
Do I need an Instagram account?
No. Your code sends a public link and your API key. No Instagram account of yours is involved.
Can I get all the videos of a profile?
No. Each request resolves one post, Reel, Story set or Highlight. The API does not list profiles, followers or hashtags.
How long do the video URLs last?
Minutes to hours. Download the file right away and store your own copy if you have the right to keep it.
Related
Updated 2026-11-04. The code on this page is run by our test suite against the API server before every release.
Make your first call in five minutes
20 free results when you verify your email. No card needed.
Create a free account