How to Scrape Instagram in 2026: A Developer's Guide
Scrape Instagram profiles, posts, and comments in 2026 without a browser: the official Graph API limits, the DIY realities, and a working API tutorial with real code and a real response.
The quickest way to scrape Instagram in 2026 is a single GET request to a data API, no browser automation and no logged-in session. Here is the whole thing:
curl "https://www.socialcrawl.dev/v1/instagram/profile?handle=nasa" \
-H "x-api-key: sc_your_api_key_here"
That returns a normalized profile: follower count, bio, verification, post count, and a computed engagement_rate, for 1 credit. The rest of this guide is the honest version of the question: what the official Instagram API does and does not allow, what building your own scraper actually costs you in maintenance and legal exposure, and how to pull profiles, posts, and comments through a real endpoint with runnable Python, Node, and curl.
Stack: Python 3.10+ or Node 18+ · requests / fetch · a SocialCrawl API key (free tier: 100 credits, no card)
Can you get Instagram data from the official API?
Mostly no, and this is the part every honest guide has to lead with.
Instagram's only official API is the Graph API, and it is built for managing accounts you already control, not for reading other people's. To use it you need an Instagram Business or Creator account, a linked Facebook Page, a Meta developer app, and, for most useful permissions, App Review, where Meta inspects your use case before granting access. Even then, the data is scoped to your own account and accounts that explicitly authorize your app. There is no official endpoint that takes an arbitrary username and returns that public profile's followers, posts, or comments. The older Basic Display API, which came closest to a personal-account read, was deprecated in December 2024.
So if your job is competitor analysis, creator discovery, influencer vetting, or feeding public post data into a pipeline, the Graph API does not cover it. That is not a loophole you are missing. It is the stated scope of the product.
Should you build your own Instagram scraper?
The DIY route is real, and for some teams it is the right call. It is worth being clear-eyed about what it involves.
Anti-bot reality. Instagram is a heavily defended single-page app. Scraping it yourself means driving a headless browser (Playwright or Selenium) or reverse-engineering the private GraphQL endpoints its web client calls. Both paths run into rate limiting, device and session fingerprinting, challenge screens, and login walls that trip the moment traffic looks automated. Residential proxies and rotating sessions push the success rate up but never to 100 percent, and every improvement Instagram ships to its defenses is a bug you now own.
Maintenance. The private endpoints and the DOM change without notice. A scraper that works today can silently return empty results next week, so you also need monitoring to notice when it breaks. In practice a self-maintained Instagram scraper is a subscription paid in engineering hours rather than dollars.
Legal considerations. Scraping publicly accessible data has repeatedly survived legal challenge in US courts, most notably the hiQ Labs v. LinkedIn line of cases. That is not a blanket permission slip. Instagram's Terms of Use prohibit automated collection, so ToS exposure is real; and the data you collect (profiles, comments) is personal data, which brings GDPR and CCPA obligations depending on your jurisdiction and use case. A data API does not make any of this go away, and no tool can honestly promise it "gets around" Instagram's terms. What a good API does is handle the collection infrastructure and give you a stable contract, so the engineering problem shrinks to the legal and product questions that are actually yours to answer. Read the legal and technical guide to social media scraping before shipping anything commercial.
The rest of this guide takes the third route: a maintained data API that returns public Instagram data in a normalized shape, so you write against a schema instead of a moving target.
Setting up: one key, one request
Get an API key at socialcrawl.dev, sign up, then open Dashboard → API Keys. Keys look like sc_ followed by 32 random bytes and are shown in full once, so copy it immediately. New accounts get 100 free credits that never expire, and an Instagram profile call costs 1 credit, so the free tier covers 100 profile reads before you pay anything.
Keep the key out of source control:
export SOCIALCRAWL_API_KEY=sc_your_api_key_here
If you would rather see the response shape before writing any code, paste an Instagram URL into the Visual Explorer and the unified schema renders instantly.
Scraping an Instagram profile
The endpoint is GET /v1/instagram/profile. It takes one required parameter, handle (the username, no @), and returns the normalized author object plus computed fields.
import os
import requests
API_KEY = os.environ["SOCIALCRAWL_API_KEY"]
BASE = "https://www.socialcrawl.dev/v1"
resp = requests.get(
f"{BASE}/instagram/profile",
params={"handle": "nasa"},
headers={"x-api-key": API_KEY},
timeout=30,
)
profile = resp.json()["data"]["author"]
print(profile["username"], profile["followers"], "followers")
The same call in Node:
const res = await fetch(
"https://www.socialcrawl.dev/v1/instagram/profile?handle=nasa",
{ headers: { "x-api-key": process.env.SOCIALCRAWL_API_KEY } },
);
const { data } = await res.json();
console.log(data.author.username, data.author.followers, "followers");
Here is a real, unmodified response captured with a live dev key in July 2026 (the avatar URL is truncated for readability):
{
"success": true,
"platform": "instagram",
"endpoint": "/v1/instagram/profile",
"data": {
"author": {
"id": "528817151",
"username": "nasa",
"display_name": "NASA",
"avatar_url": "https://scontent-bos5-1.cdninstagram.com/...",
"bio": "Making the seemingly impossible, possible. ✨",
"verified": true,
"followers": 104307024,
"following": 91,
"posts_count": 4853,
"url": "https://www.nasa.gov/",
"private": false
},
"computed": {
"engagement_rate": 0.001932,
"language": "en",
"content_category": "other"
}
},
"credits_used": 1,
"credits_remaining": 184262,
"request_id": "req-r39sVIBk8ddNwGBl"
}
Two things worth noting. First, computed.engagement_rate is calculated server-side from recent posts, so you do not derive it from raw counts yourself. Second, the author field names here (username, followers, verified, bio) are identical across all 44 platforms, so the parser you write for Instagram works unchanged when you add TikTok or Twitter later.
Scraping Instagram posts and comments
Profiles are the front door. The two follow-on reads most projects need are a profile's posts and a post's comments, and both paginate with a cursor.
GET /v1/instagram/profile/posts lists a public account's posts. You pass handle, read data.items, and pass data.next_cursor back as cursor on the next request until it disappears:
def scrape_instagram_posts(handle: str, max_pages: int = 10) -> list[dict]:
posts, cursor = [], None
for _ in range(max_pages):
params = {"handle": handle}
if cursor:
params["cursor"] = cursor # pass next_cursor back verbatim
payload = requests.get(
f"{BASE}/instagram/profile/posts",
params=params,
headers={"x-api-key": API_KEY},
timeout=30,
).json()
if not payload.get("success"):
raise RuntimeError(payload["error"]["message"])
posts.extend(payload["data"]["items"])
cursor = payload["data"].get("next_cursor")
if not cursor:
break
return posts
To read the comments on a specific post, GET /v1/instagram/post/comments takes the post url and paginates the same way. Every comment arrives in the canonical comment shape (text, author.username, engagement.likes, published_at), the same object the TikTok, YouTube, and Reddit comment endpoints return, so the export code you write once transfers across platforms.
The max_pages guard is not decoration. Each page is 1 credit, and a popular account can carry thousands of posts, so decide your per-account budget up front and encode it in the loop.
Pagination, rate limits, and credits
Three operational facts to build around, all from the live API:
- Pagination is a cursor contract. The response field is always
data.next_cursor; you pass it back as thecursorparameter, verbatim, with no decoding or arithmetic, and stop when it isnull. The exact parameter name per endpoint is listed on the pagination page. - There is no requests-per-minute quota. The only throughput ceiling is 50 concurrent requests per API key; exceed it and you get a
429 CONCURRENCY_LIMITenvelope with no credits charged. A worker pool below 50 stays comfortably inside it. - Failures refund credits. Errors use the same envelope with
success: falseand a typed error object. Empty-upstream404s and transient502/503s automatically refund the credit, so a retry wrapper never double-spends. The full matrix is in the error handling docs.
The credit math stays flat because Instagram profile, posts, and comments are all Standard-tier at 1 credit per page. A hundred profiles is 100 credits; the free tier covers it. Past that, pricing is pay-as-you-go and credits never expire: £15 buys 2,500 credits, £49 buys 20,000.
Where to go from here
You now have Instagram profiles, posts, and comments coming back in one schema for 1 credit each, without maintaining a browser farm. Natural next steps:
- Browse the rest of the surface on the Instagram platform page: reels, followers, hashtag search, stories, and media transcripts, all in the same envelope.
- Check a single account without integrating using the free Instagram engagement rate calculator, or track who stopped following you with the Instagram unfollower checker.
- Compare the paid options in the best Instagram data APIs roundup, or read the wider Instagram scraping guide for the full technical picture.
- Start on the free tier: 100 credits, no card is a hundred profile reads, enough to find out whether the data answers your question.
Frequently asked questions
Is it legal to scrape Instagram?
Scraping publicly accessible data has repeatedly survived legal challenge in US courts (the hiQ v. LinkedIn line of cases), but that is not blanket permission. Instagram's Terms of Use prohibit automated collection, so ToS exposure is real, and profile and comment data is personal data that brings GDPR and CCPA obligations depending on your jurisdiction and use case. No API can honestly claim to get around Instagram's terms. Read the legal and technical guide before anything commercial, and talk to a lawyer if revenue depends on the answer.
Can you scrape Instagram without logging in?
Yes, if you use a data API. A third-party API operates its own collection infrastructure and returns public Instagram data through your API key, so you never handle Instagram login, cookies, or sessions. A DIY browser scraper, by contrast, increasingly hits login walls on public pages, which is one of the main reasons the API route is simpler.
Is there an official Instagram API for scraping profiles?
No. Instagram's Graph API only reads accounts you own or manage and requires a business or creator account plus Meta app review. There is no official endpoint that returns an arbitrary public profile's data, which is exactly why third-party data APIs exist for that use case.
How do you scrape Instagram followers and comments?
Through dedicated endpoints. Followers come from the Instagram followers endpoint and comments from GET /v1/instagram/post/comments, both paginating with the same cursor contract as profile posts. Each page costs 1 credit and returns a normalized list you can export to CSV without per-platform parsing.
Do I need Instagram's approval to use an Instagram scraper API?
No. The approval gate (business verification, app review) applies to Instagram's own Graph API. A third-party data API is a separate service you sign up for directly, so the key works in minutes rather than after a review process.
What is the best language for scraping Instagram?
Any language that can make an HTTP request. The endpoint is one authenticated GET, so Python with requests, Node with fetch, or a plain curl command all work identically. The response envelope and cursor pagination are the same regardless of language.
How much does it cost to scrape Instagram?
On SocialCrawl, Instagram profile, posts, and comments are 1 credit per page. The free tier is 100 credits (no card, never expires); after that £15 buys 2,500 credits and £49 buys 20,000, pay-as-you-go with no expiry. DIY scraping has no per-call fee but costs proxy subscriptions plus ongoing maintenance time.
Related posts
Best Amazon Product Data APIs: Pricing Compared (2026)
Amazon product API pricing compared across 7 providers in 2026. SocialCrawl, Rainforest, Oxylabs, Bright Data, Apify, ScraperAPI, and Canopy, ranked on price per request, field depth, and free tier.
Best App Store & Google Play Review APIs (2026): Pricing Compared
Apple's and Google's official APIs only return reviews for apps you own. Here are the APIs that read App Store and Google Play reviews for any public app, compared on price in 2026.
Best Facebook Data APIs for Developers (2026): Pricing Compared
The best Facebook data API in 2026 is SocialCrawl for unified public-page data without Graph API app review. 6 providers compared on pricing, coverage, and Ad Library access.
