Instagram Downloader API: Reels, Photos and Carousels

Instagram posts come in three shapes: a Reel, a photo, or a carousel of up to twenty. The FastSaver API fetches all three with the same GET. The type field tells you which one you got.

auth and the call

Send your key as an X-Api-Key header. Keys come from api.fastsaver.io; the getting started guide covers key handling.

curl "https://api.fastsaver.io/v1/fetch?url=https%3A%2F%2Fwww.instagram.com%2Freel%2FDRVO0TKkWPD%2F" \
  -H "X-Api-Key: YOUR_KEY"
const res = await fetch(
  'https://api.fastsaver.io/v1/fetch?url=' + encodeURIComponent(link),
  { headers: { 'X-Api-Key': process.env.FASTSAVER_KEY } }
);
const data = await res.json();
r = requests.get(
    'https://api.fastsaver.io/v1/fetch',
    params={'url': link},
    headers={'X-Api-Key': os.environ['FASTSAVER_KEY']},
)
data = r.json()

Reel links and /p/ post links go through the same endpoint. You never detect the post type up front; the response tells you.

reels and photos

{
  "ok": true,
  "id": "DRVO0TKkWPD",
  "source": "instagram",
  "type": "video",
  "download_url": "https://…/reel.mp4",
  "thumbnail_url": "https://…/cover.jpg",
  "width": 1080,
  "height": 1920,
  "duration": 31,
  "caption": "golden hour in lisbon"
}

type "video" means one MP4 in download_url: the source file, nothing re-encoded. A feed video comes back the same way. A photo post has type "image", a jpg in download_url, and no duration. That is the whole branch your code needs.

carousels

{
  "ok": true,
  "source": "instagram",
  "type": "album",
  "caption": "porto in five frames",
  "thumbnail_url": "https://…/cover.jpg",
  "items": [
    { "type": "image", "download_url": "https://…/1.jpg", "thumbnail_url": "https://…/1_t.jpg", "width": 1080, "height": 1350 },
    { "type": "video", "download_url": "https://…/2.mp4", "thumbnail_url": "https://…/2_t.jpg", "width": 1080, "height": 1350 }
  ]
}

type "album", one items[] entry per slide, in app order, so index 0 is the cover slide. Two rules save you real bugs. Check type per item, not per post; mixed photo and video albums are normal. And use each item’s thumbnail_url to render a picker, so users choose slides before you download twenty files.

Download and thumbnail links are short-lived. Fetch the files when the response arrives and store them. Need the media again later? Re-fetch the post instead of hoarding links.

errors

Failures return a small JSON body instead of media. Branch on ok, show detail.

{ "ok": false, "detail": "fetch.failed" }
  • 401: missing or wrong key.
  • 400: bad url, or no credits left.
  • 429: too many requests this minute. Wait, then retry.
  • fetch.failed: private account, Story, or deleted post. Not worth a retry loop. Tell the user.

Of every platform FastSaver supports, Instagram breaks the most often. It ships anti-scraping changes constantly, and every downloader on the internet plays catch-up, ours included. Expect occasional windows where Instagram fetches degrade while the extractor is updated. Build for it: retry a failed fetch once, then surface the error instead of looping. Monitor your error rate rather than assuming up or down. Nobody can promise 100% on Instagram. A vendor who does is lying to you.

credits and pricing

1,000 free credits on every new key, then paid plans from $9/month (pricing). Saving one Reel for yourself? Skip all this and use the web downloader; there are short guides for Reels and photos. The API is for building: bots, archives, content pipelines. Ideas in what to build.

frequently asked questions

How do I tell a Reel from a photo post in the response?
Check type. A Reel is type "video" with a duration and an MP4 in download_url. A photo post is type "image" with a jpg and no duration.
How do Instagram carousels come back?
As type "album" with one items[] entry per slide, each carrying its own type, download_url and thumbnail_url. Mixed photo and video albums are normal, so branch per item.
What happens when a post is private or deleted?
You get ok false with detail fetch.failed. Public posts only. There is no workaround, by design.
Can I store the returned URLs and download later?
No. Download and thumbnail links are short-lived. Fetch the files when you get the response, and re-fetch the post if you need them again.