Instagram Downloader API – Reels, Stories & Highlights avatar

Instagram Downloader API – Reels, Stories & Highlights

Pricing

from $0.48 / 1,000 download requests

Go to Apify Store
Instagram Downloader API – Reels, Stories & Highlights

Instagram Downloader API – Reels, Stories & Highlights

Instagram downloader API for public Reels, videos, photos, Stories, Highlights, and carousels. Get direct media links in clean JSON without login.

Pricing

from $0.48 / 1,000 download requests

Rating

0.0

(0)

Developer

Snapinsta

Snapinsta

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

5 days ago

Last modified

Share

What does Instagram Downloader API do?

Instagram downloader API for public Reels, videos, photos, Stories, Highlights, and carousels. Get direct media links in clean JSON without login.

Send one public Instagram URL and receive direct media URLs, thumbnails, and file types. Use the simple Actor Input form or call the low-latency Standby API.

Why use Instagram Downloader API?

  • One stable response format for supported Instagram media.
  • No Instagram username, password, cookie, or login required.
  • Built-in Apify authentication, billing, monitoring, and scaling.

How to use Instagram Downloader API

Input form

  1. Open the Actor's Input tab.
  2. Paste one public Instagram URL.
  3. Click Start.
  4. Open the run's Output tab.
  5. Switch between Table and JSON, or export the result.

The Input form processes one URL per run. No Instagram login or API token field is required.

Standby API

Base URL:

https://snapinsta--instagram-downloader-api.apify.actor

Use your Apify API token as a Bearer token:

Authorization: Bearer YOUR_APIFY_TOKEN

You can test both endpoints from the Actor's Endpoints tab. Apify adds authentication automatically when you use the interactive API form.

GET request

curl --get \
"https://snapinsta--instagram-downloader-api.apify.actor/api/download" \
-H "Authorization: Bearer YOUR_APIFY_TOKEN" \
--data-urlencode "url=https://www.instagram.com/reel/SHORTCODE/"

POST request

curl -X POST \
"https://snapinsta--instagram-downloader-api.apify.actor/api/download" \
-H "Authorization: Bearer YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"url":"https://www.instagram.com/reel/SHORTCODE/"}'

GET and POST return the same response. POST is usually easier for backend applications.

Node.js

const response = await fetch('https://snapinsta--instagram-downloader-api.apify.actor/api/download', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.APIFY_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
url: 'https://www.instagram.com/reel/SHORTCODE/',
}),
});
const result = await response.json();
if (!response.ok) {
throw new Error(`${result.error.code}: ${result.error.message}`);
}

Python

import os
import requests
response = requests.post(
"https://snapinsta--instagram-downloader-api.apify.actor/api/download",
headers={"Authorization": f"Bearer {os.environ['APIFY_TOKEN']}"},
json={"url": "https://www.instagram.com/reel/SHORTCODE/"},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(f"{result['error']['code']}: {result['error']['message']}")

Keep the Apify token on your server. Do not place it in browser JavaScript, mobile apps, public repositories, or URLs.

Input

Both run modes accept exactly one value: url.

ModeLocationExample
Input runInput tabPaste the URL and click Start
Standby GET?url=.../api/download?url=INSTAGRAM_URL
Standby POSTJSON body{"url":"https://instagram.com/..."}

Supported public URL formats include:

  • Posts: https://www.instagram.com/p/SHORTCODE/
  • Reels: https://www.instagram.com/reel/SHORTCODE/
  • Profile-prefixed media: https://www.instagram.com/USERNAME/reel/SHORTCODE/
  • Stories: https://www.instagram.com/stories/USERNAME/STORY_ID/
  • Highlights: https://www.instagram.com/stories/highlights/HIGHLIGHT_ID/

The equivalent /reels/ and /tv/ media paths are also accepted. Private, deleted, expired, age-restricted, or region-restricted content may not resolve.

Output

Successful response:

{
"status": true,
"sourceUrl": "https://www.instagram.com/reel/SHORTCODE/",
"media": [
{
"url": "https://cdn.example/video.mp4",
"thumbnail": "https://cdn.example/thumbnail.jpg",
"fileType": "video/mp4"
}
],
"requestId": "8c38bd30-93e1-4578-9107-5a6de616daf0"
}

Error response:

{
"status": false,
"error": {
"code": "INVALID_INSTAGRAM_URL",
"message": "Provide a supported public Instagram URL.",
"requestId": "d8abfca0-07cc-436c-826e-8b07902c3fd2"
}
}

Input-form runs save one row to the run's default dataset. The Output tab shows the same result in Table and JSON views, and Apify can export it as JSON, CSV, Excel, XML, or RSS. Standby API requests return the result directly over HTTP. Neither mode downloads, stores, or hosts the media files themselves.

fileType is the media item's MIME type. Common values are video/mp4 for videos and image/jpeg for photos. A carousel can return multiple items with different file types.

Data table

FieldDescription
statustrue for success and false for an error.
sourceUrlValidated and normalized Instagram URL.
mediaOne or more resolved media items.
media[].urlTemporary direct HTTPS media URL.
media[].thumbnailHTTPS thumbnail URL, or null.
media[].fileTypeMIME type such as video/mp4 or image/jpeg, or null.
requestIdID to include when reporting a failed request.

How much does it cost?

The billable event is named Download request.

Apify tierPrice per 1,000 accepted requests
Free$1.20
Starter$0.60
Scale$0.54
Business$0.48

A valid URL is charged once before media processing begins in either run mode. It remains charged if processing later fails. Invalid input, readiness checks, unsupported routes, and requests blocked by the spending limit are not charged. Apify platform usage may be charged separately.

The Actor page's Pricing section is the source of truth for current prices.

Tips and error handling

HTTP statusError codeCharged?
400INVALID_*No
402PAYMENT_LIMIT_REACHEDNo
413/415REQUEST_TOO_LARGE / UNSUPPORTED_MEDIA_TYPENo
502UPSTREAM_*Yes
503UPSTREAM_RATE_LIMITEDYes
503BILLING_UNAVAILABLENot confirmed; media processing is skipped
504UPSTREAM_TIMEOUTYes
500INTERNAL_ERRORDepends on when the error occurred

Every error contains a stable error.code, safe error.message, and requestId. Use the code in application logic and keep the request ID for support.

The Actor already retries temporary media-service failures inside one accepted request. If your application sends a new retry, that retry is a new request and may be charged again.

FAQ, disclaimers, and support

Are Instagram credentials required? No. Never submit Instagram credentials.

Can I use the API from a frontend? No. Use your backend so the Apify token remains private.

Are direct media URLs permanent? No. Download or process returned URLs promptly because they can expire.

Only process content you own, have permission to use, or are otherwise legally authorized to access. Users are responsible for copyright, privacy, platform terms, and content-owner rights. This Actor is not affiliated with, sponsored by, or endorsed by Instagram or Meta.

For help, open the Actor's Issues tab and include the requestId. Never include API tokens or credentials.