Instagram Video Downloader API
Pricing
from $1.50 / 1,000 media results
Instagram Video Downloader API
Download public Instagram video, audio, images, carousel media, and post metadata.
Pricing
from $1.50 / 1,000 media results
Rating
0.0
(0)
Developer
LanceAPI
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Paste an Instagram link. Get the media URL and post data your app can use.
Instagram Video Downloader API turns public Reels and posts into download-ready video, audio, image, cover, and carousel URLs—plus the caption, creator, duration, publish date, and available engagement numbers. No browser automation to build. No page HTML to maintain. Just send URLs and get structured JSON back.
This is an unofficial Actor and is not affiliated with, endorsed by, or sponsored by Instagram or Meta.
The quick version
- You send: public Instagram Reel or post URLs.
- You get: direct media links and clean post metadata in JSON.
- You pay for: successful unique results only—never failed URLs or duplicates.
- Price per 1,000 results: Free $2.50 · Starter $2.00 · Scale $1.50 · Business $1.00.
- Batch size: 5 unique URLs on Free runs and up to 100 on paid runs.
- One thing to know: Instagram CDN links expire, so download or copy the files soon after the run.
What you get
- The best available media link for video, audio, image, cover, or carousel content.
- The post context your workflow needs: caption, creator, publish time, duration, and available engagement metrics.
- Cleaner batch jobs: tracking parameters are removed, duplicate posts run once, and one bad URL does not stop the rest.
- Predictable JSON: consistent result objects and fixed engagement keys make integrations easier to maintain.
- Easy automation: call it from the Apify Console, REST API, JavaScript, Python, schedules, webhooks, or an AI agent.
The Actor returns URLs, not hosted copies of the files. If you need permanent storage, download the media into your own bucket or asset library right after the run.
Try it in under a minute
- Click Try for free or Start.
- Paste one or more public Instagram Reel or post URLs.
- Click Start.
- Open Dataset and use the link in
media.videoUrl,media.audioUrl,media.imageUrl, ormedia.items.
Most public posts need nothing else. If Instagram puts a public post behind a login check, you can optionally provide your own session ID for that run.
Example input:
{"urls": ["https://www.instagram.com/p/DbbQB9tCgeO/"]}
The example is ready to run as-is. Swap in your own public post whenever you are ready.
Input reference
| Field | Type | Default | Description |
|---|---|---|---|
urls | array of strings | Required | Public Instagram URLs using /reel/, /reels/, or /p/. Provide at least one URL. The Input Schema accepts up to 100 entries. |
sessionid | string | None | Optional sensitive session value used only for the current run when Instagram places otherwise public content behind a login check. It does not grant access to private content. |
Supported URLs
The Actor accepts:
https://www.instagram.com/reel/SHORTCODE/https://www.instagram.com/USERNAME/reel/SHORTCODE/https://www.instagram.com/reels/SHORTCODE/https://www.instagram.com/p/SHORTCODE/- The same URLs with tracking query parameters such as
?utm_source=...
Supported hosts are instagram.com, www.instagram.com, and m.instagram.com. A /p/ post may contain a video, image, or carousel. Username-prefixed Reel links are normalized to the same canonical Reel URL.
The Actor does not accept profile pages, usernames, Stories, Explore pages, login pages, shortened share redirects, or private posts. Open a share redirect in your browser first and provide the final canonical post or Reel URL.
Batch limits and duplicate handling
- Non-paying runs accept up to 5 unique URLs.
- Paying runs accept up to 100 unique URLs.
- Blank entries are ignored and surrounding whitespace is removed.
- Exact duplicates are removed.
- URLs that differ only by
/reel/versus/reels/, host spelling, or tracking parameters are normalized and processed once. - Each unique input normally creates one Dataset item, including item-level errors.
- Items are processed concurrently, so Dataset order is not guaranteed. Match results using
inputUrlrather than array position. - Exceeding the applicable batch limit stops the run before item processing with
BATCH_LIMIT_EXCEEDED.
The program also recognizes the legacy keys videoUrls, bulkUrls, and videoUrl for existing integrations. New integrations should use urls because it is the documented Input Schema field.
Output reference
A successful Dataset item contains the original URL, canonical URL, content details, media links, author information, engagement metrics, and a null error.
{"success": true,"status": "success","inputUrl": "https://www.instagram.com/p/DbbQB9tCgeO/","normalizedUrl": "https://www.instagram.com/p/DbbQB9tCgeO/","content": {"id": "1234567890123456789_123456789","pk": "1234567890123456789","shortcode": "DbbQB9tCgeO","type": "video","caption": "Example Instagram caption","publishedAt": "2026-01-15T10:30:00.000Z","durationSeconds": 18.4},"media": {"videoUrl": "https://example-cdn.invalid/video.mp4","smallVideoUrl": "https://example-cdn.invalid/video-small.mp4","audioUrl": "https://example-cdn.invalid/audio.mp4","thumbnailUrl": "https://example-cdn.invalid/thumbnail.jpg","mediaUrlsTemporary": true},"author": {"id": "123456789","username": "example_creator","displayName": "Example Creator","avatarUrl": "https://example-cdn.invalid/avatar.jpg","verified": false},"engagement": {"viewCount": 1200,"playCount": 1320,"likeCount": 85,"commentCount": 7,"shareCount": null},"platformData": {"instagram": {"productType": "clips","mediaType": 2}},"error": null}
The example uses placeholder CDN URLs to show the response structure. Real runs return the available URLs supplied for the requested Instagram post.
Top-level fields
| Field | Meaning |
|---|---|
success | true when usable media was resolved; otherwise false. |
status | Stable result category such as success, invalid_url, login_required, private_content, media_not_found, or error. |
inputUrl | The URL supplied by the user. |
normalizedUrl | Canonical Instagram URL without tracking parameters, when normalization succeeds. |
content | Post identity, type, caption, publication time, and duration when available. |
media | Resolved media and thumbnail URLs. |
author | Available creator identity and profile metadata. |
engagement | Stable engagement counters. |
platformData | Small Instagram-specific classification values when available. |
error | null on success; otherwise a safe error object. |
Content fields
| Field | Meaning |
|---|---|
id | Instagram media identifier when supplied. |
pk | Instagram media primary key when supplied. |
shortcode | Shortcode used in the canonical post URL. |
type | Normalized media type: video, image, or carousel. |
caption | Post caption or description when available. |
publishedAt | Publication time as an ISO 8601 timestamp when available. |
durationSeconds | Video duration in seconds, rounded to at most two decimal places. |
Media fields
| Field | Meaning |
|---|---|
videoUrl | Preferred downloadable video URL. |
smallVideoUrl | A smaller video alternative when a genuinely different variant is available. |
audioUrl | Separate audio-track URL when available. |
thumbnailUrl | Cover or preview image URL. |
imageUrl | Downloadable image URL for an image item. |
videoVariants | Additional video variants when the source exposes distinct alternatives. |
items | Normalized child media for a carousel. Each item may contain its own type and media URLs. |
mediaUrlsTemporary | Always true; download URLs are temporary and can expire. |
Optional fields are emitted only when the source provides a real value. Empty videoVariants or items arrays are not added merely as placeholders.
Engagement fields
The engagement object always contains the following five keys:
| Field | Meaning |
|---|---|
viewCount | Independent view count supplied by Instagram, or null. |
playCount | Independent play count supplied by Instagram, or null. |
likeCount | Like count, or null. |
commentCount | Comment count, or null. |
shareCount | Share count, or null. There is no separate switch or charge for this field. |
Unavailable engagement values are returned as null, not copied from another metric, estimated, or replaced with zero. viewCount and playCount may be equal, different, or independently unavailable because they represent separate source fields.
Carousel and image posts
For a carousel, content.type is carousel and the downloadable child media is returned in media.items. Each child is normalized independently and can be a video or image.
For a single image post, content.type is image and the preferred file is normally available in media.imageUrl. Because Instagram can expose different combinations of media fields, integrations should check the relevant URL fields instead of assuming every result contains media.videoUrl.
Download the returned media
The Dataset stores URLs, not the media bytes. To save a returned file, read the appropriate URL from the result and download it promptly. For example:
$curl -L 'RETURNED_MEDIA_URL' -o instagram-media.mp4
Use the correct file extension for the returned media type. Do not treat a CDN URL as a permanent identifier or publish it as a long-lived link.
Status and error handling
| Status | Meaning |
|---|---|
success | At least one usable media URL was resolved. |
invalid_url | The input is malformed or is not a supported Instagram post/Reel URL. |
login_required | Instagram placed the requested public page behind a login check. |
private_content | The content is private or otherwise inaccessible. |
media_not_found | No usable video, audio, or image source was found. |
error | Another item-level or temporary error occurred. Inspect error.code and error.retryable. |
Failed result example:
{"success": false,"status": "media_not_found","inputUrl": "https://www.instagram.com/reel/EXAMPLE/","normalizedUrl": "https://www.instagram.com/reel/EXAMPLE/","content": {},"media": {},"author": {},"engagement": {"viewCount": null,"playCount": null,"likeCount": null,"commentCount": null,"shareCount": null},"platformData": {"instagram": {}},"error": {"code": "MEDIA_NOT_FOUND","message": "Media was not found.","retryable": false}}
If error.retryable is true, retry the URL later. A valid public post can be temporarily unavailable because of rate limits, login gating, regional or age restrictions, CDN changes, or changes to the page response.
Item-level failures do not stop other URLs in the batch. Top-level input errors such as empty input or an exceeded batch limit stop the run before Dataset processing.
Run with JavaScript
Install the Apify API client:
$npm install apify-client
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const input = {urls: ['https://www.instagram.com/p/DbbQB9tCgeO/'],};const run = await client.actor('lance_api/instagram-video-downloader-api').call(input);const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Run with Python
Install the Apify API client:
$pip install apify-client
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run_input = {'urls': ['https://www.instagram.com/p/DbbQB9tCgeO/'],}run = client.actor('lance_api/instagram-video-downloader-api').call(run_input=run_input)items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
Run with cURL
The synchronous endpoint starts the Actor, waits for completion, and returns Dataset items:
curl -X POST \'https://api.apify.com/v2/acts/lance_api~instagram-video-downloader-api/run-sync-get-dataset-items' \-H 'Authorization: Bearer APIFY_TOKEN' \-H 'Content-Type: application/json' \-d '{"urls": ["https://www.instagram.com/p/DbbQB9tCgeO/"]}'
For long or large batches, use the asynchronous Run Actor endpoint and retrieve the Dataset after the run finishes. Keep API tokens out of source control, screenshots, prompts, and logs.
Use with AI agents through MCP
After publication, MCP-compatible AI clients can discover and run this Actor through the hosted Apify MCP server.
- Connect the client to
https://mcp.apify.comusing Streamable HTTP. - Authenticate with Apify using your client's supported OAuth or API-token method.
- Ask the agent to find and run
lance_api/instagram-video-downloader-api. - Provide individual public Instagram post or Reel URLs and ask the agent to retrieve the Dataset output.
Common MCP tools are search-actors, fetch-actor-details, and call-actor. Running an Actor and reading its storage requires authentication.
Example agent request:
Run lance_api/instagram-video-downloader-api for this public Instagram Reel and return the downloadable video URL, caption, author, duration, and engagement metadata.
Pricing
Pay only for successful, unique results. Your price automatically drops with your Apify plan:
| Apify plan | Price per 1,000 successful results | Price per result |
|---|---|---|
| Free | $2.50 | $0.0025 |
| Starter | $2.00 | $0.0020 |
| Scale | $1.80 | $0.0018 |
| Business | $1.50 | $0.0015 |
One result can include a video, a separate audio track, a cover image, or multiple carousel items. You still pay for one result, not for every file inside it.
Failed URLs, unsupported URLs, and duplicates removed before processing do not trigger a media-result charge. Apify may separately show its standard Actor-start event in the run pricing.
Use cases
- Pull Reels into an editing, clipping, or repurposing workflow
- Save approved social assets to your own media library
- Feed videos and captions into AI analysis or moderation pipelines
- Collect post metadata for creator, campaign, or content research
- Grab covers, audio tracks, and carousel assets without manual downloading
- Power no-code automations, internal tools, and AI agents with clean Instagram data
Limits and practical notes
- Public Instagram posts and Reels only; profile and profile-post collection are not included.
- Private posts, removed posts, Stories, login pages, and unsupported redirect/share URLs cannot be downloaded.
- An optional session ID may help with a login check on public content but must not be used to bypass access controls or retrieve private content.
- Metadata is best effort. Instagram may omit captions, counters, author fields, audio tracks, or alternative media variants.
- Download URLs are temporary and may stop working after the run.
- Instagram can rate-limit requests, change page data, or temporarily withhold media URLs.
- Dataset item order is not guaranteed for batches.
- No permanent file hosting, profile scraping, comment-list scraping, or historical engagement tracking is included.
Responsible use
Use this Actor only for content you are legally permitted to access, download, and process. Respect privacy, copyright, contractual restrictions, Instagram's terms, and applicable laws. Do not use session credentials to access private content, bypass access controls, or process another person's account without authorization.
Never publish, log, email, or include an Instagram session ID or Apify API token in a support request. Rotate any credential immediately if it is exposed.
Related Actor
Need searchable speech instead of only media links? Use Instagram Video AI Transcript Scraper API to generate plain text, timestamped segments, SRT, WebVTT, and optional translations from individual public Instagram videos:
lance_api/instagram-video-ai-transcript-scraper-api
FAQ
Does this Actor save files to Apify storage?
No. It returns temporary downloadable URLs in the Dataset. Your application must download and store the files if permanent retention is required.
Why did a valid-looking URL fail?
The post may be private, removed, image-only with unavailable image data, region- or age-restricted, temporarily rate-limited, or placed behind a login check. Confirm that the final canonical URL opens publicly in a logged-out browser and retry later when error.retryable is true.
Why is the caption or another metadata field missing?
Instagram may not expose every field in every response. Optional content, media, and author fields are omitted when unavailable rather than populated with invented values.
Why are viewCount and playCount equal?
They are independent source values and are never copied from one another. Instagram can report the same number for both, different numbers, or omit either value.
Is shareCount charged separately?
No. It is returned whenever available and otherwise set to null. There is no share-count option or separate fee.
Are duplicate URLs returned or charged twice?
No. Canonical duplicates are processed once. Tracking parameters, equivalent Reel path variants, and supported host variants do not create additional results or charges.
Why are videoVariants or carousel items missing?
Those fields appear only when Instagram exposes genuine alternatives. Empty arrays are not returned as processing diagnostics.
Can I download every file from a carousel?
When carousel children are available, they are returned in media.items. Check each child object's type, videoUrl, and imageUrl fields.
Does the Actor scrape profiles, feeds, Stories, or comments?
No. It accepts individual public post and Reel URLs. It returns an available comment count, but it does not download comment bodies or expand profile feeds.
How should I handle temporary download URLs?
Download the files immediately after the run and store them in storage you control. Do not rely on Instagram CDN URLs remaining valid.
Support
For help, open an issue on the Actor page or email lanceapi2026@hotmail.com.
Include the Actor run ID, the input URL with unnecessary query parameters removed, the expected behavior, the actual status and error.code, and a short reproducible description. Never send Apify tokens, Instagram session IDs, passwords, cookies, or other credentials.