One URL in. Clean JSON out.
Give it the URL of a public Instagram post, Reel or carousel and get the engagement numbers back as JSON. 1 credit per post, no Graph API app review, no Business account linkage, no headless browser to keep alive. The call reads the same public page you would open yourself.
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": {"platform": "instagram","entity_id": "C8xQvZ2sVAb","url": "https://www.instagram.com/reel/C8xQvZ2sVAb/","author": {"handle": "instagram","name": "Example Creator"},"posted_at": "2026-06-30T14:05:00Z","metrics": {"views": 1204593,"likes": 88410,"comments": 2314,"shares": 10092}},"request_id": "req_01JZX4M8Q2TE9W"}
The payload
One object per post. Likes and comments, the caption and its hashtags, the media type, when it went up, who posted it, and a thumbnail URL. That is enough to build a content dashboard, back-fill a reporting table, or score a creator's recent output without touching Meta's developer console.
Instagram is stingier with public numbers than most platforms, and the response reflects that honestly. View counts only exist for video — Reels and video posts carry a play count, a photo or carousel does not. Share counts are not published anywhere on a public post page, so the `shares` key is always null. It stays in the response so the shape is stable across platforms, not because we have a number hiding behind it.
The identifier we return is the shortcode from the URL (the `ABC123` in /p/ABC123/), not Instagram's internal media id. It is stable for the life of the post and it round-trips into a URL, which makes it a better primary key for most databases.
Play count. Present for Reels and video posts; null for photos and most carousels, because Instagram publishes no view figure for them.
Pricing
One post is 1 credit — about 0.5¢ on the monthly plan, 0.45¢ annual. $5 covers roughly 1,000 posts, cached hits cost the same as fresh, and failed calls are never charged.
Estimate only, on a full-year basis. 1 credits per returned post. 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.
Instagram lets an account hide like counts per post. When that is on, the public page shows no number and we return null for `likes` while `comments` still works normally. Treat null as unknown. Coercing it to 0 will quietly drag down every average you compute over a creator's feed.
The same rule applies to `views` on a photo. Absent is not zero.
A Reel or video post carries a play count. A single photo or a carousel of photos does not, so `views` comes back null. If you are comparing post formats, compare likes and comments across the set and treat views as a video-only metric rather than trying to normalise around the gap.
A carousel that contains a video sometimes reports a count and sometimes does not, depending on how Instagram renders it that day. Code for both.
We read public pages logged out. If the account is private, the post was deleted, or it is geo-restricted where the request lands, the call returns an error instead of a half-filled object. Failed calls are not charged.
This is also why there is no follower-only content here. There is no session to log in with, by design.
The `thumbnail` link points at Instagram's CDN and carries a signature with a lifetime measured in hours to days. Saving it in a database and rendering it two weeks later gives you broken images. Fetch the bytes at ingest time and store them yourself if the image matters.
Responses sit in the fast cache class, so a repeat call for the same post inside the window comes back in milliseconds with x-cache: hit. A hit costs the same 1 credit as a miss. Pass fresh=true to skip the cache — worth doing on the first read of a monitoring cycle, wasteful on every read.
Questions
Send a GET to /v1/instagram/stats with the post URL and your API key. There is no app review, no Business or Creator account requirement, and no OAuth token to refresh. Meta's Graph API only returns insights for accounts you hold a token for, which rules it out entirely for competitor research or influencer vetting. This endpoint reads the public post page instead.
Because the post is not a video. Instagram publishes a play count for Reels and video posts only; photos and photo carousels have no public view figure, so we return null rather than inventing one. If you need a number for every post in a set, use likes and comments as your comparable metrics and treat views as video-only.
No. Instagram does not show a share count on public post pages, so no tool reading public data can report one, including this one. The `shares` key is present in the response and always null so your parsing code does not have to branch per platform. TikTok does publish shares publicly, and the TikTok Stats endpoint returns them.
1 credit per post. Credits are $0.005 each on monthly billing and $0.0045 on annual, so a call is half a cent or less and $5 covers roughly a thousand posts. Cached responses cost the same as fresh ones. Calls that fail — private account, deleted post, bad URL — are never charged.
Yes. Reel URLs (/reel/…), photo posts (/p/…) and carousels all go to the same endpoint at the same price. The `type` field tells you which one you got back, and Reels additionally carry `views` and `duration_sec`. You do not need to detect the format before calling.
One URL per call. Run them concurrently — each call is independent and the API expects parallel traffic. If you are starting from an account rather than a list of links, the Instagram Channel Posts API returns a list of recent posts in one call, and those URLs drop straight into this endpoint.
We only read pages that any logged-out visitor can load, and we do not touch private accounts, follower-only content or personal data behind a login. That said, what you may do with the data depends on your jurisdiction and your purpose — aggregate analytics sits very differently from profiling individuals. Check with your own counsel before building anything that stores data about identifiable people.
Next
100 trial credits on signup — no card, key on screen immediately.