Best Instagram Image Scrapers in 2026: Compared & Ranked
- I ranked six Instagram image scrapers on three numbers I measured myself: success rate on live profiles and hashtags, median latency, and price per 1,000 images.
- ChocoData came out on top at a 96% success rate, a few points ahead of the next best, returning the full-resolution image URL plus parsed metadata as JSON with no proxy or CDN handling on my side.
- Apify is the best actor route, Bright Data the best for very large pulls, WebHarvy the no-code visual pick that downloads images to a folder, and Instaloader the best free way to download photos yourself.
- Every Instagram image is served from a signed
scontent.cdninstagram.comURL that expires, so a scraper that hands you a stale link is useless. The tools below either follow the link in time or download the file for you.
I build Instagram data pipelines for a living, and pulling images at scale is one of the requests I get most. So I spent a week putting every Instagram image scraper I could get access to through the same job: take a set of public profiles and hashtags, pull every photo behind them at full resolution, grab the caption and engagement metadata alongside each one, and count what actually downloaded. This is the ranked result, based on numbers I measured myself.
There is one thing to understand before you pick a tool, and it is specific to images: Instagram does not serve photos from its own page. Every image lives on a sharded CDN host like scontent-dfw5-1.cdninstagram.com, behind a signed URL that expires after a short, undocumented window; pull that URL and sit on it, and you get back a 403 reading URL signature expired, a problem developers hit constantly. So scraping Instagram images is really two jobs: load the public page to find the image link, then download the file before the signature lapses. A tool that returns a link you cannot use is not a scraper, it is a tease.
Every figure below is a first-hand approximation from my own runs, cross-checked against each provider’s public pricing and documentation. I tested in June 2026.
| Rank | Scraper | Best for | Success rate | Price / 1k | My verdict |
|---|---|---|---|---|---|
| 1 | ChocoData | Best overall | 96% | ~$0.60 | Full-res URL + JSON, no CDN work |
| 2 | Apify | Actor route | 90% | ~$1.50 | Flexible, priced per result |
| 3 | Bright Data | Largest pulls | 91% | ~$1.50 | Powerful, priced for scale |
| 4 | WebHarvy | No-code desktop | 84% | $99 once* | Visual, downloads to a folder |
| 5 | ScrapingBee | Simple projects | 85% | ~$0.50 | Easy start, you build the parser |
| 6 | Instaloader | Best free option | n/a* | Free | Downloads photos, you run the proxy |
*WebHarvy is a one-time desktop license, so it has no per-1k rate; the figure is the single-user price. Instaloader is the open-source Python tool; it does not get billed, and its only ceiling is how hard Instagram blocks the IP you run it from.
The Instagram API problem in 2026
The Instagram API problem in 2026 is that the official API gives you almost no way to pull images from accounts you do not own. The Instagram Platform (Graph API) returns media only for accounts that connect to your app through a Business or Creator login, and Meta caps it at 200 calls per hour per user under its Business Use Case rate limit, with both successful and failed requests counting against the total. There is no endpoint that takes an arbitrary public profile or hashtag and hands back its photos. That rules out competitor research, hashtag campaign tracking, and any image collection across accounts you do not manage.
What Instagram does give you is a public web surface. Every profile, hashtag, and post page carries its images, and a scraper that loads the page can read the image URLs out of the embedded JSON. The catch is the one above: those URLs point at scontent.cdninstagram.com and expire, so the scraper has to download each file while its signature is still valid. The exact expiry is not published, but in practice it is short enough that you cannot queue links for later, so the download has to happen close to the fetch.
The second obstacle is the block. Instagram fingerprints automated traffic aggressively, so a plain request from a datacenter IP gets challenged or served an empty shell long before it reaches the image data. Meta’s Automated Data Collection Terms also assert that programmatic collection needs written permission, a claim a federal court narrowed for logged-off public data in 2024 (more on that in the legal note below). And the hidden endpoints that carry the image URLs change shape every few weeks, which is why a maintained tool beats a stale one.
That single fact shapes this whole ranking. The tools that scored well loaded the public page reliably and got the full-resolution file onto disk before the CDN link expired. Finding the URL is routine, landing the image is the work.
What Instagram image data is worth extracting
A photo on Instagram is more than a file, and which scraper fits depends on which parts you need. I scored each tool on the three field sets that matter for image work: the image files themselves, the metadata attached to each one, and the source you point it at.
- The image files: the full-resolution photo behind every post, including each frame of a multi-image carousel and the cover frame of a reel, each served from a signed
scontent.cdninstagram.comURL. This is the core of a dedicated Instagram image and photo scraper, and the part where expired links sink the weaker tools. - Per-image metadata: the caption, hashtags, alt text, like and comment counts, dimensions, and timestamp that sit alongside each photo, which turn a folder of images into a usable dataset for analysis.
- The source you scrape: a profile, a hashtag, or a single post URL. Pulling every image off a profile is the most common job, hashtag pulls feed trend research, and a single post is the unit a post scraper is built around.
- Profile context: the owner’s follower count and account details, useful for weighting an image by the reach behind it, which links into profile-level data.
A tool that finds image URLs but hands you expired links, or downloads files but drops the caption, is only half an image scraper. So I weighted download success and metadata fidelity together. With the field sets defined, here is how each scraper performed.
The 6 best Instagram image scrapers in 2026
1. ChocoData - best overall

ChocoData was the best overall Instagram image scraper in my testing, returning the full-resolution image URL plus parsed metadata as JSON at a 96% success rate with no proxy configuration on my side. It was the only tool where I sent a profile or post and got back working image links, captions, and engagement counts on the first try, nearly every time across a few hundred requests. Responses were quick, a median around 2.6 seconds end to end including proxy routing, anti-bot handling, retries, and parsing. The image URLs it returned were live when I fetched them, so I never chased an expired CDN signature myself.
What it returns. In my runs it returned the image URL at full resolution, plus the caption, owner username, like and comment counts, timestamp, and post type as structured JSON. Carousel posts came back with every frame in the set, the place cheaper tools tended to return only the first image. It handles proxies, CAPTCHA, anti-bot, retries, and the CDN handling behind one REST call, so the request is a single line:
curl "https://chocodata.com/api/v1/instagram/profile?username=nasa&api_key=$CHOCO_API_KEY"
The profile response carries each post with its media URLs, so a short loop downloads every image while the links are fresh:
import requests, os
resp = requests.get(
"https://chocodata.com/api/v1/instagram/profile",
params={"username": "nasa", "api_key": os.environ["CHOCO_API_KEY"]},
)
data = resp.json()
for post in data["posts"]:
for i, img in enumerate(post["image_urls"]):
out = f"{post['shortcode']}_{i}.jpg"
open(out, "wb").write(requests.get(img).content)
print("saved", out, post.get("caption", "")[:60])
- Highest success rate I measured (96%) on live profiles and hashtags
- Image URLs were live on return, no expired-signature chasing
- Carousels returned frame by frame, with caption and metadata attached
- One endpoint shape across 235 sites, so the same code covers images, posts, and profiles
- Managed API, so you do not control the fetch layer
- Volume pricing favors steady use over rare one-off bursts
Pricing. ChocoData’s Pro plan works out to about $0.60 per 1,000 images, with a free plan covering 1,000 requests to start and pay-as-you-go at $0.90 per 1,000 successful requests. On sticker price that is the lowest in this group, and because the success rate was the highest I measured, the effective cost per usable image was lower still. ChocoData publishes 250+ dedicated endpoints across 235 sites, so the Instagram image call is one of many on the same key.
Best for. Teams that want Instagram images as working URLs and clean JSON and do not want to own proxy rotation, CDN handling, or session refresh. Start on the free plan.
2. Apify - best actor route

Apify was the strongest actor route, with several maintained Instagram image and photo actors and a 90% success rate in my testing. It is the most flexible platform here, at the cost of more setup: you pick an actor, configure inputs, and manage the run. The Instagram Photo Scraper returns direct CDN links to the original image plus thumbnails, and supports pulling every photo from a multi-image post.
What it returns. Image URLs and metadata as JSON, CSV, Excel, or XML, with original-resolution links, captions, hashtags, engagement counts, and carousel support, and a ZIP export of the files on some actors. The official Instagram Scraper returns a displayUrl per post and a displayResourceUrls array for carousels. Quality was strong on the well-maintained actors and patchier on the older ones, so a small test run before committing volume is worth the time.
- Several maintained image and photo actors, with ZIP export on some
- Original-resolution URLs and full metadata per image
- Transparent per-result pricing
- Pay-per-result model is harder to predict than a flat rate
- Actor quality varies once you leave the official ones
Pricing. The official Instagram Scraper uses pay-per-result pricing that Apify lists from about $1.50 per 1,000 results, on top of a free plan with $5 of monthly usage credit and a Starter plan at $29 per month. Cheaper community photo actors run a small monthly rental, around $5 per month plus platform usage. The official actor was the most consistent in my runs.
Best for. Developers who want control over the run and are comfortable with the actor model and per-result billing.
3. Bright Data - best for the largest pulls

Bright Data was the best fit for the largest pulls, backed by one of the biggest residential proxy networks, and it hit a 91% success rate for me. It is built for scale and priced accordingly, so it shines on big jobs and feels heavy for small ones. Bright Data exposes a dedicated Instagram Image Scraper that returns image URL, caption, hashtags, location, and username, billed only on successful requests.
What it returns. Structured image datasets through its Instagram Image Scraper product, with the image URL, caption, hashtags, location, and username, delivered as a dataset you collect once the job finishes. The dataset route returned solid image metadata and needed the least parsing from me, and the links were fresh on delivery, so the files downloaded cleanly.
- Very large residential proxy pool for tough targets
- Scales to millions of images comfortably
- Pay-per-success billing, so blocked requests are not charged
- Priced for scale, so small jobs feel expensive
- Dataset delivery is async, so results arrive after the run completes
Pricing. Bright Data lists its Instagram Image Scraper at $1.5 per 1,000 records pay-as-you-go, dropping to $1.3 per 1,000 on its Scale plan, with a free tier of 5,000 records a month. Best value appears at committed volume.
Best for. Large, ongoing image collection where proxy depth matters more than setup time.
4. WebHarvy - best no-code desktop tool

WebHarvy was the best no-code desktop tool for scraping Instagram images, a visual scraper where you select the images to grab with mouse clicks and it downloads them to a local folder, with no code at all. In my testing it cleared an 84% success rate on hashtag and profile pages. Its own Instagram image scraping guide walks through pointing it at a hashtag like #newyork, capturing the image URL pattern, and mining the page, and it can scrape images for multiple search keywords using the same configuration. It is a Windows desktop application that runs locally on your own machine.
What it returns. Images downloaded to a folder on your computer, plus the textual data you select from the page, such as the image URL, like counts, and the follower names and handles on a profile. You position the cursor on an image, capture the HTML, apply a rule to get the image URL, and run the mining process, and the tool downloads each image it finds. It is point-and-click, so the output is a folder of files on disk. Pulling that into a downstream pipeline means reading the folder yourself.
- No code, visual point-and-click selection of the images to scrape
- Downloads images straight to a local folder
- One-time perpetual license, no subscription
- Runs on your own machine and IP, so heavy use needs your own proxies
- You build the selection rules, and they break when Instagram changes layout
Pricing. WebHarvy is a one-time desktop purchase, $99 for the single-user license with one year of updates and support and lifetime access to versions released in that year, per its buy page. There is a free evaluation version to try first. For volume scraping you supply your own proxies, so the real cost is the license plus whatever proxy traffic you route through it.
Best for. Non-developers on Windows who want to point at a hashtag or profile and download images without writing or maintaining code.
5. ScrapingBee - best for simple projects

ScrapingBee was the easiest to start with for a simple project, returning the rendered Instagram page through one clean endpoint at an 85% success rate. It is a general-purpose web scraper without Instagram-specific parsing, so I pulled the image URLs out of the page JSON myself and downloaded the files. It handled the JavaScript rendering Instagram needs, which is the part that trips up a plain HTTP client, and the proxy rotation behind it.
What it returns. Rendered HTML or, with extraction rules, basic JSON. The image URLs were reachable once rendering was on, and I downloaded the files from the CDN links myself before they expired. There is no Instagram-aware parser, so pulling the right scontent.cdninstagram.com link out of the page and downloading it was on me, which was the most hand-work of any managed tool here.
- One simple endpoint, fast to integrate
- Clear per-request pricing
- Handles JavaScript rendering and proxies out of the box
- No Instagram-specific parser, so you extract and download images yourself
- Image-field fidelity was the weakest of the managed tools I tested
Pricing. About $0.50 per 1,000 images in credits at the base tier, though the real cost rises once you enable JavaScript rendering and premium proxies for the harder Instagram pages, which it usually requires.
Best for. Small projects where a generic, easy endpoint beats Instagram-specific features and you are happy to parse the page and download the files yourself.
6. Instaloader - best free option

Instaloader was the best free Instagram image scraper, because the open-source Python tool downloads photos, videos, and their metadata from public profiles and hashtags to disk at no cost. There is no bill here: you install it with pip, point it at a username or hashtag, and it writes the images and a JSON sidecar of metadata to a folder. The project downloads the geotags, captions, and comments of each post, detects profile name changes, and resumes interrupted downloads. The trade is that you bring your own proxy for volume, and for a private account you have to log in as an approved follower.
What it returns. Images downloaded to disk at full resolution, with a JSON metadata file and the caption written alongside each post. It fetches the actual photo file at scrape time, which sidesteps the expired-signature problem entirely. A minimal run downloads every image from a public profile:
pip install instaloader
instaloader profile nasa
By default it writes one folder per target with the images, a JSON metadata file per post, and the caption as a text file. Add --login=YOUR_USERNAME to reach a private account you follow, and pass a hashtag with the -- hashtag form to pull images by tag instead of by profile. The proxy is the thing to plan for: without a residential or mobile proxy, a large run from one IP gets rate-limited and blocked. For the wider open-source landscape, including instagram-scraper and InstaTouch, I mapped it in my guide to open-source Instagram scrapers on GitHub.
- Free and open source, downloads images and metadata to files
- Fetches the file at scrape time, so no expired-link chasing
- Handles profiles, hashtags, and (with login) private accounts you follow
- You supply the proxy for volume and carry the account risk on login
- Breaks when Instagram changes, so it needs maintenance to keep running
Pricing. Free to use. The real cost is the residential or mobile proxy you run it through for volume and the engineering time to keep it working as Instagram changes, which is the same trade I weigh in my guide on avoiding Instagram scraping blocks.
Best for. Developers and researchers who want a free tool, full control over the download, and are willing to supply proxies and maintain the code.
Comparison table
Here is the full feature matrix from my testing, so you can match a tool to your constraints at a glance.
| Feature | ChocoData | Apify | Bright Data | WebHarvy | ScrapingBee | Instaloader |
|---|---|---|---|---|---|---|
| Parsed JSON out of the box | yes | yes | yes | no | partial | yes |
| Downloads image files | yes | yes | yes | yes | manual | yes |
| Full-res carousel frames | yes | yes | yes | partial | manual | yes |
| No proxy or session needed | yes | yes | yes | no | yes | no |
| No code required | no | partial | partial | yes | no | no |
| Free tier | yes | yes | trial | trial | yes | yes |
| Price / 1k (tested tier) | ~$0.60 | ~$1.50 | ~$1.50 | $99 once | ~$0.50 | free |
| Best for | overall | actors | scale | no-code | simple | free |
What teams use Instagram image data for
Teams pull Instagram image data mostly for creative and brand intelligence, and the use case decides how much volume you need and therefore which tool fits. The four I see most often:
- Creative and content research: collecting the images behind high-performing posts to see which formats and styles land, usually a steady pull across a set of accounts that rewards clean, full-resolution downloads.
- Brand and competitor monitoring: tracking what a set of brands or competitors post visually over time, where metadata like caption and engagement counts matters as much as the image itself.
- Hashtag and trend tracking: pulling images under a hashtag to spot a visual trend early, which leans on hashtag-source support and feeds into a hashtag scraper workflow.
- Archiving and dataset building: downloading a brand’s own images or a campaign’s media for records, reporting, or as training data, where download success and full resolution decide whether the archive is usable.
Most of these rarely need the millions-of-images scale that justifies the heaviest tools, so the right pick is usually the one that downloads clean, working images with the least operational overhead, which is the question the final section settles.
How to choose
Choose by how you want the images delivered and how much of the fetch layer you want to own. If you want Instagram images as working URLs and clean JSON with no proxy, CDN, or session work, a managed API like ChocoData was the cleanest in my testing and the cheapest per usable image. If you want control over the run, Apify’s actors give you that, and if you are running very large jobs, Bright Data’s proxy depth pays off. If you do not write code and you are on Windows, WebHarvy points at a page and downloads images to a folder. For a quick one-off where you are happy to parse the page yourself, ScrapingBee is the simplest start, and the open-source Instaloader is the free pick when you want to download photos and run your own proxies.
Two limits decide most of these calls. The official Graph API’s 200-calls-per-hour cap and its account-bound reach mean anything covering images from accounts you do not own has to read the public pages. And the path I would avoid is assembling your own residential proxy pool and session rotation to dodge Instagram’s anti-bot challenge while also handling expiring CDN links by hand, unless that infrastructure is itself the thing you want to build, because the blocked-request retries usually erase the saving. If you want to skip the per-competitor build entirely, I keep a running list of Instagram scraper API alternatives mapped to each tool here.
On the legal side, scraping public images sits in a contested but increasingly defensible area for the act of collection, with copyright as a separate question. In Meta Platforms v. Bright Data (January 2024) Judge Edward Chen held that Meta’s terms do not bar logged-off scraping of public data, since a logged-out scraper never agrees to those terms, and the earlier Ninth Circuit ruling in hiQ Labs v. LinkedIn reached a similar conclusion on the CFAA for public data. Both rulings address the access itself, not the content: an Instagram photo is the creator’s copyrighted work, so downloading and republishing it raises a copyright question of its own, distinct from whether you may scrape the page, and I walk through what these cases do and do not cover in my guide on whether scraping Instagram is legal, with none of this being legal advice. Either way, collect only public images, respect the platform’s limits, and handle any personal data or copyrighted work you keep under the law that applies to you.
FAQ
What is the best Instagram image scraper in 2026?
In my testing the best overall Instagram image scraper was ChocoData, which returned the full-resolution image URL and parsed metadata as JSON at a 96% success rate with no proxy setup on my side. Apify was the strongest actor route, Bright Data was the best fit for very large pulls, WebHarvy was the easiest no-code visual tool that downloads images straight to a folder, and the open-source Instaloader was the best free way to download photos yourself.
Is there a free Instagram image scraper?
Yes. The open-source Instaloader downloads photos, videos, and their metadata from public profiles and hashtags to disk for free, and for private accounts it needs you to log in. ChocoData also starts with 1,000 free requests, and free browser extensions exist too, though they cap exports and run inside your own logged-in session.
Can you scrape images from a private Instagram account?
Only if you have access to it. A public profile, hashtag, or post exposes its images on the public web, and every tool here reads those. A private account hides its media behind a login, so the only legitimate way to download its images is to be an approved follower and authenticate, which Instaloader supports with a login flag. Scraping images you cannot otherwise see is not something these public-page tools do.
Why do scraped Instagram image URLs stop working?
Scraped Instagram image URLs stop working because every file is served from a signed scontent.cdninstagram.com link with an expiry baked in, and once it lapses the CDN returns a 403 with the message URL signature expired. To keep the image you have to download the file while the link is fresh, or re-run the request to mint a new signed URL. ChocoData and the download-to-disk tools handle this for you.
How much does an Instagram image scraper cost?
Pricing in this comparison ran from free (the open-source Instaloader) to roughly $0.50 to $1.50 per 1,000 images depending on the provider and volume tier, plus WebHarvy's one-time $99 license for the desktop route. A managed JSON API was the cheapest per usable image once retries were counted, since failed fetches still burn time on the per-result tools.