Instagram Public Media Downloader avatar

Instagram Public Media Downloader

Pricing

from $2.11 / 1,000 item extracteds

Go to Apify Store
Instagram Public Media Downloader

Instagram Public Media Downloader

Download authorized media from anonymous public Instagram posts and Reels into Apify storage with creator, format, byte size, and retrieval metadata.

Pricing

from $2.11 / 1,000 item extracteds

Rating

0.0

(0)

Developer

Automation Lab

Automation Lab

Maintained by Community

Actor stats

0

Bookmarked

20

Total users

10

Monthly active users

2 days ago

Last modified

Share

Download authorized images and videos from anonymous public Instagram post and Reel URLs into Apify storage. This Instagram media downloader returns one typed dataset row per stored file, including the source post, creator, format, dimensions, byte size, storage key, and retrieval URL.

Use it for creator-owned backups, approved campaign archiving, media asset handoff, and repeatable public-content preservation. No Instagram login, cookies, or account credentials are accepted.

What does Instagram Public Media Downloader do?

The Actor opens each supplied public /p/ or /reel/ URL in a resource-efficient browser, reads Instagram's structured public page data, downloads each exposed media asset, and stores it in the run's default key-value store.

It supports:

  • public image posts;
  • public Reel videos;
  • public carousel posts with multiple image or video children;
  • batches of up to 10 supplied URLs;
  • a maximum of 50 downloaded files per run;
  • direct access or Apify datacenter proxy access;
  • one metadata row for every successfully stored file.

It does not discover posts by username, hashtag, or keyword. Supply the exact public URLs you are authorized to archive.

Who is it for?

Creators and social teams

Back up your own published post and Reel assets into durable run storage before repurposing or cataloging them.

Agencies and campaign operators

Archive approved client deliverables with source URLs, creator identity, file format, dimensions, and retrieval timestamps.

Data engineers

Schedule URL batches, consume typed dataset rows, and copy stored files into a longer-lived object store or media pipeline.

Researchers and archivists

Preserve authorized anonymous public media together with provenance instead of keeping only temporary CDN links.

Why use this Actor?

A copied Instagram CDN URL is temporary and difficult to audit later. This Actor pairs every downloaded file with source and retrieval metadata.

Key differences from a metadata-only scraper:

  • files are downloaded, not merely linked;
  • carousel children become separate stored assets;
  • each file has a byte count and MIME format;
  • dataset rows link to both the Instagram source and Apify storage;
  • failed URLs are not charged as media files;
  • partial batches fail visibly by default, or can complete successfully with structured failure reporting when you opt in.

Getting started

  1. Open the Actor input page.
  2. Add one or more public Instagram post or Reel URLs.
  3. Set maxItems to the maximum number of media files to store.
  4. Keep Apify Proxy enabled for the normal cloud workflow.
  5. Start the run.
  6. Open Downloaded media metadata for dataset rows.
  7. Open Downloaded files to retrieve images and MP4 files.

A Reel can produce one file. A carousel can produce several files, subject to maxItems.

Input parameters

FieldTypeDefaultDescription
startUrlsarrayrequiredOne to ten public instagram.com/p/... or instagram.com/reel/... URLs.
maxItemsinteger10Maximum stored assets and dataset rows, from 1 to 50.
failOnErrorbooleantruePreserve the existing run-level failure behavior. Set to false to let a mixed batch succeed when at least one file is stored and receive a structured PARTIAL_FAILURES report.
proxyConfigurationobjectApify Proxy enabledUse the default datacenter proxy or explicitly disable proxy access.

Duplicate URLs with the same shortcode are processed once. Query parameters and tracking fragments are removed during normalization. Profile pages, Stories, private posts, login-only pages, and non-Instagram domains fail validation or extraction.

Example: download a public Instagram Reel

{
"startUrls": [
{ "url": "https://www.instagram.com/reel/Dbn-XJhk0_-/" }
],
"maxItems": 1,
"proxyConfiguration": { "useApifyProxy": true }
}

This workflow stores the public Reel video as an MP4 and emits one metadata row.

Example: archive a carousel post

{
"startUrls": [
{ "url": "https://www.instagram.com/p/DbtErSrlB2J/" }
],
"maxItems": 2,
"proxyConfiguration": { "useApifyProxy": true }
}

Set maxItems high enough for the number of carousel children you need. The Actor stops cleanly when the limit is reached.

Example: recurring creator backup workflow

{
"startUrls": [
{ "url": "https://www.instagram.com/reel/Dbn-XJhk0_-/" },
{ "url": "https://www.instagram.com/p/DbtErSrlB2J/" }
],
"maxItems": 3,
"failOnError": false,
"proxyConfiguration": { "useApifyProxy": true }
}

With failOnError: false, a scheduled mixed batch completes when at least one file is stored. Open the PARTIAL_FAILURES key-value-store record to inspect failed inputUrl, canonicalUrl, shortcode, and sanitized error fields. If every URL fails, the run still fails.

Save a Task with this input, update its supplied URLs as the creator approves new assets, and schedule the Task. Export dataset rows to your catalog and copy files to long-term storage if your retention requirements exceed normal Apify storage retention.

Output fields

Each default-dataset row represents one successfully stored media file.

FieldMeaning
inputUrlOriginal URL supplied by the user.
canonicalUrlNormalized Instagram post or Reel URL.
shortcodeInstagram public content shortcode.
postIdInstagram post identifier when exposed.
contentTypepost, reel, or carousel.
captionPublic caption when exposed.
publishedAtPublic publication timestamp when exposed.
creatorPublic creator ID, username, display name, and profile URL.
assetIndexOne-based position of this asset in the post.
assetIdInstagram asset identifier when exposed.
formatimage or video.
contentTypeHeaderStored MIME type such as image/jpeg or video/mp4.
fileExtensionFilename extension selected from the response type.
byteSizeActual downloaded bytes.
width, heightMedia dimensions when exposed.
durationSecondsVideo duration when exposed.
storageKeyRecord key in the run key-value store.
storageUrlAPI URL for the stored media record.
sourceMediaUrlTemporary Instagram CDN URL used during retrieval.
retrievedAtISO 8601 download timestamp.

Example output

{
"inputUrl": "https://www.instagram.com/reel/Dbn-XJhk0_-/",
"canonicalUrl": "https://www.instagram.com/reel/Dbn-XJhk0_-/",
"shortcode": "Dbn-XJhk0_-",
"postId": "3956405067326902270",
"contentType": "reel",
"caption": "Lunar landers, assemble.",
"publishedAt": "2026-08-04T16:18:15.000Z",
"creator": {
"id": "528817151",
"username": "nasa",
"fullName": "NASA",
"profileUrl": "https://www.instagram.com/nasa/"
},
"assetIndex": 1,
"assetId": "3956405067326902270",
"format": "video",
"contentTypeHeader": "video/mp4",
"fileExtension": "mp4",
"byteSize": 5691930,
"width": 1080,
"height": 1920,
"durationSeconds": null,
"storageKey": "media-Dbn-XJhk0_--01.mp4",
"storageUrl": "https://api.apify.com/v2/key-value-stores/STORE_ID/records/media-Dbn-XJhk0_--01.mp4",
"sourceMediaUrl": "https://scontent.cdninstagram.com/temporary-video.mp4",
"retrievedAt": "2026-08-22T20:15:00.000Z"
}

Instagram can omit optional metadata. The stored file and its byte size are always present for emitted rows.

How much does it cost to download Instagram media?

The Actor uses pay-per-event pricing:

  • one start event per run;
  • one item event for each successfully stored media file and matching dataset row.

The current contract charges $0.005 per run start. At the BRONZE tier, each successfully stored media file costs $0.00352. The per-file tiers decrease from FREE through DIAMOND, and the item event is emitted only after storage succeeds.

At the BRONZE tier:

Stored filesEvent price before platform plan effects
10.00852 USD
50.02260 USD
100.04020 USD
250.09300 USD

Failed URLs and files that cannot be stored do not emit or charge an item event. Compute, proxy, and storage usage may also be reflected according to your Apify plan.

File storage and retention

Files are stored in the run's default key-value store under keys such as media-<shortcode>-01.mp4. Dataset links point to the Apify API record URL.

Access to a private store follows your Apify authorization settings. Use an API token when required. For long-term archives, copy files into storage with a retention policy appropriate for your organization.

Scheduling and integrations

Useful workflows include:

  1. Creator backup: schedule an approved list of creator-owned URLs and copy new rows to cloud storage.
  2. Campaign handoff: send stored media and provenance rows to an asset-management system.
  3. Spreadsheet catalog: connect the dataset to Google Sheets and track shortcode, creator, format, size, and retrieval date.
  4. Webhook pipeline: trigger a downstream process after the Actor run succeeds.
  5. Content repurposing: pass stored MP4 or image URLs into authorized editing, OCR, or transcription workflows.

A URL list is intentional. The Actor does not monitor a profile or discover newly published posts on its own.

Run with the Apify API

cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~instagram-public-media-downloader/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls":[{"url":"https://www.instagram.com/reel/Dbn-XJhk0_-/"}],"maxItems":1}'

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/instagram-public-media-downloader').call({
startUrls: [{ url: 'https://www.instagram.com/reel/Dbn-XJhk0_-/' }],
maxItems: 1,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].storageUrl);

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("automation-lab/instagram-public-media-downloader").call(run_input={
"startUrls": [{"url": "https://www.instagram.com/reel/Dbn-XJhk0_-/"}],
"maxItems": 1,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items[0]["storageUrl"])

Use with Apify MCP

Add the Actor to Claude Code:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/instagram-public-media-downloader"

Claude Desktop, Cursor, and VS Code setup

Use this same HTTP configuration in Claude Desktop, Cursor, or VS Code:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/instagram-public-media-downloader"
}
}
}

Example prompts:

  • "Download this authorized public Instagram Reel and return its stored MP4 URL and byte size."
  • "Archive these approved public Instagram post URLs and group the resulting files by creator."
  • "Run the Instagram media backup Task and summarize any URL that failed."

Reliability and proxy behavior

Apify datacenter proxy is enabled by default because Instagram delivery can vary by environment. The browser blocks image, media, and font rendering while it discovers structured media URLs, reducing transfer before the actual file download.

You can disable proxy access for environments where direct public access is reliable. There is no automatic residential proxy fallback, so the Actor does not silently incur a higher unmeasured proxy cost.

Each URL receives one bounded fresh-page retry. Stable private, deleted, age-restricted, or login-gated responses are reported as failures rather than empty success.

Limits

  • Maximum 10 input URLs per run.
  • Maximum 50 stored files per run.
  • Maximum 250 MB per individual media file.
  • Public /p/, /reel/, /reels/, and /tv/ URL forms only.
  • No Stories, Highlights, profile discovery, private media, or authenticated content.
  • Signed sourceMediaUrl values expire; use storageUrl for the downloaded copy.
  • Instagram may change its public page data or challenge some network routes.
  • Optional caption, ID, dimensions, or duration fields can be absent.

Failure behavior

Malformed input fails before browsing. A private or unavailable URL does not generate a charged media row. By default, failOnError is true: if some URLs succeed and another fails, successful files and rows remain stored, but the run exits with a failure status so existing automation does not silently miss requested media.

Set failOnError to false for scheduled backups where partial completion is preferable. A mixed batch then succeeds when at least one file is stored and writes PARTIAL_FAILURES as JSON in the default key-value store:

{
"status": "partial",
"savedFileCount": 1,
"failedUrlCount": 1,
"failures": [
{
"inputUrl": "https://www.instagram.com/p/Missing123/",
"canonicalUrl": "https://www.instagram.com/p/Missing123/",
"shortcode": "Missing123",
"error": "Instagram returned no downloadable public media. The URL may be private, deleted, age-restricted, or login-gated."
}
],
"completedAt": "2026-09-16T12:00:00.000Z"
}

Error text is bounded and sanitized; failed items are never charged. An all-failed batch always exits with a failure status regardless of failOnError.

Troubleshooting

The run says the URL is unsupported

Use a full https://www.instagram.com/p/.../ or https://www.instagram.com/reel/.../ URL. Profile and Story URLs are outside this Actor's scope.

Instagram returned no downloadable public media

Open the URL in a logged-out browser. Confirm it is public, still available, not age-restricted, and not a Story. Keep the default proxy configuration enabled for cloud runs.

Private Apify key-value stores require an authorized API request. Use your Apify token or fetch the record through the authenticated Apify client.

Increase maxItems. The limit counts files across the entire run, not posts.

Can I use the temporary CDN URL later?

Do not rely on it. Instagram signs CDN URLs and may expire them. Use the file stored in the run key-value store.

Data handling, AI, dependencies, and support

The Actor does not use AI or send input, scraped data, or media to an AI provider. It accesses Instagram's anonymous public website and media CDN, and uses Apify platform storage plus the configured Apify proxy route. There is no paid source account, off-platform payment, or undisclosed pass-through service fee.

Inputs contain public Instagram URLs. Outputs can contain public creator metadata, captions, source URLs, downloaded media, and operational retrieval timestamps. The Actor requests no account credentials or private content, uses inputs only for the requested run, and does not create an external cache or copy outside the run's Apify storage. Logs contain shortcodes and bounded operational errors, not proxy credentials, signed media URLs, or raw upstream error details.

Datasets, key-value-store files, and run logs follow the retention settings of your Apify account. Delete a run's dataset and key-value store with Apify storage controls; the Actor has no separate external store to delete. Instagram receives normal anonymous public-page and media requests; Apify operates the run, proxy route, logs, and storage under its platform terms.

For support, use the Actor's Issues tab in Apify Console and include a sanitized public reproduction URL. Do not include credentials, private media, or personal access tokens.

Instagram is named only to identify the public source. This Actor is independently operated, uses a company-owned icon, and is not affiliated with, endorsed by, or certified by Instagram or Meta.

Responsible use and legality

Download only media you own or are authorized to archive. Public accessibility does not transfer copyright or grant permission to reuse a creator's content.

Follow Instagram's terms, applicable copyright rules, privacy law, contractual restrictions, and your organization's retention policy. Do not use this Actor to bypass access controls, retrieve private media, impersonate users, or redistribute content without permission.

The Actor accepts no Instagram credentials and supports anonymous public content only. You are responsible for the purpose, frequency, retention, and downstream use of downloaded files.

  • Instagram Post & Reel Details Scraper — use when you need richer post metadata without storing media files.
  • Instagram Scraper — discover and shortlist posts from public profiles, or hashtag posts with your own session cookie. Then pass a bounded set of exact public post or Reel URLs here to store their images, videos, and carousel media. This downloader accepts at most 10 post/Reel URLs and 50 files per run; it does not bulk-discover a profile, ingest a dataset ID, orchestrate the handoff automatically, or create ZIP/S3 archives or converted images.
  • Instagram Reel & Video Transcript Scraper — use for transcript output from public Reel and video URLs.

FAQ

Does it require an Instagram login?

No. It supports anonymously reachable public post and Reel URLs only.

Yes, until maxItems is reached, provided Instagram exposes each asset publicly and each file is at most 250 MB.

Does one dataset row represent a post or a file?

A file. A carousel can therefore produce multiple rows with the same shortcode and different assetIndex values.

Are failed downloads charged as items?

No. The item event is emitted only after the file is stored successfully.

Can it discover posts from a creator handle?

No. Use the related profile-posts Actor for discovery, then pass authorized post URLs into this downloader.

Can I download private posts or Stories?

No. The Actor does not accept credentials and does not bypass login or privacy controls.

Where are files saved?

In the run's default Apify key-value store. Each dataset row includes storageKey and storageUrl.

How should I preserve files long term?

Copy them from Apify storage into your approved object store or asset-management system and apply your own retention policy.