Instagram Reels Downloader – Video, Audio & Metadata
Pricing
from $1.50 / 1,000 reels
Instagram Reels Downloader – Video, Audio & Metadata
Download public Instagram Reels in bulk with direct video, audio, and cover URLs. Extract captions, creator details, duration, publish date, and engagement metadata. Fast batch API for developers, automation, AI agents, and data workflows.
Pricing
from $1.50 / 1,000 reels
Rating
5.0
(2)
Developer
LanceAPI
Maintained by CommunityActor stats
0
Bookmarked
104
Total users
42
Monthly active users
2 days ago
Last modified
Categories
Share
Instagram Reels Downloader API – Download Reels & Extract Metadata
Paste one Reel, a full URL batch, an Instagram Profile, or a Music / Audio URL. Get download-ready media URLs and clean JSON in seconds.
Instagram Reels Downloader is a fast, batch-ready API for downloading public Instagram Reels and extracting Reel metadata. Send individual Reel/Post URLs, public Instagram Profiles, or Instagram Music / Audio inputs and receive the best available video, audio, image, and cover URLs, plus captions, creator details, duration, publish date, and available engagement numbers. No browser automation to build. No page HTML to maintain. Just clean, structured results your app can use.
This Actor is purpose-built for Reel URLs and Reels workflows. Compatible public Instagram video and carousel posts are also supported, but Reels remain the product's primary focus.
This is an unofficial Actor and is not affiliated with, endorsed by, or sponsored by Instagram or Meta.
The quick version
- You send: individual public Reel/Post URLs, public Profile usernames or URLs, Instagram Reels Audio URLs, Music IDs, or a mix.
- You get: direct video, audio, and cover links with clean Reel 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.80 · Business $1.50.
- Free vs. paid plans: Both Free and paid runs use the same robust media-resolution flow and the same batch capacity for eligible public Reels. Paid plans provide lower per-result pricing.
- Batch size: up to 200 unique direct URLs or Music / Audio inputs per run on every plan; Profile and Music modes return up to the selected per-input limit.
- Optional enhanced mode: if regular resolution fails, one additional recovery method can be tried. It is a low-frequency event because regular mode handles most eligible public Reels. A successful enhanced recovery costs an extra $0.005 per result; an unsuccessful attempt is not charged.
- Recovery-first results: when regular recovery is needed, the Actor prioritizes returning a usable download. Some optional metadata may be unavailable when the source does not provide it.
- One thing to know: Instagram CDN links expire, so download or copy the files soon after the run.
What you get
- The best available Reel media links for video, separate audio, and cover images.
- The Reel context your workflow needs: caption, creator, publish time, duration, and available engagement metrics.
- Fast batch processing: submit up to 200 unique URLs per run instead of downloading Reels one by one.
- Profile Mode: collect either all recent public media or only Reels from usernames,
@usernames, or Profile URLs. - Music / Audio Mode: discover public Reels that use a specific licensed music track or original audio.
- 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 public Instagram Reel URL or a batch of Reel URLs.
- Click Start.
- Open Dataset and use the link in
media.videoUrl,media.audioUrl,media.imageUrl, ormedia.items.
Most public Reels need nothing else. If Instagram puts public content behind a login check, you can optionally provide your own session ID for that run.
Example input:
{"urls": ["https://www.instagram.com/reel/DaQu2LjPIKF/"]}
The example is ready to run as-is. Swap in your own public Reel whenever you are ready.
Existing urls integrations continue to work without changes.
Profile example:
{"profiles": ["instagram","@example_creator","https://www.instagram.com/example/"],"profileContentType": "all_posts","profileResultsLimit": 12}
Mixed example:
{"urls": ["https://www.instagram.com/reel/SHORTCODE/"],"profiles": ["instagram"],"profileResultsLimit": 12}
Music / Audio example:
{"music": ["https://www.instagram.com/reels/audio/1005688403740006/"],"musicResultsLimit": 20}
You can also provide the numeric Music ID directly:
{"music": ["1005688403740006"]}
Input reference
| Field | Type | Default | Description |
|---|---|---|---|
urls | array of strings | Optional | Public Instagram Reel URLs using /reel/ or /reels/, and compatible /p/ posts. Profile URLs, usernames, and @usernames entered here are detected automatically and use the Profile settings below. Up to 200 unique Post/Reel and Profile inputs combined per run. |
profiles | array of strings | Optional | Instagram usernames, @usernames, or Profile URLs. Equivalent forms are normalized and processed once. |
profileContentType | string | all_posts | Use all_posts for recent public posts, Reels, and carousels, or reels to collect only Reels from the Profile's Reel feed. |
profileResultsLimit | integer | 12 | Maximum successful unique results returned per Profile. Minimum 1, maximum 100. |
music | array of strings | Optional | Instagram Reels Audio URLs or numeric Music IDs. Each input can return multiple public Reels using that audio. Up to 200 inputs. |
musicResultsLimit | integer | 20 | Maximum successful unique Reel/audio usage results returned per Music / Audio input. Minimum 1, maximum 100. |
enhancedMode | boolean | false | Optional. When enabled, the Actor tries an additional recovery method only if regular resolution fails. A successful enhanced recovery adds a $0.005 charge; failed enhanced attempts are free. |
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.
Profile URLs, including /username/reels/, as well as bare usernames and @usernames, can be entered in either urls or profiles. They automatically use Profile mode and profileResultsLimit; a /username/reels/ URL selects Reels only, while a standard Profile URL or username uses profileContentType. The same username is processed once across both fields; an explicit profiles entry takes precedence.
Stories, Explore/discovery feeds, login pages, shortened share redirects, and private posts are not supported here. For Explore, hashtag, or location pages, open an individual Post/Reel and copy its URL. Open a share redirect in your browser first and provide the final canonical post or Reel URL.
Supported Profile inputs
instagram@instagramhttps://www.instagram.com/instagram/
Profile Mode defaults to all_posts, which preserves the existing behavior and returns recent public image posts, video posts/Reels, and carousels. Set profileContentType to reels when you need only Reels; this mode follows the Profile's dedicated Reel feed and continues through available pages until it reaches your result limit or the feed ends. Private, removed, or unavailable Profiles do not produce billable media results.
Music / Audio Mode
Discover public Instagram Reels that use a specific Music track or Original Audio.
Provide an Instagram Reels Audio URL or numeric Music ID, and the Actor returns individual public Reel records that use that audio. Each Reel is saved as a separate Dataset item and may include:
- Reel URL and shortcode
- Video, separate Reel audio, and thumbnail URLs
- Caption and author information
- Available engagement metrics
- Music or original-audio metadata
- Audio asset ID, audio cluster ID, and music canonical ID when available
- Original sound metadata when applicable
Supported inputs include https://www.instagram.com/reels/audio/MUSIC_ID/ and a numeric Music ID. Music Mode does not use Enhanced Mode. Music metadata belongs to platformData.instagram.music; media.audioUrl remains the audio stream of the individual Reel.
Music / Audio results and billing
A single Instagram Music or Audio URL can return multiple Reels. Billing is based on the number of successful unique results saved to the Dataset, not on the number of input URLs or upstream API requests.
For example:
- 1 Music / Audio URL is provided
- 50 unique public Reels using that audio are found
- 50 results are saved to the Dataset
- 50 result events are charged
Failed results, duplicate Reels, and records that are not saved to the Dataset are not charged.
With musicResultsLimit: 100, 100 unique saved Reels produce 100 Dataset results and 100 billable results. If only 37 public Reels are available, the run returns and charges 37. If no valid result is saved, there is no result charge. With three Music inputs and musicResultsLimit: 50, the theoretical maximum is 150 results before cross-input deduplication.
Example requesting up to 100 Reels for one audio:
{"music": ["https://www.instagram.com/reels/audio/1005688403740006/"],"musicResultsLimit": 100}
Batch limits and duplicate handling
- Every plan accepts up to 200 unique URLs per run.
- 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 direct URL normally creates one Dataset item, including item-level errors. One Profile can create multiple Dataset items, up to
profileResultsLimit. - 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/reel/DaQu2LjPIKF/","normalizedUrl": "https://www.instagram.com/reel/DaQu2LjPIKF/","content": {"id": "1234567890123456789_123456789","pk": "1234567890123456789","shortcode": "DaQu2LjPIKF","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/reel/DaQu2LjPIKF/'],};const run = await client.actor('lance_api/instagram-reels-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/reel/DaQu2LjPIKF/'],}run = client.actor('lance_api/instagram-reels-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-reels-downloader-api/run-sync-get-dataset-items' \-H 'Authorization: Bearer APIFY_TOKEN' \-H 'Content-Type: application/json' \-d '{"urls": ["https://www.instagram.com/reel/DaQu2LjPIKF/"]}'
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-reels-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-reels-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, Music metadata, or multiple carousel items. You still pay for one result, not for every file inside it. Profile and Music provider requests are not billed as media results: charges are based on successful unique media saved to the Dataset. One Post, Reel, carousel, or Reel discovered through Music Mode equals one result.
Failed or unsupported inputs, duplicate Reels, and results that are not saved do not trigger a media-result charge. Apify may separately show its standard Actor-start event in the run pricing.
Enhanced mode is optional and off by default. Regular mode resolves the large majority of eligible public Reels. If enhanced mode is enabled, it runs only after regular resolution fails and adds $0.005 for each result it successfully recovers. If enhanced recovery also fails, there is no enhanced-result charge. A recovered result still receives the normal successful-result charge in addition to the enhanced-mode charge.
Free and paid runs use the same robust media-resolution flow and the same batch capacity for eligible public Reels. Paid plans provide lower per-result pricing. Invalid, private, and confirmed removed content remains unsupported on every plan.
For recovered Reels, downloadable media is prioritized. Optional metadata can be null when the available source does not return that field.
Use cases
- Build a searchable collection of viral or high-performing Reels
- Monitor creators, competitors, campaigns, and short-form content trends
- Feed Reel videos and captions into AI analysis, moderation, or classification pipelines
- Collect Reel metadata for social media research and reporting
- Pull Reels into editing, clipping, localization, or repurposing workflows
- Power Reels-focused datasets, no-code automations, internal tools, and AI agents
Built for Instagram Reels workflows
Use this Actor as an Instagram Reels Downloader API, an Instagram Reel URL extractor, or a lightweight Instagram Reels scraper for individual URLs and batches. The workflow stays simple: Reel URL → downloadable video or audio URL → caption, author, duration, and engagement metadata → your storage, analysis, or automation pipeline.
It provides the core of an Instagram Reel Downloader: submit URLs, download Instagram Reels through temporary direct media links, and collect structured Instagram Reels metadata in one request. It works well for developers building a Reel video downloader, creator-monitoring workflow, short-video dataset, competitive research tool, or AI content-analysis system. Results are structured for APIs and automation rather than manual browser downloads.
Reels-focused or general-purpose?
Choose this Actor when your workflow centers on Instagram Reels, Reel metadata, creator monitoring, or short-form video analysis. If you need a broader tool positioned around general Instagram videos and media-processing infrastructure, use Instagram Video Downloader API instead. Both Actors use the same proven media-resolution foundation but serve different search intent and workflow needs.
Limits and practical notes
- Public Instagram posts, Reels, and recent public Profile media are supported.
- 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.
- A separate Reel audio track is returned only when available. Song information, when present, stays in
platformData.instagram.music; it does not replace the Reel's own audio. Available audio/mute flags are recorded inplatformData.instagram.hasAudioandaudioMuted. - 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, comment-list scraping, follower/following collection, 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 Actors
Need a general-purpose Instagram video downloader for broader video, post, media-archiving, and processing workflows? Use:
lance_api/instagram-video-downloader-api
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, Stories, or comments?
It can collect recent public media from Profile usernames or URLs; Profile URLs, usernames, and @usernames entered in urls are recognized automatically. For a dedicated Profile workflow, use Instagram Profile Posts & Reels Scraper.
For currently active Stories, use Instagram Stories Scraper with the profile username in its usernames field, not a Story URL. This Actor does not collect Stories, comment bodies, follower/following lists, or an unlimited historical archive.
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.