---
title: "Instagram Downloader API — Reels, Posts & Stories | FastSaverAPI"
url: https://fastsaverapi.com/instagram-downloader-api/
description: "REST API to download Instagram reels, posts, albums, stories and highlights. One GET request, direct CDN URL and metadata as JSON. No login, cookies or proxies."
updated: 2026-08-10
api_base: https://api.fastsaver.io/v1
site_index: https://fastsaverapi.com/llms.txt
openapi: https://fastsaverapi.com/openapi.json
---

# Instagram downloader API for reels, posts and stories

The Instagram downloader API resolves a public reel, post, carousel, story or highlight
with one GET request. You get a direct CDN URL plus dimensions, duration and the caption —
no login, no cookie jar, no headless browser.

- **Endpoint**: GET /fetch

- **Credits**: 1.5 per post · 5 per story

- **Auth**: X-Api-Key header

- **Returns**: direct CDN URL + metadata

## what the API resolves

One endpoint covers everything public on Instagram. You pass the URL exactly as you copied it
from the app or the browser, and the API works out what kind of media it points at.

- Posts — single photo or video, original resolution, with the caption.
- Reels — the MP4 as uploaded, not a re-encode.
- Albums / carousels — every slide, each with its own URL and dimensions.
- Stories — while they are live, from public accounts.
- Highlights — saved story collections, item by item.

Short links, /p/ , /reel/ , /tv/ and /stories/
paths all work. Query strings such as ?igsh=… are ignored, so you can paste share
links straight from the app.

## the request

A single GET. No body, no SDK, no browser.

GET
https://api.fastsaver.io/v1/fetch
1.5 credits



```
curl "https://api.fastsaver.io/v1/fetch?url=https://www.instagram.com/p/DRsmm9UjKfH/" \
  -H "X-Api-Key: fs_sk_•••••••••••"
```



```
{
  "ok": true,
  "id": "DRsmm9UjKfH",
  "source": "instagram.com",
  "type": "video",
  "download_url": "https://scontent-waw2-1.cdninstagram.com/o1/v/...",
  "thumbnail_url": "https://scontent-waw2-1.cdninstagram.com/v/...",
  "width": 1080,
  "height": 1920,
  "duration": 12,
  "caption": "Ferrari 296 GTS top speed run."
}
```


Remember to URL-encode the url parameter when you build the request in code —
Instagram links carry query strings that will otherwise be read as part of your own.

## the response, field by field

| Field | Type | Notes |
| --- | --- | --- |
| ok | boolean | Always present. false comes with a reason. |
| id | string | Instagram shortcode — a stable key for your own cache. |
| source | string | instagram.com. Useful when one worker handles every platform. |
| type | string | video, image or album. |
| download_url | string | Signed CDN URL. Short-lived — fetch it promptly. |
| thumbnail_url | string | Poster frame, safe to show before the video loads. |
| width / height | integer | Pixel dimensions, so you can size a player without probing the file. |
| duration | integer | Seconds. Absent for images. |
| caption | string | Original caption text. |

Albums are shaped differently: instead of a top-level download_url ,
width and height , the response carries an items array with
one entry per slide, each with its own type , download_url and
thumbnail_url . Branch on type === "album" before you read
download_url , or you will read undefined on every carousel.

## in your language

Nothing here is Instagram-specific beyond the link — the same function works for TikTok,
Pinterest, X, Facebook and RuTube.



```
import requests

API = "https://api.fastsaver.io/v1/fetch"
KEY = "fs_sk_•••••••••••"

def fetch(url: str) -> dict:
    r = requests.get(API, params={"url": url}, headers={"X-Api-Key": KEY}, timeout=60)
    r.raise_for_status()
    data = r.json()
    if not data.get("ok"):
        raise RuntimeError(data.get("detail", "request failed"))
    return data

media = fetch("https://www.instagram.com/reel/DRsmm9UjKfH/")
print(media["type"], media["duration"], media["download_url"])
```



```
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();
if (!data.ok) throw new Error(data.detail ?? 'request failed');
console.log(data.download_url);
```


## limits worth knowing before you build

- Public content only. Private accounts and close-friends stories are out of reach by design.
- CDN URLs expire. Download the bytes in the same job, or re-resolve later.
- Stories are live-only. After 24 hours they are gone unless the account saved them to a highlight.
- Rate limits are per plan — 10 requests per minute on Free, up to 900 on Mega. A 429 means slow down, not that the link is bad.
- Instagram changes things. When it does, we ship the fix on our side; your code keeps calling the same endpoint.

You are responsible for what you do with the media you download. Respect copyright, the
platform's terms and the rights of the person who posted it.

## questions about the Instagram API

**Q: Do I need an Instagram login, cookies or a session ID?**

A: No. You send the post URL and your API key over plain HTTPS. Sessions, proxies and the login wall are handled on our side, which is the entire reason to use a hosted API instead of running instaloader on a box you have to babysit.

**Q: Can it download from private accounts?**

A: No, and it should not. The API only resolves content that is publicly reachable. A post from a private account, a close-friends story or anything behind a follow request returns an error rather than a file.

**Q: How long does a download_url stay valid?**

A: It is a signed URL from Instagram's own CDN and it expires — usually within hours. Fetch the bytes soon after the call, or store the file yourself. Do not persist the URL in a database and expect it to work tomorrow; call /fetch again instead.

**Q: What does an Instagram request cost?**

A: 1.5 credits for a post, reel or album; 5 credits for stories and highlights, which are more expensive to resolve. On the free tier's 1,000 credits that is roughly 660 reels before you pay anything.

**Q: Does it return every image in a carousel?**

A: Yes. A carousel comes back with type: "album" and an items array — one entry per slide, each with its own type and download_url . Note that the top-level download_url is absent on albums, so check type first.

## Keep reading

- TikTok downloader API — same endpoint, no watermark
- Download Instagram reels in Python — guide
- All supported platforms — nine references
- Live playground — run this call in the browser

## Try it against a real reel

Paste a link into the playground and read the JSON before you write a line of code.

Open the playground
Get a free API key
