Instagram Image Downloader avatar

Instagram Image Downloader

Pricing

from $2.49 / 1,000 results

Go to Apify Store
Instagram Image Downloader

Instagram Image Downloader

Instagram Image Downloader SD - Instagram Image Downloader is a social media data tool that extracts photos from public Instagram posts and carousels as full-resolution JPG files with download links, captions and owners - Instagram photo downloader.

Pricing

from $2.49 / 1,000 results

Rating

0.0

(0)

Developer

Neuro Scraper

Neuro Scraper

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

0

Monthly active users

20 days ago

Last modified

Share

Instagram Image Downloader — full-size photos from posts and carousels

The Instagram Image Downloader downloads the photos of public Instagram posts and carousels at the largest size Instagram publishes, stores them in your Apify storage and returns a download link per image.

It runs on Apify, needs no Instagram login and no cookies, and exports to JSON, CSV, Excel or an API call. Every session key it needs (tokens, query ids, cursors) is read from Instagram on each run, so it keeps working when Instagram ships new code.

What the Instagram Image Downloader does

  • Downloads every image of a carousel, one row each.
  • Accepts post links, or usernames to take their newest photo posts.
  • Skips videos (use the video downloaders for those).
  • Returns width, height and size of each file.

Who uses the Instagram Image Downloader

  • Brands archiving their own posts.
  • Designers collecting reference images they may use.
  • Researchers keeping copies of public images.

How the Instagram Image Downloader works

Instagram serves every public page to logged-out visitors together with the queries that fill it.

The Actor loads the page the way a browser does, reads the session values Instagram puts into it, and then asks Instagram's own GraphQL endpoint for the next page with the cursor the previous page returned.

Query ids that a page does not preload are read from the JavaScript bundles that page lists. Large files from Instagram's CDN (images, videos) are fetched directly with their signed links, so proxy traffic stays small.

Nothing is guessed: if Instagram stops publishing a value the Instagram Image Downloader needs, the run log names it and the item is skipped instead of being filled with a stale value.

What is new in the Instagram Image Downloader (October 2026)

These features were added on 2026-10-03 after comparing the Instagram Image Downloader with the ten most used Actors of its kind on the Apify Store. Defaults keep the earlier behaviour.

  • downloadFiles off returns the signed image links only (status linkOnly) - no storage used.
  • onlyPostsNewerThan / onlyPostsOlderThan and skipPinnedPosts choose a profile's posts.
  • New fields: id, mediaType, productType, status and cdnUrlExpiresAt.

Input of the Instagram Image Downloader

FieldTypeDefaultWhat it does
startUrlsarray["https://www.instagram.com/p/DdHyaYAifb6/"]Post links (single photos and carousels).
usernamesarray[]One per line: a username (nasa), an @handle (@nasa) or a profile URL (https://www.instagram.com/nasa/).
maxPerProfileinteger5For usernames only: how many newest posts to take.
maxFileSizeMbinteger50Larger files are skipped and reported.
downloadFilesbooleanTrueOff: return the signed Instagram links only (faster, no storage).
onlyPostsNewerThanstring—Leave out posts published before this date: 2026-09-01, an ISO time (2026-09-01T10:00:00Z) or relative ("7 days", "2 weeks", "1 month"). UTC. Profile lists stop
onlyPostsOlderThanstring—Leave out posts published after this date (same formats). Combine with "newer than" for a date range.
skipPinnedPostsbooleanFalseLeave out the posts a profile pinned to the top of its grid (often months old). Instagram flags them in the profile's post list.
maxItemsinteger0Stops the whole run after this many dataset rows. 0 means only the per-target limits apply.
proxyConfigurationobject{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}Instagram limits logged-out visitors per IP address. Residential proxies (the default) give the most reliable results; the Actor switches to a fresh IP when Ins

Example input for the Instagram Image Downloader:

{
"startUrls": [
"https://www.instagram.com/p/DdHyaYAifb6/"
],
"maxPerProfile": 5,
"maxFileSizeMb": 50
}

Output of the Instagram Image Downloader

Each dataset row is one downloaded image. These are the fields the Instagram Image Downloader produced in its test runs:

FieldMeaning
captionCaption text
cdnUrlcdnUrl
commentsCountComments count
downloadErrordownloadError
fileKeyfileKey
fileUrlDownload link of the stored file (Apify key-value store)
heightheight
inputUrlinputUrl
itemCountitemCount
itemIndexitemIndex
likesCountLikes (or reactions) count
ownerUsernameAccount that posted it
scrapedAtWhen this row was read
shortCodeInstagram short code
sizeBytesStored file size in bytes
timestampPublication time (UTC, ISO 8601)
urlPublic link of the item
videoPlayCountVideo plays
widthwidth
cdnUrlExpiresAtWhen the signed link expires (its oe= parameter)
idPlatform id of the item
mediaTypevideo or image
productTypefeed, carousel_container or clips (reel)
statusstored, linkOnly or failed
isPinnedPinned to the top of the profile (Instagram's own flag)

Fields that Instagram does not publish for an item are left empty rather than guessed. Download the dataset as JSON, CSV, Excel, XML or HTML, or read it through the Apify API.

Example row from a Instagram Image Downloader test run

A real row from the local test run (long values shortened):

{
"url": "https://www.instagram.com/p/Dd8u0tIFz1F/",
"shortCode": "Dd8u0tIFz1F",
"ownerUsername": "natgeo",
"caption": "Presented by @Rolex. Until 2023, the world’s biggest rhino herd was owned by a single m...",
"timestamp": "2026-10-02T01:00:00.000Z",
"likesCount": 23751,
"commentsCount": 71,
"videoPlayCount": null,
"inputUrl": "natgeo",
"itemIndex": 1,
"itemCount": 1,
"width": 1080,
"height": 1350,
"fileUrl": "file:///D:/Email%20Scrapers/ACTOR_IMPLEMENT/instagram-video-scraper-and-downloader/stor...",
"fileKey": "Dd8u0tIFz1F-image.jpg",
"sizeBytes": 96282,
"cdnUrl": "https://instagram.fdac5-1.fna.fbcdn.net/v/t51.82787-15/829492093_18703023550019133_9177...",
"downloadError": null,
"scrapedAt": "2026-10-02T18:28:06.000Z"
}

Data quality of the Instagram Image Downloader

  • Every value in a Instagram Image Downloader row is read from Instagram during your run; nothing is filled from a cache or an old snapshot.
  • Rows are de-duplicated by id inside a run, so the same downloaded image never appears twice in one dataset.
  • Counts are numbers you can sort and sum (not "1.2K" text) wherever Instagram publishes the exact number.
  • Dates are UTC in ISO 8601 format, which Excel, Google Sheets, Python and SQL all read directly.

Instagram Image Downloader test results

These numbers come from live test runs of the Instagram Image Downloader on 2026-10-03 (home connection, no proxy). Runs on the Apify platform use residential proxies and can be faster or slower.

TestRowsTime
prefill input (regression)49 s
carousel post images49 s
latest 2 posts of a profile211 s
NEW links only + skip pinned + date210 s

Instagram Image Downloader limits, stated plainly

  • Only public photos.
  • Measured locally: a 4-image carousel stored in 14 seconds.
  • Respect copyright: download only what you may reuse.

How to run the Instagram Image Downloader

  1. Open the Instagram Image Downloader in Apify Console and fill in the input fields described above.
  2. Keep the default residential proxy unless you have a reason to change it; Instagram limits logged-out visitors per IP address.
  3. Start the run, watch the log, and download the dataset when the status says Done.
  4. To automate it, call the Instagram Image Downloader from the Apify API, schedule it, or connect it to Make, Zapier, n8n or Google Sheets through an integration or webhook.

Python example with the Apify API client:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"startUrls": [
"https://www.instagram.com/p/DdHyaYAifb6/"
],
"maxPerProfile": 5,
"maxFileSizeMb": 50
}
run = client.actor("neuro-scraper/instagram-video-scraper-and-downloader").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

Instagram Image Downloader pricing

The Instagram Image Downloader uses pay-per-event pricing: you pay per dataset row (event "result"), plus the Apify platform usage of your run. Free-plan users get up to 30 rows per run, which is enough to test the Instagram Image Downloader on real data.

Set a maximum cost per run in Apify and the Instagram Image Downloader stops cleanly when it is reached.

Tips for large runs of the Instagram Image Downloader

  • Start with a small limit to check the Instagram Image Downloader output, then raise it; the first rows arrive within seconds.
  • Split very large jobs into several inputs and run them in parallel tasks; each run gets its own proxy sessions.
  • Set a maximum cost per run in Apify; the Instagram Image Downloader stops cleanly when the budget is reached and keeps every row it already saved.
  • Schedule repeat runs instead of one huge run when you track the same targets over time.
  • Keep the residential proxy: datacenter IPs are refused by Instagram far more often for logged-out visitors.

Instagram Image Downloader compared with copying by hand

Instagram Image DownloaderManual work
SpeedSeconds per page of resultsMinutes per item
FieldsEvery public field, same order every timeWhatever you copy
FormatJSON, CSV, Excel, APISpreadsheet you build yourself
RepeatableSchedule it dailyStart again each time
ErrorsLogged per itemUnnoticed typos

Using the Instagram Image Downloader in a workflow

  • Send every new row to Google Sheets or Airtable with the Apify integration and keep a live table.
  • Trigger a Make, Zapier or n8n scenario with a webhook when the run finishes.
  • Load the JSON export into Python or BigQuery for analysis and dashboards.
  • Use the Apify API: start the Instagram Image Downloader with a POST request and read the dataset items endpoint when the run finishes.
  • Chain it: pass the Instagram Image Downloader output to another Apify Actor (for example a downloader or a transcript Actor) in an Apify task.
  • Export straight to Excel from the dataset tab when you only need a one-off report.

Troubleshooting the Instagram Image Downloader

  • The run ends with no rows: open the log. The Instagram Image Downloader writes one line per target saying what Instagram returned, for example a login wall or a missing item.
  • Fewer rows than expected: the target may have fewer public items, or Instagram may stop serving more pages to logged-out visitors. The log names the reason.
  • Slow run: large limits mean many pages; the Instagram Image Downloader waits briefly between pages so Instagram keeps answering. Split big jobs into several runs.
  • Proxy errors: keep the RESIDENTIAL group. The Instagram Image Downloader already switches to a fresh IP when one is blocked.
  • Free plan stops at 30 rows: that is the free-plan cap of the Instagram Image Downloader; any paid Apify plan removes it.

What changed in this version of the Instagram Image Downloader

  • Rebuilt in October 2026 on Instagram's logged-out web endpoints; every token, query id and cursor is read at run time.
  • Pay-per-event pricing (one event per row) replaces the old monthly rental; free-plan users can test with 30 rows per run.
  • Residential proxy by default, with automatic switch to a fresh IP when Instagram blocks one.
  • October 2026 feature round: new filters and fields matching the most used Instagram Actors on the Store, every one measured in a live test; existing inputs and fields are unchanged.

The Instagram Image Downloader reads only data that Instagram shows to any logged-out visitor. It never logs in and never touches private content.

Personal data may still be in public posts, so check GDPR and the other laws that apply to you before you store or reuse it, and respect Instagram's terms.

ActorLink
Instagram Scraperneuro-scraper/instagram-video-scraper
Instagram Profile Scraperneuro-scraper/instagram-reels-scraper-downloader-pro
Instagram Posts Scraperneuro-scraper/instagram-posts-scraper
Instagram Reels Scraperneuro-scraper/instagram-reels-scraper
Instagram Hashtag Scraperneuro-scraper/instagram-reeel-scraper
Instagram Comments Scraperneuro-scraper/instagram-reels-scraper-and-downloader-premium
Instagram Search Scraperneuro-scraper/instagram-video-scraper-advanced
Instagram Video Downloaderneuro-scraper/instagram-video-downloader
Instagram Reels Downloaderneuro-scraper/instagram-reels-downloader
Instagram Transcript Scraperneuro-scraper/instagram-video-scraper-and-downloader-pro
Instagram Mentions Scraperneuro-scraper/instagram-video-scraper-and-downloader-premium
Instagram Keyword Scraperneuro-scraper/instagram-video-scraper-and-downloader-fastest

Leave a review

If the Instagram Image Downloader saved you time, please leave a star rating and a short review on its Apify page. Reviews help other users find the Instagram Image Downloader and tell us what to improve next.

Frequently asked questions

Does the Instagram Image Downloader download carousels?

Yes. Each image of a carousel becomes its own row with itemIndex and itemCount.

Does the Instagram Image Downloader need my Instagram login?

No. The Instagram Image Downloader works logged out and never asks for your password or cookies. It reads only what Instagram shows to any visitor.

Do I need my own proxy for the Instagram Image Downloader?

No. The Instagram Image Downloader uses Apify residential proxies by default and switches to a fresh IP when Instagram blocks one. You can choose another proxy in the input.

What formats can I export from the Instagram Image Downloader?

JSON, CSV, Excel, XML, HTML and RSS from the dataset tab, or any format through the Apify API, webhooks and integrations.

How fast is the Instagram Image Downloader?

In the test runs above the Instagram Image Downloader took between 9 and 11 seconds per run. Speed depends on how many items you ask for and on the proxy.

Why did the Instagram Image Downloader return fewer rows than I asked for?

The Instagram Image Downloader stops when Instagram has nothing more to show logged out, when your limit is reached, or when the free-plan cap of 30 rows applies. The run log always says which one happened.

Can I schedule the Instagram Image Downloader?

Yes. Create a schedule in Apify Console to run the Instagram Image Downloader daily or hourly and send the results to Google Sheets, Make, Zapier or n8n through an integration.

Can the Instagram Image Downloader read private accounts or private groups?

No. The Instagram Image Downloader reads public data only. Private content needs a login, and the Instagram Image Downloader never logs in.

What happens when Instagram changes its website?

The Instagram Image Downloader reads every key it needs from Instagram at run time, so routine changes are picked up automatically. If something can no longer be read, the log says so instead of returning wrong data.

Can I use the Instagram Image Downloader with Make, Zapier or n8n?

Yes. Add the Instagram Image Downloader as an Apify step in Make, Zapier or n8n, or send a webhook when the run finishes and fetch the dataset items from the Apify API.

Does the Instagram Image Downloader work in every country?

The Instagram Image Downloader reads Instagram through residential proxies that rotate across countries. Content that Instagram restricts by country follows those rules.

How do I collect only new items with the Instagram Image Downloader?

Schedule the Instagram Image Downloader and keep the item ids from earlier runs. Every row has a stable id, so a simple de-duplication against your previous export keeps only the new ones.

Can the Instagram Image Downloader process many targets in one run?

Yes. Put as many targets as you like in the input; the Instagram Image Downloader handles them one after another and a failing target never stops the others.

Yes. Turn off downloadFiles and every row carries the signed image link and its expiry time instead of a stored file.