Instagram Scraper: Public Profile Data via API
ProxyField's Instagram scraper is its Web Scraping API plus the parser on this page: you send a list of public usernames or URLs, the API returns each page for $0.50 per 1,000 successful results over plain HTTP ($2.00 with JS rendering), and the parser turns each profile into one row with the username, name, follower, following and post counts and a status. Which route fits depends on the job. For thousands to millions of public profiles, use the API. For a few hundred, run the same parser on ProxyField residential proxies and start with the Easy Trial: 1 GB for $2.95. For your own business account, use Meta's API. For follower lists, no logged-out tool works, because Instagram shows them only to logged-in users.
Through the sales team on our 24/7 live chat
| Fetch | Entry | Volume, from |
|---|---|---|
| HTTP | $0.50 | $0.20 |
| JS rendering | $2.00 | $1.00 |
Billed on successful results only.
One profile becomes one row (illustrative numbers):
{"username": "example_brand", "status": "OK", "name": "Example Brand", "followers": 12500, "following": 310, "posts": 482}ProxyField has no Instagram-only API. The Web Scraping API fetches any URL, and this page shows what an Instagram profile or post page holds, how to parse it into rows and what it costs.
Which Instagram scraper is best for your job?
Pick by volume and by whose accounts you need. For profile, post and follower data:
| Your job | Best fit | Cost | What you get |
|---|---|---|---|
| Thousands to millions of public profiles and posts | ProxyField Web Scraping API + the parser below | $0.50 per 1,000 pages over plain HTTP; $2.00 with JS rendering | one row per profile: username, name, the 3 counts, status; posts with JS rendering |
| A few hundred public profiles, your own code | The same parser on ProxyField residential or mobile proxies | $2.95/GB for 1 GB, from $1.95/GB; traffic never expires | the same rows, through a new IP per request |
| Your own business or creator account | Meta's Instagram API | set by Meta | insights and media of your account |
| Lists of who follows an account | No logged-out tool | none | not shown to logged-out visitors |
Read moreShow less
A ready-made scraper that hands you parsed rows saves you the parsing. With the Web Scraping API you pay per fetched page, keep the parser below, and the same API and balance work for every other site you collect. No Instagram account is involved: the scraper reads what Instagram shows a visitor without one, so your own account stays out of it.
Limits of any logged-out Instagram scraper:
- Follower and following lists not returned. Instagram shows them only to logged-in users; the counts are on the profile.
- Private accounts only the header (name and counts), no posts.
- Posts per profile only the posts the profile grid loads without scrolling, with JS rendering; the cost examples on this page count the 12 latest. Older posts need their own post URLs.
- Media links image and video URLs are signed and stop working after a while, so store the post URL.
- Stories and messages not returned.
What one row holds
| Key | Value | From |
|---|---|---|
username | the account name in the URL | your input list |
status | OK, NOT_FOUND, RATE_LIMITED, LOGIN_WALL or PARSE_FAILED | the HTTP status and the page |
name | the display name | og:title |
followers, following, posts | whole numbers; "12.5K" becomes 12500 | og:description |
Each run writes the rows to a CSV file that opens in Excel or Google Sheets (the parser).
Does Instagram's official API give you other accounts' posts and follower counts?
No for personal accounts, and only partly for business and creator accounts; for anything else you need a scraper. Meta's Instagram API gives full data for professional accounts you own or manage. For other accounts, Business Discovery (the business_discovery field on the IG User endpoint) returns basic public data, such as the follower count and recent media, and only for business and creator accounts. It needs a Meta app and an Instagram professional account of your own. Personal accounts are not covered: Meta shut down the Instagram Basic Display API on December 4, 2024.
| Item | Instagram API (Meta) | Web Scraping API (ProxyField) |
|---|---|---|
| Your own professional accounts | Yes: media, insights, follower count | Public pages only |
| Posts of someone else's account | Business and creator accounts only, through Business Discovery (basic data) | The public post pages Instagram serves to logged-out visitors |
| Follower count of someone else's account | Business and creator accounts only, through Business Discovery | On the public profile page, when Instagram serves it |
| Personal accounts | Not covered since the Basic Display API shut down (December 4, 2024) | Public profiles only |
| Follower lists of other accounts | Not provided | Not collected: shown only to logged-in users |
| Setup | A Meta app, a professional account of your own, Meta's permissions | A URL per page |
| Cost | Set by Meta | $0.50 per 1,000 successful results, from $0.20 |
Sources: Meta's IG User Business Discovery reference, its Instagram Platform documentation and its update on the Instagram Basic Display API. Meta changes these terms; check its current documentation before you build on them.
Instagram profile fields you get
The Web Scraping API returns the page; the fields below are what a public Instagram page shows a logged-out visitor, and what the parser on this page reads. The API returns the page itself as HTML, Markdown or plain text, or a JSON envelope with the status code, the final URL, the headers, the cookies and the content; it has no parsed Instagram fields, so your parser reads them.
| Field | Where it is on the page | Plain HTTP or JS rendering | Partial data |
|---|---|---|---|
| Username | the URL and the og:title meta tag | plain HTTP | none |
| Display name | og:title ("Name (@username)") | plain HTTP | empty if the account set none |
| Followers, following, posts | og:description ("… Followers, … Following, … Posts") | plain HTTP | large counts may be abbreviated, such as 12.5K or 1.2M |
| Bio | the description meta tag, after the counts | plain HTTP | may be cut short |
| External link, category, verified badge | the rendered profile header | JS rendering | category only on business and creator accounts |
| Latest posts in the grid | the rendered grid: post URLs instagram.com/p/<code>/ | JS rendering | only the posts the grid loads |
| Post caption, date, like and comment counts | each post page | plain HTTP or JS rendering | like counts the owner hid are not shown |
| Reel caption, date, counts | each reel page instagram.com/reel/<code>/ | JS rendering if counts are missing | as shown |
Besides the limits above, a logged-out scraper also misses email addresses a business has not put in its bio, and a profile when Instagram answers with a login prompt instead. Against login prompts, collect at a steady rate across many IPs, not in bursts.
More on the proxy side and logged-out access: Instagram proxies.
Parse Instagram profiles into rows
This script takes a list of usernames, fetches each public profile and writes one row per profile to profiles.csv, with a status. It parses a page from the Web Scraping API the same way as a page from your own request through ProxyField proxies.
Read moreShow less
import csv, re, time
import requests
from bs4 import BeautifulSoup
FIELDS = ["username", "status", "name", "followers", "following", "posts"]
def count(s): # "12.5K" -> 12500, "1,204" -> 1204
s = s.replace(",", "")
mult = {"K": 1_000, "M": 1_000_000, "B": 1_000_000_000}.get(s[-1:], 1)
return int(float(s.rstrip("KMB")) * mult)
def parse_profile(html, url, status_code, username):
row = {"username": username, "status": "OK"}
if status_code == 404:
return {**row, "status": "NOT_FOUND"}
if status_code == 429:
return {**row, "status": "RATE_LIMITED"}
if "/accounts/login" in url:
return {**row, "status": "LOGIN_WALL"}
soup = BeautifulSoup(html, "html.parser")
og = soup.find("meta", property="og:description")
title = soup.find("meta", property="og:title")
m = og and re.match(r"([\d.,]+[KMB]?) Followers, ([\d.,]+[KMB]?) Following, ([\d.,]+[KMB]?) Posts",
og["content"])
if not m:
return {**row, "status": "PARSE_FAILED"}
row["followers"], row["following"], row["posts"] = (count(g) for g in m.groups())
row["name"] = title["content"].split(" (@")[0] if title else None
return row
proxy = "http://<login>-country-us-city-new_york:<password>@gate.proxyfield.io:7000"
usernames = ["example_brand", "another_account"] # your input list
with open("profiles.csv", "w", newline="") as f:
out = csv.DictWriter(f, fieldnames=FIELDS)
out.writeheader()
for username in usernames:
resp = requests.get(f"https://www.instagram.com/{username}/",
proxies={"http": proxy, "https": proxy},
headers={"User-Agent": "Mozilla/5.0", "Accept-Language": "en-US"},
timeout=30)
out.writerow(parse_profile(resp.text, resp.url, resp.status_code, username))
time.sleep(3) # a steady rate, not a burst
# profiles.csv:
# username,status,name,followers,following,posts
# example_brand,OK,Example Brand,12500,310,482The statuses tell you what to retry:
| Status | Meaning | What to do |
|---|---|---|
OK | the counts and name were read | store the row with the date |
NOT_FOUND | HTTP 404: the account does not exist or was renamed | drop it or check the new name |
RATE_LIMITED | HTTP 429: too many requests from one IP | wait, then send it again; the gateway gives a new IP on every request |
LOGIN_WALL | Instagram redirected to /accounts/login | wait, then send it again through a new IP |
PARSE_FAILED | the page came back without the count tags | Instagram changed the page: check the meta tags by hand |
We tested the parser offline on sample pages (2026-10-25): "12.5K" gives 12500, "672M" gives 672000000, "1,204" gives 1204, and a login redirect gives LOGIN_WALL. For the bio, read the description meta tag the same way. For the post grid, render the page in Puppeteer or Playwright with the same proxy.
Pricing: what one Instagram profile costs
Profiles cost $0.50 per 1,000, profiles with their 12 latest posts $6.50 per 1,000, and follower lists are not available at any price. Those are the entry prices over plain HTTP. One result is one fetched page, not one parsed profile: you parse the counts, bio and links from it, and the follower count comes with its page.
The entry price applies up to the volume tier. You pay only for successful results: a request that fails is not billed. Billed: a page Instagram answered with a 2xx status. Not billed: blocked requests, timeouts and errors on our side; a blocked request is retried on new IPs, and the retries are not billed. Every response says whether it was billed. A target's 404 or 410, and a sign-in page the site serves with a 200 status, count as billed results.
| Unit | Plain HTTP | JS rendering |
|---|---|---|
| Entry price per 1,000 successful results | $0.50 | $2.00 |
| Volume price per 1,000 | $0.20 | $1.00 |
| Volume price starts at | 10,000 successful results in one purchase | the same |
| Profiles | Plain HTTP, $0.50 | Plain HTTP, volume price $0.20 | JS rendering, $2.00 | JS rendering, volume price $1.00 |
|---|---|---|---|---|
| 1,000 | $0.50 | $0.20 | $2 | $1 |
| 10,000 | $5 | $2 | $20 | $10 |
| 100,000 | $50 | $20 | $200 | $100 |
| 1,000,000 | $500 | $200 | $2,000 | $1,000 |
Profiles with their posts. A profile plus its 12 latest posts is 13 pages. 1,000 such profiles are 13,000 pages: $6.50 over plain HTTP or $26 with JS rendering, at the entry prices.
A recurring job. 2,000 profiles plus their 12 latest posts, checked weekly, is 26,000 pages a week, or 104,000 pages over 4 weekly runs. If every page succeeds, that costs $52 a month over plain HTTP or $208 with JS rendering; at the volume prices, $20.80 or $104. Failed pages are not billed, so a run with retries costs no more.
Follower lists: no price, because Instagram shows them only to logged-in users. Follower counts: included in each profile page.
Running your own scraper instead? Then you pay for proxy traffic, not results: residential proxies cost $2.95/GB for 1 GB and from $1.95/GB at 1,000 GB. Your cost is pages × average page size × price per GB. For example, if a profile page weighs 300 KB (an assumption, not a measurement), 1,000 profiles are about 0.3 GB: about $0.89 at $2.95/GB, or $0.59 at $1.95/GB. Measure the real size through the proxy with curl -s -o /dev/null -w "%{size_download}\n" before you plan a large run.
Payment and balance: the same crypto balance as proxies, which never expires; there is no subscription or monthly fee. All prices: pricing.
Through the sales team on our 24/7 live chat
Sales contact: the sales team on our 24/7 live chat.
How to fetch Instagram profiles with the API
-
Collect the public profile or post URLs you need, such as
https://www.instagram.com/<username>/. -
Send each URL to the Web Scraping API: plain HTTP ($0.50 per 1,000) for the counts and bio, JS rendering ($2.00 per 1,000) for the post grid, the link and the badge.
-
Run the parser above on each page and store the row with the date.
-
Re-send the
RATE_LIMITEDandLOGIN_WALLrows later; you pay only for the pages that come back successfully.
The API takes a POST to https://api.proxyfield.io/v1/scrape with your API key in an Authorization: Bearer <api_key> header and a JSON body: url, render (false for plain HTTP, true for JS rendering), country and output (html, markdown, text or json). For the post grid, which Instagram builds with scripts, wait_for takes a CSS selector to wait for before the rendered page is returned. Parameter reference: API documentation.
# The request the Web Scraping API takes (access through Contact sales)
curl https://api.proxyfield.io/v1/scrape \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.instagram.com/example_brand/", "render": false, "country": "us", "output": "json"}'Example response (shortened; content is the page's HTML, which the parser above reads):
{
"metadata": {"id": "req_9a1d6e2f40c8b375", "api": "web_scrape", "status": "success", "billed": true},
"status_code": 200,
"final_url": "https://www.instagram.com/example_brand/",
"content_type": "text/html; charset=utf-8",
"content": "<!DOCTYPE html><html class=\"_9dls\" lang=\"en\">…</html>"
}Scrape Instagram with your own script and ProxyField proxies
For a few hundred public profiles, the parser above with a rotating residential or mobile IP is enough: Instagram limits logged-out page views per IP, so use a new IP for each request and pause between them.
ProxyField residential proxies cost $2.95/GB for 1 GB and from $1.95/GB at volume; mobile proxies on 5G, 4G and LTE carrier networks cost $3.45/GB for 1 GB and from $2.45/GB. There is no subscription, the traffic never expires, and all purchases are final. You get 412M+ residential and 10.2M+ mobile IPs over HTTP, HTTPS or SOCKS5 at gate.proxyfield.io:7000, with a new IP on every request or sticky sessions from 30 s to 36 h. More on proxy types: mobile proxies.
Instagram's terms and the law
Instagram's Terms of Use forbid collecting information in an automated way without Meta's permission, so scraping breaches its terms even where the data is public. In hiQ Labs v. LinkedIn (2022), the US Ninth Circuit treated logged-out collection of public profiles differently from access behind a login, and in the EU and UK profile data is personal data, so you need a lawful basis and should keep only what you use. More: Is It Legal to Scrape LinkedIn, Instagram, X and Other Social Media? and Is Web Scraping Legal? US, EU and UK Rules (2026).
ProxyField's acceptable use policy allows collecting public web data and managing your own or your clients' accounts, one IP per account; some site categories are restricted to protect the network, including financial and government services. Not allowed: spam, fraud including fake accounts or engagement, and accessing data behind logins you are not entitled to. ProxyField's rule for every site: public pages only, and follow the site's terms. This is not legal advice.
More scraper APIs
- Web Scraping API any URL, plain HTTP or with JS rendering.
- TikTok scraper the other public social pages.
- Facebook scraper the other public social pages.
- X (Twitter) scraper the other public social pages.
- Social media scraper several networks in one workflow.
- ChatGPT scraper API the ChatGPT answer, $1.50 per 1,000 successful results, from $1.00.
- All scraper APIs
Instagram Scraper FAQ
24/7 support by live chat, including help with setup and integration.
What's the best Instagram scraper for collecting profile, post and follower data?
ProxyField's Web Scraping API with the parser on this page returns one row per public profile (username, name, follower, following and post counts, and a status) for $0.50 per 1,000 successful results over plain HTTP, or $2.00 with JS rendering for the post grid. The rows go to a CSV file. For a few hundred profiles, run the same parser on ProxyField proxies from $1.95/GB. Follower lists are shown only to logged-in users, so no logged-out scraper returns them.
How much does it cost to scrape Instagram profiles and follower lists at scale?
At ProxyField, profiles cost $0.50 per 1,000, and profiles with their 12 latest posts cost $6.50 per 1,000 (13 pages each), over plain HTTP at the entry price. Follower lists are not available at any price, because Instagram shows them only to logged-in users. At scale, 100,000 profiles cost $50 ($20 at the volume price) and 1,000,000 cost $500 ($200); with JS rendering, $200 and $2,000.
Does Instagram's official API let me pull other accounts' posts and follower counts, or do I need a scraper for that?
No for personal accounts, and only partly for business and creator accounts: Business Discovery (the business_discovery field on the IG User endpoint) returns their follower count and recent media through a Meta app with your own professional account. Personal accounts are not covered, since Meta shut down the Basic Display API on December 4, 2024. For those, or for more than the basic fields, you need a scraper that reads the public pages.
Do I pay for failed Instagram requests?
No. The ProxyField Web Scraping API is billed on successful results only, at $0.50 per 1,000 over plain HTTP or $2.00 with JS rendering. A request that fails costs nothing.
How do I scrape Instagram?
Collect the public URLs you need, fetch each one logged out through rotating IPs, and read the data from the page's meta tags or the rendered page. Keep the rate low, because Instagram asks logged-out visitors to log in after a burst of requests.
What data can an Instagram scraper collect?
From public accounts: username, name, bio, link, category, verified badge, follower, following and post counts, and each public post's caption, hashtags, date, like and comment counts and media. Not stories, private accounts, follower lists or messages.
How do I scrape an Instagram profile?
Request instagram.com/<username>/ and read the og:description meta tag, which holds the follower, following and post counts when Instagram serves the profile, plus og:title for the name. On the Web Scraping API, that page costs $0.50 per 1,000 over plain HTTP or $2.00 with JS rendering.
How do I scrape Instagram with Python?
Use requests with a rotating residential or mobile proxy and parse the profile page with Beautiful Soup, as the parser on this page does; it returns one JSON row per profile with a status. For the post grid, which loads in the browser, use Playwright or Puppeteer with the same proxy.
Can I export scraped Instagram profiles to CSV or Excel?
Yes. The script on this page writes one row per profile to profiles.csv, with the username, status, name and the follower, following and post counts, and the file opens in Excel or Google Sheets. The pages come from the ProxyField Web Scraping API at $0.50 per 1,000 or through ProxyField proxies.
Do I need proxies to scrape Instagram?
For more than a few pages, yes: Instagram limits logged-out requests per IP. Rotate residential or mobile IPs, such as ProxyField's from $1.95/GB residential, or use the Web Scraping API and skip the proxies.
Show 11 more questionsShow fewer questions
How do I scrape Instagram posts?
Fetch each public post at instagram.com/p/<code>/ and read the caption, date, counts and media URLs. To find the posts, start from the profile, whose post grid needs JS rendering ($2.00 per 1,000 pages).
How do I scrape Instagram comments?
A public post shows its comment count and some comments to logged-out visitors; the full thread needs a login. Collect what the public post page shows, and treat commenters' names as personal data.
How do I scrape Instagram followers?
You can collect the follower count from any public profile, but not the list of followers: Instagram shows that list only to logged-in users. Tools that export follower lists log in with an account, which breaks Instagram's terms; ProxyField's acceptable use policy forbids accessing data behind logins you are not entitled to.
How do I scrape Instagram reels?
Each public reel has its own URL (instagram.com/reel/<code>/) with the caption, date and the counts Instagram shows. Fetch it with JS rendering if the counts are missing from the plain HTML.
Can I scrape Instagram stories?
No: stories are shown only to logged-in users and expire after 24 hours unless saved as highlights. Collecting them means automating an account, which is out of scope.
Can I scrape an Instagram hashtag?
Instagram limits hashtag pages for logged-out visitors, so a hashtag feed is not a reliable source. Track hashtags through the public posts and profiles you already collect, and count the tags in their captions.
How do I scrape emails from Instagram?
Only an email address a business or creator wrote in its public bio is on the page; the contact buttons in the app are not part of the web profile. Using collected addresses for marketing needs a lawful basis under GDPR in Europe and must follow CAN-SPAM in the US.
Can I scrape private Instagram profiles?
No. Private profiles are visible only to approved followers, and getting around that means using an account to access data you are not entitled to, which ProxyField's acceptable use policy forbids.
How does Instagram block scrapers?
It limits logged-out page views per IP, answers fast traffic with a login prompt or an HTTP 429 error, and blocks IP ranges it links to automation. Rotating IPs and a low request rate help; with the Web Scraping API you pay only for successful results.
Do Instagram scraper Chrome extensions work?
They run inside your browser with your logged-in Instagram session, so the scraping happens on your account. That breaks Instagram's terms and can get the account restricted; a logged-out approach keeps your account out of it.
How can I scrape Instagram data for free?
A short Python script on your own IP can read a few public profiles at no cost until Instagram asks for a login. Beyond that you pay for IPs or an API; ProxyField's smallest purchase is 1 GB of residential traffic for $2.95, with no subscription.
Related pages
Collect Instagram pages with the Web Scraping API
Billed on successful results only. Contact sales for the Web Scraping API and the volume you need, or run your own scraper on residential proxies. 24/7 live chat helps with setup and integration.