Instagram Downloader API – Reels, Stories & Highlights avatar

Instagram Downloader API – Reels, Stories & Highlights

Pricing

from $0.40 / 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.40 / 1,000 download requests

Rating

0.0

(0)

Developer

Snapinsta

Snapinsta

Maintained by Community

Actor stats

0

Bookmarked

90

Total users

49

Monthly active users

10 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.
  • Use it as an HTTP API in Standby mode, or run it from the Input form.
  • Built-in Apify authentication, billing, monitoring, and scaling.
  • Schedule runs and connect results to your workflow with Apify scheduling, webhooks, and integrations.

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.

EventPrice per requestPrice per 1,000 requests
Download request$0.0004$0.40

The price is the same on every Apify plan.

A request is charged once, after the media service has given a definitive answer, in either run mode:

  • a successful result, or
  • MEDIA_NOT_AVAILABLE, when the media is private, deleted, expired, or not supported.

Invalid input, readiness checks, unsupported routes, requests blocked by the spending limit, and service-side errors (timeouts, rate limits, upstream failures) are not charged.

Apify platform usage

This Actor uses pay-per-event pricing, so you pay only for the Download request events above. Apify platform usage (compute) is included in the request price and is not billed to you 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
404MEDIA_NOT_AVAILABLEYes
502UPSTREAM_*No
503UPSTREAM_RATE_LIMITEDNo
503BILLING_UNAVAILABLENot confirmed; the charge could not be placed
504UPSTREAM_TIMEOUTNo
500INTERNAL_ERRORNo

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.

In the Input form, MEDIA_NOT_AVAILABLE and invalid URLs are saved as an error item in the dataset and the run still succeeds. Service-side errors fail the run.

The Actor already retries temporary media-service failures once inside a single request. If your application sends a new retry after an error, that retry is a new request.

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.