Instagram Downloader API – Reels, Stories & Highlights
Pricing
from $0.48 / 1,000 download requests
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
5 days ago
Last modified
Categories
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
- Open the Actor's Input tab.
- Paste one public Instagram URL.
- Click Start.
- Open the run's Output tab.
- 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 osimport requestsresponse = 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.
| Mode | Location | Example |
|---|---|---|
| Input run | Input tab | Paste the URL and click Start |
| Standby GET | ?url=... | /api/download?url=INSTAGRAM_URL |
| Standby POST | JSON 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
| Field | Description |
|---|---|
status | true for success and false for an error. |
sourceUrl | Validated and normalized Instagram URL. |
media | One or more resolved media items. |
media[].url | Temporary direct HTTPS media URL. |
media[].thumbnail | HTTPS thumbnail URL, or null. |
media[].fileType | MIME type such as video/mp4 or image/jpeg, or null. |
requestId | ID to include when reporting a failed request. |
How much does it cost?
The billable event is named Download request.
| Apify tier | Price 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 status | Error code | Charged? |
|---|---|---|
| 400 | INVALID_* | No |
| 402 | PAYMENT_LIMIT_REACHED | No |
| 413/415 | REQUEST_TOO_LARGE / UNSUPPORTED_MEDIA_TYPE | No |
| 502 | UPSTREAM_* | Yes |
| 503 | UPSTREAM_RATE_LIMITED | Yes |
| 503 | BILLING_UNAVAILABLE | Not confirmed; media processing is skipped |
| 504 | UPSTREAM_TIMEOUT | Yes |
| 500 | INTERNAL_ERROR | Depends 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.