GET/v1/instagram/download8 credits per video

Instagram Media Download API

Give this endpoint a public Instagram Reel or video post URL and it hands back a direct link to the underlying MP4, plus the clip's duration. We do not host, re-encode or proxy the file — the link points at Instagram's own CDN, and you fetch the bytes yourself. One call costs 8 credits.

Request

parametertypedescription
urlstring, requiredA public Instagram post, reel or profile URL. Share links are resolved.
freshbooleanSkip the stored copy and read live, at the same price.
fieldsstringComma-separated field paths to keep.
formatjsonJSON envelope.

Billing and freshness

8 credits per video. Failed calls are never charged, and empty results are free up to 25 a day. Stored copies are refreshed weekly.

What you get back

A small object, deliberately. There are four keys: the post's shortcode, the media URL, the runtime in seconds, and a short note reminding you that the URL expires. If you also want the caption, like count or author, that is the Instagram Stats API — this endpoint is about getting to the file and nothing else.

The media URL is a signed CDN link. Instagram issues these with an embedded expiry and ties them loosely to the requesting context, so they are useful for minutes, not days. Fetch the file as soon as you have the link, store your own copy, and never write the CDN URL into a database as if it were permanent. If you serve it to a browser hours later it will 403 and you will spend an afternoon debugging something that is working as designed.

If the post has no video track — a single photo, a carousel of stills — the normalizer has nothing to return and the call fails rather than returning a half-object. That is intentional. A response either has a working media URL in it or it does not exist.

GET /v1/instagram/download
curl "https://api.instadata.dev/v1/instagram/download?url=https%3A%2F%2Fwww.instagram.com%2Freel%2FC8xQvZ2sVAb%2F" \
  -H "Authorization: Bearer ik_live_..."
Example response
{
  "data": {
    "platform": "instagram",
    "entity_id": "C8xQvZ2sVAb",
    "media_url": "https://cdn.example/video/master.mp4?sig=...",
    "mime_type": "video/mp4",
    "expires_at": "2026-07-15T13:00:00Z",
    "warning": "media_url is short-lived (max 1h) — download promptly or re-request."
  },
  "request_id": "req_01JZX4M8Q2TE9W"
}

Fields

fieldtypenote
idstringThe Instagram shortcode for the post (the segment after /reel/ or /p/), stable for the life of the post.
media_urlstringDirect link to the MP4 on Instagram's CDN. Short-lived and signed — download it immediately.
duration_secnumber|nullVideo runtime in seconds. Null when Instagram does not expose a duration for that media.
notestringA fixed reminder string that media_url is a short-lived CDN link and should be downloaded promptly.

Reach for it when

  • Archiving your own or a client's Reels to object storage on a schedule, so you keep a copy that outlives the account.
  • Feeding video into an ML or transcription pipeline that needs the actual file rather than a page to render.
  • Building an ad-creative or swipe-file library, where the team wants to watch competitor Reels side by side without opening Instagram.
  • Frame extraction, thumbnail generation, or duration-based analysis where you need to decode the video locally.

Not the right call when

  • You want engagement numbers, caption or author for the post — that is the Instagram Stats API, at a fraction of the cost.
  • You want a creator's recent Reels as a list before deciding what to pull — start with the Instagram Channel Reels API, then pass the URLs you care about here.
  • You want the spoken words rather than the file. Use the Instagram Reel Transcript API, which returns the spoken words as text without the file.
  • The post is a photo or an image-only carousel. There is no video to return and the call will error.

Things to know

The link expires. Plan for it.

Instagram signs CDN URLs with a short validity window. Treat the response as a one-shot fetch instruction: call the endpoint, immediately GET the media_url, write the bytes to your own storage, then discard the URL.

A 403 from Instagram on a link you fetched hours after it was issued is the expected outcome, not a fault in the call — the endpoint worked and the link simply aged out. If you need the file again later, call again rather than retrying the stale URL.

8 credits a video adds up — budget it

At 8 credits a video this is one of the more expensive calls in the catalogue, because pulling media costs meaningfully more upstream than reading a page of text. At $0.005 per credit that is 4 cents per video on the monthly plan, 3.6 cents on annual.

So do not use it as a discovery tool. Filter first with the cheap list and stats endpoints, decide which handful of Reels you actually want the file for, and only then call download. Piping a whole channel through it unfiltered means paying 8 credits for every clip, including the ones you would never have watched.

Caching works in your favour here

This endpoint is cached in the near-immutable class, since a given Reel's file does not change. A repeat call for the same post inside the window returns in milliseconds with x-cache: hit — but note that a cached response can carry a media_url that has already expired, because the URL's clock is Instagram's, not ours.

If you get a cache hit and the link 403s, retry with fresh=true to force a new signed URL. Cached and fresh calls both cost 8 credits.

Public posts only, no logged-in session

We read what a logged-out visitor can read. Private accounts, deleted posts, age-gated content and anything geo-restricted from our egress will error rather than return partial data. Failed calls are not charged.

Stories and content behind a follow request are out of scope entirely. There is no flag that changes this.

Downloading is not the same as being allowed to republish

The file you get belongs to whoever made it. Archiving for internal research, analysis or your own back-up is one thing; reposting someone else's Reel to your own account is a copyright question and Instagram's terms apply to you regardless of how the bytes reached your disk. We give you access to public media, not a licence to it.

Questions

How do I download an Instagram Reel with an API?

Send a GET to /v1/instagram/download with the Reel URL and your API key. The response contains media_url, a direct link to the MP4 on Instagram's CDN, which you then fetch with an ordinary HTTP client. There is no OAuth step and no Instagram developer app involved. The Graph API only reaches media on accounts you own and manage, which is why it does not solve this problem for most people.

Why does the Instagram video URL stop working after a while?

Instagram signs its CDN links with a short expiry. The link is valid for minutes, not days, and it is not something we control or can extend. Download the file immediately and keep your own copy. If a stored link has stopped working, call the endpoint again with fresh=true to get a newly signed one rather than retrying the old URL.

How much does one Instagram download call cost?

8 credits per video. Credits are $0.005 each on the monthly plan and $0.0045 on annual, so a download is about 4 cents, or 3.6 cents annually. It is priced above the read endpoints because fetching media costs more upstream. Failed calls — private posts, photo-only posts, deleted content — are never charged.

Can I download Instagram photos or carousels with this?

No. This endpoint resolves a video track and returns nothing when there is not one, so a photo post or an image-only carousel errors out. If you need the still image for a post, the Instagram Stats API returns a thumbnail URL alongside the engagement data, and it costs a small fraction of a download call.

Does it work on private Instagram accounts?

No, and it never will. Everything we read is fetched logged out, exactly as an anonymous visitor sees it. Private accounts, follower-only posts and Stories are unreachable, and calls against them return an error rather than a partial result. That limit is deliberate — we do not log in, hold sessions, or work around access controls.

Is the video watermarked?

You get whatever Instagram serves from its CDN for that post, unmodified. We do not re-encode, strip anything, or add anything. If the creator uploaded a clip that already carried another app's watermark, that watermark is in the file. There is no watermark-removal option on this endpoint.

Can I download a whole account's Reels in one call?

Not in one call — this endpoint takes a single URL and returns a single file link. The usual pattern is two steps: call the Instagram Channel Reels API to list a creator's recent Reels, filter that list down to the ones you actually want, then call download for each. At 8 credits apiece, filtering before you download is worth the extra step.

Related

GET /v1/instagram/channel-reelsGET /v1/instagram/reels-search The whole sheet