One URL in. Clean JSON out.
Give this endpoint an Instagram post or reel URL and it returns the public comments on it as a JSON array, one object per comment. One call returns up to `limit` comments — there is no second page to fetch. Billing is per comment returned, at 3 credits each, so a 10-comment call costs 30 credits.
This fixed it for me, thank you
The difference
On the left, what a headless browser hands you. On the right, what the endpoint hands you.
<article class="_aagv _ab8w x1n2onr6" role="presentation"><div class="x9f619 xjbqb8w x78zum5"><div class="_aagu"><img alt="Photo by @creator" class="x5yr21d xu96u03" src="https://scontent.cdninstagram.com/v/t51...blob"/></div><section class="x6s0dn4 x78zum5 xdt5ytf"><span class="x1lliihq _aacl _aaco">55,210 likes</span><div class="_a9zs"><span dir="auto">Three settings you should change today</span></div><span class="_aacl _aaco x1i10hfl">View all 981 comments</span></section><time class="_aaqe" datetime="2026-07-03T12:00:00.000Z">18h</time></div><script type="application/json" data-sjs>{"require":[["ScheduledServerJS","handle",null,[{"__bbox"... {"data": [{"id": "c_9021","text": "This fixed it for me, thank you","author": {"handle": "dev.casey"},"likes": 412,"posted_at": "2026-07-01T09:12:00Z"}],"meta": {"count": 2,"limit": 50},"request_id": "req_01JZX4M8Q2TE9W"}
The payload
An array of comment objects. Each one carries the comment text, who wrote it, how many likes the comment picked up, when it was posted, and Instagram's own comment id. That is enough to run sentiment analysis, pull out the questions people keep asking, or spot the accounts that show up under every post a competitor publishes.
Comments come back in the order the platform serves them, which is Instagram's own ranking rather than strict chronology. Popular comments tend to surface first. If you need everything in time order, sort the returned array on posted_at yourself.
Replies are not separated out into a tree. A reply to a comment arrives as its own object in the flat array, and there is no parent id on the response, so you cannot reconstruct which top-level comment a given reply belongs to. Plan your analysis around the flat list.
ISO 8601 UTC timestamp for when the comment was written. Null on comments where no timestamp is published.
Pricing
Billing is per comment returned, about 1.5¢ each on the monthly plan, so a 20-comment call runs 60 credits — roughly 30¢. A post that returns zero comments still costs 1 credit.
Estimate only, on a full-year basis. 3 credits per returned comment. Monthly: $5 per 1,000 credits with $4/1,000 top-ups. Annual: $54 per 12,000 credits with $3/1,000 top-ups. We show whichever plan is cheaper for your annual volume, divided by 12. Failed calls are never charged; cache hits cost the same as fresh calls.
Entry price, side by side
Credits are not equivalent units across vendors — each meters differently. Price your own workload on both before deciding on entry price alone. At high volume, several of these are cheaper per credit than we are.
Engineering notes
We document exactly how every endpoint behaves — nulls, caching, billing — so what you ship on day one is still running in month six. No surprises, no support tickets.
Credits are charged per comment returned, at 3 credits per comment. Ask for 100 comments and you pay 300 credits, which is $1.50 on the monthly plan. There is no bulk discount past a certain page size and no cheaper 'count only' mode here.
For most analysis work the first 20 to 50 comments per post carry the signal. Pull a small limit first, look at what you got, and only raise the limit on the posts that turn out to matter. Asking for thousands of comments off a viral reel is a real invoice.
One call returns one array of up to `limit` comments and that is the whole result. No cursor, no page token, no offset comes back in the response, so there is nothing to pass to a follow-up call. If you want more comments than you got, raise `limit` and call again from the top.
Raising the limit re-fetches the thread from the beginning, so a second, larger call overlaps heavily with the first. Deduplicate on `id` when you merge them. Instagram also reorders comments as new ones arrive and old ones are deleted, so two calls a day apart will not line up item for item.
Instagram does not publish every comment to logged-out visitors. Comments hidden by the account's keyword filters, comments from accounts that blocked the poster, and comments on posts with comments disabled are simply absent. On very large threads the platform stops serving more after a few thousand.
Treat the result as a sample of public comments, not a census. If your analysis depends on completeness, say so in your own reporting rather than implying you have the full set.
Handles and comment bodies are written by real people. They are public, but public is not the same as unrestricted — GDPR and similar regimes still apply once you store them. Keep a retention window, honour deletion requests, and do not build a profile of an individual out of their comment history.
If you only need the language and not the identity, drop the author field on ingest. Most sentiment and topic work does not need it.
Responses sit in the fast cache class, so repeating the same URL and limit within the window returns in milliseconds and sets x-cache: hit. A cache hit is billed the same as a fresh call — the comments were still delivered. Add fresh=true to force a live pull when you are monitoring a post that is actively collecting comments.
Questions
Send a GET to /v1/instagram/comments with the post or reel URL and your API key. There is no Instagram login, no app review, and no OAuth involved. The endpoint reads the same public post page anyone can open in a browser, so it reaches public comments only. Comments on private accounts are not accessible and never will be through this API.
3 credits per comment returned. Credits are $0.005 each on the monthly plan and $0.0045 on annual, so one comment is about 1.5 cents and 100 comments run roughly $1.50. Because billing is per item, the limit parameter is the main lever on your bill. Failed calls are never charged, and a call that returns zero comments costs nothing.
Replies come back mixed into the same flat array as top-level comments, but the response has no parent id, so you cannot rebuild the reply tree from it. If a reply is what you want, you will get its text, author, likes and timestamp — you just will not know which comment it was answering. For thread-shaped analysis, work from the flat list.
As many as one call returns, which you cap with `limit` — the maximum accepted is 500. There is no cursor and no second page, so a single call is the whole result set. On small posts that is the entire thread. On posts with tens of thousands of comments the platform stops serving more after a few thousand anyway, and no scraper gets past that without a logged-in session, which we do not use. Budget for a large but partial sample rather than a complete one.
No. They arrive in the platform's own ranking, which pushes popular and recent comments toward the front. Sort the returned array on posted_at if you need true chronology. Note that posted_at can be null on some comments, so decide up front whether those go to the top, the bottom, or into a separate bucket.
Yes, that is one of the most common uses. The text field gives you the raw string including emoji, and posted_at lets you plot sentiment over time. Two practical notes: emoji carry a lot of the sentiment on Instagram, so do not strip them before scoring, and comment spam ('DM me', follow-for-follow) will skew a naive model unless you filter it first.
This endpoint returns the comments themselves and bills per comment. The Instagram Stats API returns the post's own metrics — likes, comment count, caption, author — as a single object at a flat cost. If you only need to know how many comments a post has, use Post Stats. Fetching every comment just to count them is the expensive way to get one number.
Next
100 trial credits on signup — no card, key on screen immediately.