One handle in. Clean JSON out.
Give this endpoint an Instagram handle and it returns that account's recent reels as an array of JSON objects, newest first. Each reel carries its own view, like and comment counts, its caption, its runtime and its posted timestamp. Billing is per reel returned, 3 credits each, so a 20-reel pull costs 60 credits.
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": "C8xQvZ2sVAb","url": "https://www.instagram.com/reel/C8xQvZ2sVAb/","caption": "POV: your setup finally works","posted_at": "2026-07-05T15:30:00Z","metrics": {"views": 421009,"likes": 38112,"comments": 640}}],"meta": {"count": 2,"limit": 20,"item": "reel"},"request_id": "req_01JZX4M8Q2TE9W"}
The payload
An array under `data`. Every element is one reel: the short code that identifies it, the canonical URL, the caption as written, the public counters, how long the clip runs, when it went up, a thumbnail image URL and the owner's handle and display name. The list is ordered the way Instagram serves the account's reels tab, which in practice means most recent first.
This is the same object shape the single-post endpoints return, so a reel pulled from here and a post pulled by URL are interchangeable in your storage layer. That matters if you are writing both into one table — you do not need two schemas or a translation step between them.
One list call also warms our per-item cache for the reels it contained. If you fetch a handle's reels and then immediately ask for stats on one of those reels by URL, that second call is served from cache and comes back in milliseconds instead of seconds. It still costs its own credits, but the wait disappears.
Public play count for the reel. Null when Instagram is not exposing a play count on that item.
Pricing
You are billed per reel returned, 3 credits each — about 1.5¢ on the monthly plan, so a 20-reel pull runs 60 credits or roughly 30¢, and a call that comes back empty still costs 1 credit.
Estimate only, on a full-year basis. 3 credits per returned reel. 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.
3 credits per reel. Ask for 50 and you are charged for 50; ask for 10 and you are charged for 10. Set your limit to the number you will genuinely use rather than pulling a large page and discarding most of it.
At $0.005 a credit on monthly billing, a reel is 1.5 cents and a 20-item pull is about 30 cents. Annual billing drops the credit to $0.0045.
This endpoint returns a single array of up to `limit` reels. No cursor, page token or offset comes back in the response, so there is no way to resume where a previous call stopped. To reach further back, raise `limit` on a fresh call — the accepted range is 1 to 500, and anything above 50 is run as an asynchronous job rather than answered inline.
That means a deeper pull re-fetches from the top and overlaps with what you already have. Upsert on `id` when you merge, and remember you are billed for every item the larger call returns, not just the new ones.
We read public pages logged out. A private account is not visible to us any more than it is to a logged-out browser, and the call errors rather than returning a partial list. Unavailable and deleted handles behave the same way. Failed calls are not charged.
The field exists in the response for shape compatibility with the other post objects, but Instagram does not surface a public share count on reels, so this endpoint returns null every time. Do not build a metric on it. Saves are not exposed publicly either, which is why there is no saves key at all.
This endpoint sits in the medium cache class, so repeated requests for the same handle inside the window return the stored array immediately with x-cache: hit, at the same credit cost. That is usually what you want — a creator does not post every minute.
Add fresh=true when you specifically need to catch a brand new reel, such as the first call of a monitoring cycle. Counters on reels posted in the last day move fast, so if you are charting growth, sample on a fixed cadence rather than whenever your job happens to run.
Questions
Call /v1/instagram/channel-reels with the handle and a limit. The endpoint returns the account's recent reels newest first; raise the limit to reach further back. Instagram does not expose an unlimited public archive, so very deep history on a prolific account may not be fully reachable. For most competitor and research work the last few dozen reels is what carries signal anyway.
300 credits. Billing on this endpoint is 3 credits per reel returned, so 100 reels is 300 credits — about $1.50 on monthly billing at $0.005 a credit, or $1.35 on annual at $0.0045. Cached responses cost the same as fresh ones. Calls that error are never charged.
No. There is no OAuth flow, no app review, no linked Facebook Page. You send a GET with your API key and a handle. Instagram's own Graph API only reaches accounts you have been granted access to, which rules it out for competitor research; this endpoint reads the same public reel pages anyone can open in a browser.
Because Instagram does not publish it. Public reel pages show plays, likes and comments; share and save counts are visible only to the account owner in their own insights. The key is present in the response for consistency with the other post objects, and it will be null. We would rather return an honest null than a number we guessed at.
No. Everything we read is public content fetched logged out, so a private account returns an error and no charge. There is no setting, plan or parameter that changes this. If you manage the account yourself, Instagram's own insights in the app will give you more detail than any public source can.
Channel reels returns only reels — the short vertical video format. Channel posts returns the account's feed content, which includes photos, carousels and feed videos. If you are studying short-form video performance specifically, use this endpoint so your dataset is not diluted by static posts that never had a view count to begin with.
Take the url field from any item and pass it to the Instagram Transcript API. That returns the spoken words as text. A common pipeline is one channel-reels call to discover the reels, then transcript calls on the handful whose view counts stood out, so you are only paying for transcription on content worth reading.
Next
100 trial credits on signup — no card, key on screen immediately.