Best Web Scraping APIs for Instagram: July 2026 Benchmark
Benchmarks run by the Scrapeway team ยท
Last updated: August 14, 2026 ยท
How we benchmark
Scrapfly is the best web scraping API for Instagram, with a
96% success rate across 8 web scraping APIs
benchmarked against live Instagram pages in July 2026.
3 of the 8 cleared Instagram reliably enough to recommend.
Instagram is protected by Imperva and gates a lot of
data behind a login wall, so most scraping APIs either fail it or pay for it in speed and cost. The benchmark is
refreshed twice a month, with no affiliate links and no sponsors.
Ranked by live Instagram success rate, best first:
Ranking history: web scraping APIs for Instagram over time
Instagram target ranking history
The 4 web scraping APIs for Instagram, reviewed
1. Scrapfly: 96% success on Instagram
On Instagram
Speed
Cost/1k
Overall
From
96%
6.5s
$4.43
#1 of 4
$30/mo
Instagram puts Imperva in front of its public profile and post pages, and the data is served through its
internal GraphQL style JSON endpoints rather than the visible HTML. Scrapfly cleared
96% here by generating a genuine browser fingerprint and passing
Imperva's checks, so it reaches the public profile and post data instead of a challenge or login wall. Because
it only bills for successful requests, the block and login wall pages Instagram returns don't quietly run up
the cost.
At $4.43 per 1,000 successful requests and
6.5s average response time, the figures are strong for an API clearing Imperva
at this rate. The 96% success rate is the headline, and the ranking history above
shows how that rate has held across previous runs.
Pros:
Highest success rate in the Instagram benchmark this run, clearing Imperva's fingerprinting on public pages
Only charges for successful scrapes, so challenge and login wall pages cost nothing
One asp flag plus residential proxies handles Instagram with little tuning
First class SDKs for Python, TypeScript, Go, and Rust, plus a Scrapy extension
Cons:
Credit cost per request rises once ASP, JavaScript rendering, or residential proxies are enabled
The entry (Discovery) plan caps concurrency at 5, so large profile crawls need a higher tier
The free tier is a single batch of 1,000 credits, enough to prototype but not to benchmark at volume
2. Scrapingant: 93% success on Instagram
On Instagram
Speed
Cost/1k
Overall
From
93%
13.1s
$1.90
#2 of 4
$19/mo
Scrapingant bundles JavaScript rendering and session support at a low entry price, with a smaller feature
surface than the larger providers. On Instagram it cleared 93% this run.
Pros:
Low sticker price
JavaScript rendering included
Cons:
Smaller feature surface and fewer integration options than the larger providers
Billing covers requests that return block or challenge pages, so failures still cost credits
Small provider with a thin public track record
3. WebScrapingAPI: 91% success on Instagram
On Instagram
Speed
Cost/1k
Overall
From
91%
12.9s
$2.71
#3 of 4
$19/mo
WebScrapingAPI covers a broad range of language SDKs behind a simple REST interface, so it drops into most
stacks without a client library, and it supports async and batch submission for queued jobs. The scorecard
carries this run's speed and cost. On Instagram it cleared 91% this run.
Pros:
Broad language SDK range behind a simple REST interface
Async and batch submission for queued jobs
Cons:
Imperva's block and login wall pages make it easy to keep paying unless you check content
Support tickets often go unanswered for days, per user reviews
4. Scrapingbee: 31% success on Instagram
On Instagram
Speed
Cost/1k
Overall
From
31%
3.2s
$3.40
#4 of 4
$49/mo
Scrapingbee is fast and cheap per request, with JavaScript rendering for lighter targets. Instagram is a hard
case for it, because Imperva scores browser signals on every request and the login wall gates much of the
data, and every blocked request still costs credits. On Instagram it cleared 31% this run.
Pros:
Fast response times
Low sticker cost per request
Cons:
Imperva's per request scoring penalizes an HTTP first approach
Credits burn quickly once JavaScript rendering or premium proxies are enabled
No plan tier between the small and large options
COMPARISON
About scraping Instagram
Instagram is one of the largest social platforms, and the data people scrape from it is mostly public profile
detail. That means usernames and display names, bios, follower and following counts, post counts, captions, like
and comment counts, hashtags, and media URLs from public profiles and posts. Most of this is reachable on public
profile pages and individual post pages without an account.
Instagram is a JavaScript heavy app that serves its data through internal GraphQL style JSON endpoints rather than
the page HTML, so the reliable approach reads those JSON responses instead of parsing the DOM. A large amount of
data, including private accounts, follower lists, and full feeds, sits behind a login wall and is out of scope for
public scraping. The benchmark targets public profile and post data only.
HTTP ANALYSIS
Instagram is protected by Imperva. See the
Imperva benchmark page for how Imperva detects bots.
The practical detail for scraping Instagram is that blocks often come back as a login wall redirect or an empty
response rather than a hard error, so success has to be measured on response content, not status codes.
instagram_scraper.py
importjsonfromparselimportSelector# install using `pip install scrapfly-sdk`fromscrapflyimportScrapflyClient,ScrapeConfig,ScrapeApiResponse# create an API client instanceclient=ScrapflyClient(key="YOUR API KEY")# create scrape function that returns HTML parser for a given URLdefscrape(url:str,country:str="",render_js=False,headers:dict=None)->Selector:api_result=client.scrape(ScrapeConfig(url=url,headers=headers,asp=True,render_js=render_jsorTrue,cache=False,cache_ttl=900,method='GET',))returnapi_result.selector# this example show how instagram can be scraped through their backend APIusername="google"selector=scrape(url=f"https://i.instagram.com/api/v1/users/web_profile_info/?username={username}",headers={"x-ig-app-id":"936619743392459"},# this is needed to access IG backend API)# this returns a giant JSON dataset with all Instagram profile detailsdataset=selector.get()['data']['user']# some examples of what can be found in the dataset:frompprintimportpprintpprint(dataset)
import json
from parsel import Selector
# install using `pip install scrapfly-sdk`
from scrapfly import ScrapflyClient, ScrapeConfig, ScrapeApiResponse
# create an API client instance
client = ScrapflyClient(key="YOUR API KEY")
# create scrape function that returns HTML parser for a given URL
def scrape(url: str, country: str="", render_js=False, headers: dict=None) -> Selector:
api_result = client.scrape(ScrapeConfig(
url=url,
headers=headers,
asp=True,
render_js=render_js or True,
cache=False,
cache_ttl=900,
method='GET',
))
return api_result.selector
# this example show how instagram can be scraped through their backend API
username = "google"
selector = scrape(
url=f"https://i.instagram.com/api/v1/users/web_profile_info/?username={username}",
headers={"x-ig-app-id": "936619743392459"}, # this is needed to access IG backend API
)
# this returns a giant JSON dataset with all Instagram profile details
dataset = selector.get()['data']['user']
# some examples of what can be found in the dataset:
from pprint import pprint
pprint(dataset)
importjsonfromparselimportSelector# install using `pip install scrapingant-client`fromscrapingant_clientimportScrapingAntClient# create an API client instanceclient=ScrapingAntClient(token="YOUR API KEY")# create scrape function that returns HTML parser for a given URLdefscrape(url:str,country:str="",render_js=False,headers:dict=None)->Selector:api_result=client.general_request(url,json=True,proxy_type='residential',method='GET',)# the scrapingant client returns its own Response object: content holds the pageassertapi_result.status_code==200,api_result.textreturnSelector(api_result.content)# this example show how instagram can be scraped through their backend APIusername="google"selector=scrape(url=f"https://i.instagram.com/api/v1/users/web_profile_info/?username={username}",headers={"x-ig-app-id":"936619743392459"},# this is needed to access IG backend API)# this returns a giant JSON dataset with all Instagram profile detailsdataset=selector.get()['data']['user']# some examples of what can be found in the dataset:frompprintimportpprintpprint(dataset)
import json
from parsel import Selector
# install using `pip install scrapingant-client`
from scrapingant_client import ScrapingAntClient
# create an API client instance
client = ScrapingAntClient(token="YOUR API KEY")
# create scrape function that returns HTML parser for a given URL
def scrape(url: str, country: str="", render_js=False, headers: dict=None) -> Selector:
api_result = client.general_request(
url,
json=True,
proxy_type='residential',
method='GET',
)
# the scrapingant client returns its own Response object: content holds the page
assert api_result.status_code == 200, api_result.text
return Selector(api_result.content)
# this example show how instagram can be scraped through their backend API
username = "google"
selector = scrape(
url=f"https://i.instagram.com/api/v1/users/web_profile_info/?username={username}",
headers={"x-ig-app-id": "936619743392459"}, # this is needed to access IG backend API
)
# this returns a giant JSON dataset with all Instagram profile details
dataset = selector.get()['data']['user']
# some examples of what can be found in the dataset:
from pprint import pprint
pprint(dataset)
importjsonfromparselimportSelector# webscrapingapi has a Python SDK but it's not great, use httpx instead:# `pip install httpx`importhttpx# create an API client instanceclient=httpx.Client(timeout=180)# create scrape function that returns HTML parser for a given URLdefscrape(url:str,country:str="",render_js=False,headers:dict=None)->Selector:api_result=client.get("https://api.webscrapingapi.com/v2",# the target url is passed as a parameter belowheaders=headers,params={"url":url,"api_key":"YOUR API KEY",# NOTE: add your API KEY here!"timeout":60_000,"render_js":render_jsor'1',"method":'GET',},)assertapi_result.status_code==200,api_result.reason_phrasereturnSelector(api_result.text)# this example show how instagram can be scraped through their backend APIusername="google"selector=scrape(url=f"https://i.instagram.com/api/v1/users/web_profile_info/?username={username}",headers={"x-ig-app-id":"936619743392459"},# this is needed to access IG backend API)# this returns a giant JSON dataset with all Instagram profile detailsdataset=selector.get()['data']['user']# some examples of what can be found in the dataset:frompprintimportpprintpprint(dataset)
import json
from parsel import Selector
# webscrapingapi has a Python SDK but it's not great, use httpx instead:
# `pip install httpx`
import httpx
# create an API client instance
client = httpx.Client(timeout=180)
# create scrape function that returns HTML parser for a given URL
def scrape(url: str, country: str="", render_js=False, headers: dict=None) -> Selector:
api_result = client.get(
"https://api.webscrapingapi.com/v2", # the target url is passed as a parameter below
headers=headers,
params={
"url": url,
"api_key": "YOUR API KEY", # NOTE: add your API KEY here!
"timeout": 60_000,
"render_js": render_js or '1',
"method": 'GET',
},
)
assert api_result.status_code == 200, api_result.reason_phrase
return Selector(api_result.text)
# this example show how instagram can be scraped through their backend API
username = "google"
selector = scrape(
url=f"https://i.instagram.com/api/v1/users/web_profile_info/?username={username}",
headers={"x-ig-app-id": "936619743392459"}, # this is needed to access IG backend API
)
# this returns a giant JSON dataset with all Instagram profile details
dataset = selector.get()['data']['user']
# some examples of what can be found in the dataset:
from pprint import pprint
pprint(dataset)
importjsonfromparselimportSelector# install using `pip install scrapingbee`fromscrapingbeeimportScrapingBeeClient# create an API client instanceclient=ScrapingBeeClient(api_key="YOUR API KEY")# create scrape function that returns HTML parser for a given URLdefscrape(url:str,country:str="",render_js=False,headers:dict=None)->Selector:api_result=client.get(url,headers=headers,params={"json_response":True,"transparent_status_code":True,})assertapi_result.ok,api_result.textdata=api_result.json()returnSelector(data['body'])# this example show how instagram can be scraped through their backend APIusername="google"selector=scrape(url=f"https://i.instagram.com/api/v1/users/web_profile_info/?username={username}",headers={"x-ig-app-id":"936619743392459"},# this is needed to access IG backend API)# this returns a giant JSON dataset with all Instagram profile detailsdataset=selector.get()['data']['user']# some examples of what can be found in the dataset:frompprintimportpprintpprint(dataset)
import json
from parsel import Selector
# install using `pip install scrapingbee`
from scrapingbee import ScrapingBeeClient
# create an API client instance
client = ScrapingBeeClient(api_key="YOUR API KEY")
# create scrape function that returns HTML parser for a given URL
def scrape(url: str, country: str="", render_js=False, headers: dict=None) -> Selector:
api_result = client.get(
url,
headers=headers,
params={
"json_response": True,
"transparent_status_code": True,
}
)
assert api_result.ok, api_result.text
data = api_result.json()
return Selector(data['body'])
# this example show how instagram can be scraped through their backend API
username = "google"
selector = scrape(
url=f"https://i.instagram.com/api/v1/users/web_profile_info/?username={username}",
headers={"x-ig-app-id": "936619743392459"}, # this is needed to access IG backend API
)
# this returns a giant JSON dataset with all Instagram profile details
dataset = selector.get()['data']['user']
# some examples of what can be found in the dataset:
from pprint import pprint
pprint(dataset)
importjsonfromparselimportSelector# install using `pip install zenrows`fromzenrowsimportZenRowsClient# create an API client instanceclient=ZenRowsClient(apikey="YOUR API KEY")# create scrape function that returns HTML parser for a given URLdefscrape(url:str,country:str="",render_js=False,headers:dict=None)->Selector:api_result=client.get(url,headers=headers,params={})# zenrows answers with the page HTML; "json_response" is only accepted with js_render onassertapi_result.ok,api_result.textreturnSelector(api_result.text)# this example show how instagram can be scraped through their backend APIusername="google"selector=scrape(url=f"https://i.instagram.com/api/v1/users/web_profile_info/?username={username}",headers={"x-ig-app-id":"936619743392459"},# this is needed to access IG backend API)# this returns a giant JSON dataset with all Instagram profile detailsdataset=selector.get()['data']['user']# some examples of what can be found in the dataset:frompprintimportpprintpprint(dataset)
import json
from parsel import Selector
# install using `pip install zenrows`
from zenrows import ZenRowsClient
# create an API client instance
client = ZenRowsClient(apikey="YOUR API KEY")
# create scrape function that returns HTML parser for a given URL
def scrape(url: str, country: str="", render_js=False, headers: dict=None) -> Selector:
api_result = client.get(
url,
headers=headers,
params={
}
)
# zenrows answers with the page HTML; "json_response" is only accepted with js_render on
assert api_result.ok, api_result.text
return Selector(api_result.text)
# this example show how instagram can be scraped through their backend API
username = "google"
selector = scrape(
url=f"https://i.instagram.com/api/v1/users/web_profile_info/?username={username}",
headers={"x-ig-app-id": "936619743392459"}, # this is needed to access IG backend API
)
# this returns a giant JSON dataset with all Instagram profile details
dataset = selector.get()['data']['user']
# some examples of what can be found in the dataset:
from pprint import pprint
pprint(dataset)
importjsonfromparselimportSelector# install using `pip install firecrawl-py`fromfirecrawlimportFirecrawl# create an API client instanceclient=Firecrawl(api_key="YOUR API KEY")# create scrape function that returns HTML parser for a given URLdefscrape(url:str,country:str="",render_js=False,headers:dict=None)->Selector:api_result=client.scrape(url=url,headers=headersor{},)assertapi_result.raw_html,"firecrawl returned no html for this page"returnSelector(api_result.raw_html)# this example show how instagram can be scraped through their backend APIusername="google"selector=scrape(url=f"https://i.instagram.com/api/v1/users/web_profile_info/?username={username}",headers={"x-ig-app-id":"936619743392459"},# this is needed to access IG backend API)# this returns a giant JSON dataset with all Instagram profile detailsdataset=selector.get()['data']['user']# some examples of what can be found in the dataset:frompprintimportpprintpprint(dataset)
import json
from parsel import Selector
# install using `pip install firecrawl-py`
from firecrawl import Firecrawl
# create an API client instance
client = Firecrawl(api_key="YOUR API KEY")
# create scrape function that returns HTML parser for a given URL
def scrape(url: str, country: str="", render_js=False, headers: dict=None) -> Selector:
api_result = client.scrape(
url=url,
headers=headers or {},
)
assert api_result.raw_html, "firecrawl returned no html for this page"
return Selector(api_result.raw_html)
# this example show how instagram can be scraped through their backend API
username = "google"
selector = scrape(
url=f"https://i.instagram.com/api/v1/users/web_profile_info/?username={username}",
headers={"x-ig-app-id": "936619743392459"}, # this is needed to access IG backend API
)
# this returns a giant JSON dataset with all Instagram profile details
dataset = selector.get()['data']['user']
# some examples of what can be found in the dataset:
from pprint import pprint
pprint(dataset)
importjsonfromparselimportSelector# scrapingdog has no integration but we can use httpx# install using `pip install httpx`importhttpx# create an API client instanceclient=httpx.Client(timeout=180)# create scrape function that returns HTML parser for a given URLdefscrape(url:str,country:str="",render_js=False,headers:dict=None)->Selector:params={"api_key":"YOUR API KEY","url":url,}api_result=client.get('https://api.scrapingdog.com/scrape',params=params,)assertapi_result.status_code==200,api_result.textreturnSelector(api_result.text,type="html")# this example show how instagram can be scraped through their backend APIusername="google"selector=scrape(url=f"https://i.instagram.com/api/v1/users/web_profile_info/?username={username}",headers={"x-ig-app-id":"936619743392459"},# this is needed to access IG backend API)# this returns a giant JSON dataset with all Instagram profile detailsdataset=selector.get()['data']['user']# some examples of what can be found in the dataset:frompprintimportpprintpprint(dataset)
import json
from parsel import Selector
# scrapingdog has no integration but we can use httpx
# install using `pip install httpx`
import httpx
# create an API client instance
client = httpx.Client(timeout=180)
# create scrape function that returns HTML parser for a given URL
def scrape(url: str, country: str="", render_js=False, headers: dict=None) -> Selector:
params = {
"api_key": "YOUR API KEY",
"url": url,
}
api_result = client.get(
'https://api.scrapingdog.com/scrape',
params=params,
)
assert api_result.status_code == 200, api_result.text
return Selector(api_result.text, type="html")
# this example show how instagram can be scraped through their backend API
username = "google"
selector = scrape(
url=f"https://i.instagram.com/api/v1/users/web_profile_info/?username={username}",
headers={"x-ig-app-id": "936619743392459"}, # this is needed to access IG backend API
)
# this returns a giant JSON dataset with all Instagram profile details
dataset = selector.get()['data']['user']
# some examples of what can be found in the dataset:
from pprint import pprint
pprint(dataset)
importjsonfromparselimportSelector# install using `pip install scraperapi-sdk`fromscraperapi_sdkimportScraperAPIClient# create an API client instanceclient=ScraperAPIClient(api_key="YOUR API KEY")# create scrape function that returns HTML parser for a given URLdefscrape(url:str,country:str="",render_js=False,headers:dict=None)->Selector:api_result=client.make_request(url=url,headers=headers,params={},)assertapi_result.ok,api_result.textreturnSelector(api_result.text)# this example show how instagram can be scraped through their backend APIusername="google"selector=scrape(url=f"https://i.instagram.com/api/v1/users/web_profile_info/?username={username}",headers={"x-ig-app-id":"936619743392459"},# this is needed to access IG backend API)# this returns a giant JSON dataset with all Instagram profile detailsdataset=selector.get()['data']['user']# some examples of what can be found in the dataset:frompprintimportpprintpprint(dataset)
import json
from parsel import Selector
# install using `pip install scraperapi-sdk`
from scraperapi_sdk import ScraperAPIClient
# create an API client instance
client = ScraperAPIClient(api_key="YOUR API KEY")
# create scrape function that returns HTML parser for a given URL
def scrape(url: str, country: str="", render_js=False, headers: dict=None) -> Selector:
api_result = client.make_request(
url=url,
headers=headers,
params={
},
)
assert api_result.ok, api_result.text
return Selector(api_result.text)
# this example show how instagram can be scraped through their backend API
username = "google"
selector = scrape(
url=f"https://i.instagram.com/api/v1/users/web_profile_info/?username={username}",
headers={"x-ig-app-id": "936619743392459"}, # this is needed to access IG backend API
)
# this returns a giant JSON dataset with all Instagram profile details
dataset = selector.get()['data']['user']
# some examples of what can be found in the dataset:
from pprint import pprint
pprint(dataset)
How to choose a web scraping API for Instagram
Because Instagram sits behind Imperva and a login wall, start by narrowing to the providers still clearing it this
run (the top of the ranked table), then choose within that set based on your job. Low volume public profile
lookups give you more room on cost. Large profile or post crawls put more weight on reliability and concurrency.
Reliability first.Scrapfly leads the current Instagram ranking, which makes it the
default starting point for production public profile crawls. The ranking history shows its track record.
Value. Among the APIs still clearing Instagram, sort by cost per successful request. The
cheapest sticker price is rarely the cheapest per usable Instagram page.
Speed. For latency sensitive profile lookups rather than bulk crawls, pick the fastest option
that still clears Instagram reliably.
The key principle is to judge on cost per successful request, not sticker price. Imperva returns block pages and
login wall redirects that can look like a normal response, so a cheap API can burn through requests without
returning usable data, which makes its real cost per usable result far higher than the rate card suggests.
PRICING
How we benchmark web scraping APIs for Instagram
We independently benchmark 8 web scraping APIs against live Instagram pages, 1,000+ requests per
service, twice a month. Every API is tested against the same public Instagram URLs at the same time, and cost is
measured per 1,000 successful requests on entry plan pricing. We pay for the plans ourselves. No affiliate links.
No sponsors. Just data.
8 APIs ยท 1,000+ requests each ยท twice a month ยท no affiliate links, no sponsors
Benchmarking Instagram has one wrinkle worth knowing about. Success is measured on response content, not HTTP
status codes. Imperva's block responses and Instagram's login wall redirects can return without a hard error
status, so a test that only checked the status code would overstate results. We verify that responses contain the
expected public profile or post data before counting them as successful. Every provider is tested against the
same URLs in the same run, so the numbers stay comparable.
Latest data: Jul 31 to Aug 14, 2026.
QUALITY TESTING
Frequently asked questions about scraping Instagram
Is it legal to scrape Instagram?
Scraping publicly available Instagram data is more sensitive than scraping ecommerce listings because profiles and
posts often contain personal data, which can fall under privacy laws such as GDPR and CCPA. Instagram's Terms of
Service also prohibit automated access. Legality depends on what you collect, where you operate, and how you use
the data, so treat this as general information rather than legal advice and check your own situation.
What's the cheapest API that works on Instagram?
Sort the ranked table by cost per successful request and read down to the first provider still clearing Instagram
this run. That's the cheapest option that actually delivers. Lower priced APIs further down often fail too many
requests for their sticker price to be meaningful, and Instagram's blocks and login wall redirects hide those
failures unless you check response content.
Do I need a headless browser to scrape Instagram?
In practice yes. Imperva scores browser signals on every request, and producing credible ones reliably needs a
genuine browser context. The profile and post data itself comes from internal JSON endpoints rather than the page
HTML, so once you're past Imperva you read those responses rather than the DOM. The APIs at the top of the ranking
handle the browser and antibot layer for you.
Why do some APIs score low on Instagram?
Because Imperva blocks clients whose browser signals it doesn't trust, and Instagram redirects unauthenticated or
suspicious requests to a login wall. Those responses come back as block or login wall pages, and since we score on
response content, they count as failures rather than successes.
How often is this benchmark updated?
Twice a month against the same live public Instagram targets, 1,000+ requests per API each run. We publish after
validating the run and checking failures for configuration or detection errors.
Conclusion
Instagram sits behind Imperva and a login wall, and serves its data through internal JSON endpoints, so the right
web scraping API is one that clears the antibot layer reliably and reaches the public profile and post data. For
production public profile crawls, start with Scrapfly, the highest success rate in the current run. For
cost or speed on lighter lookups, choose among the providers still clearing Instagram this run.
Whatever you pick, verify results on response content rather than status codes, because Instagram's block pages
and login wall redirects don't always carry a hard error status. The benchmark refreshes twice a month, so check
the live Instagram results before committing.