Instagram Comment Scraper API
Our Instagram comment scraper takes a post or reel URL (or a shortcode) and returns the comments as clean JSON rows: the text, the author handle and id, the like count, and the timestamp, with a cursor to page through a long thread.
Why Instagram Comment data hides behind a login
A logged-out Instagram post page ships zero comment data: the comment thread loads over a separate authenticated request, and the media comments API requires a logged-in session. Our endpoint parses any embedded comment edges when they exist and otherwise calls that comments API in the documented shape, reporting a clear auth status rather than returning a fake thread.
Your first Instagram Comment Scraper API call
curl "https://api.instagramscraperapi.com/api/v1/instagram/comments?url=https://www.instagram.com/p/C5xExample/&api_key=$API_KEY" import requests, os
BASE = "https://api.instagramscraperapi.com"
API_KEY = os.environ["API_KEY"]
# Pass a post/reel URL or a bare shortcode, plus a page size.
data = requests.get(
f"{BASE}/api/v1/instagram/comments",
params={
"url": "https://www.instagram.com/p/C5xExample/",
"count": 50,
"api_key": API_KEY,
},
timeout=60,
).json()
for c in data["comments"]:
print(c["author"]["username"], "-", c["text"], f"({c['likes']} likes)")
# Page further with the returned cursor when more are available.
while data.get("has_more"):
data = requests.get(
f"{BASE}/api/v1/instagram/comments",
params={"url": data["url"], "min_id": data["next_min_id"], "api_key": API_KEY},
timeout=60,
).json()
for c in data["comments"]:
print(c["author"]["username"], "-", c["text"]) Parameters
| Parameter | Required | Default | Notes |
|---|---|---|---|
url | required | - | A post or reel permalink, e.g. https://www.instagram.com/p/C5xExample/ or a /reel/ link. Required unless you pass shortcode. |
shortcode | optional | - | The post shortcode (the /p// slug) on its own. One of url or shortcode is required. |
count | optional | 50 | How many comments to pull this call, 1 to 200. |
min_id | optional | - | The pagination cursor. Pass the next_min_id from the previous response to fetch the next page of comments. |
country | optional | US | Two-letter country code for the egress region. Defaults to US. |
api_key | required | - | Your API key, passed as a query parameter. Get one free at signup. |
What the Instagram Comment Scraper API hands back
{
"shortcode": "C5xExample",
"media_id": "3312345678901234567",
"url": "https://www.instagram.com/p/C5xExample/",
"source": "instagram",
"comments": [
{
"position": 1,
"id": "17954321098765432",
"text": "Incredible shot!",
"created_at": "2026-03-31T14:22:05.000Z",
"likes": 12,
"author": {
"id": "1748234592",
"username": "space_explorer",
"profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/example.jpg",
"is_verified": false,
"url": "https://www.instagram.com/space_explorer/"
}
}
],
"comments_count": 50,
"has_more": true,
"next_min_id": "QVFE...",
"data_source": "v1_api"
} | Field | Type | Description |
|---|---|---|
shortcode | string | The post shortcode the comments belong to. |
media_id | string | The numeric media id resolved for the post, used to call the comments API. |
url | string | The canonical post permalink. |
comments | array | The comment rows for this page. Each carries position, id, text, created_at, likes, and a nested author object. |
author | object | Per comment: the commenter's id, username, profile_pic_url, is_verified flag, and profile url. |
comments_count | integer | Number of comment rows returned on this page (one page per call). |
has_more | boolean | True when another page of comments is available, false or absent on the last page. |
next_min_id | string | Cursor for the next page. Pass it back as min_id, or null when there are no more. |
data_source | string | embedded when the first page came from comment edges on the post page, v1_api when it came from the media comments API hop. |
Where teams point Instagram data
Sentiment analysis
Community management
Giveaway and contest checks
Influencer engagement audits
Trend and topic mining
Feedback pipelines
How our Instagram Comment Scraper API stays reliable
We resolve the post's numeric media id and read the comment thread in Instagram's documented shape, mapping each comment to a stable row with its author, likes, and timestamp, and paging with a cursor. Instagram gates comments behind a logged-in session, so on the logged-out tier the endpoint reports an honest auth status rather than a fabricated thread, and a request that cannot return comments is not billed.
URL or shortcode input
Embedded-first parsing
Cursor pagination
Structured comment rows
Honest auth reporting
Pay for success
Instagram Comment Scraper API weighed against the Instagram API and DIY
| Our API | DIY (requests / headless) | Instagram Graph API | |
|---|---|---|---|
| Comment rows | Documented shape, cursor paged | You script the app endpoint yourself | Only on media you own or manage |
| Media id resolution | URL or shortcode to media id, automatic | You resolve the id yourself | Not applicable |
| Setup | API key only | Residential proxies, session handling, parsers | Facebook app, linked Business account, app review |
| Login gate | Reported honestly when Instagram walls comments | You hit the wall and handle it yourself | Not exposed for third-party media |
| Anti-bot and proxies | Built in, residential US | You build and maintain it | Not applicable |
| Billing | Only successful pages are charged | You eat the cost of blocked calls | Not applicable |
Pay only for what you pull
| Plan | Price | Best for |
|---|---|---|
| Free | 1,000 requests | Testing and small jobs |
| Pro | $0.60 / 1k | Production workloads |
| Pay-as-you-go | $0.90 / 1k | Spiky or one-off volume |
Median response 2.6s. You only pay for successful requests.
FAQ
An Instagram comment scraper is a tool that reads the comments on a post and returns each one in a structured format. Our endpoint takes a post or reel URL (or a shortcode), resolves the media id, and returns comment rows with the text, author handle and id, like count, and timestamp as JSON, plus a cursor to page through a long thread.
Only in limited cases, and we are direct about it. A logged-out post page ships zero comment edges, and the media comments API requires a logged-in session. Our endpoint first parses any embedded comment edges on the rare capture that includes them, then calls the comments API in the correct shape. When Instagram gates the thread it reports an honest auth status rather than inventing comments. A fully populated comment thread needs an authenticated session.
It returns a classifiable auth status indicating comments need an authenticated session, along with the shortcode and the resolved media id where available, so you know how far the resolution got. It never fabricates comment rows, and a request that cannot return comments is not billed.
Each successful call returns one page of comments plus a next_min_id cursor and a has_more flag. To fetch the next page, pass next_min_id back as the min_id parameter. Every page is one flat charge, so there is no server-side deep loop and no surprise multi-page bill.
Yes. The official Instagram Graph API returns comments for media on accounts you own or manage, after you set up a Facebook app, link a Business or Creator account, and pass app review. It does not return comments on arbitrary third-party posts, which is where a scraper API applies, subject to the login gate described above.
Scraping publicly visible data is broadly permitted in many jurisdictions, and US courts have declined to treat collecting public data as unauthorized access. Comments can contain personal data and usernames, though, and Instagram's terms restrict automated collection and gate the comments API behind a login. Accessing data behind authentication you are not authorized to use can cross into unauthorized access, so use comment data only where you have a lawful basis, comply with GDPR and CCPA, and take your own legal advice.