One keyword in. Clean JSON out.
Give this endpoint a keyword and it returns the Reels Instagram is currently surfacing for that term, as an array of JSON objects with view and like counts attached. Billing is per result returned, at 3 credits each, so a 20-result search costs 60 credits. No login, no Graph API app review, no headless browser to babysit.
How I plan a week of posts in 30 minutes
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": "v_77120","url": "https://example-result-url","caption": "How I plan a week of posts in 30 minutes","author": {"handle": "plannerpro"},"metrics": {"views": 88210,"likes": 5120},"posted_at": "2026-07-08T16:20:00Z"}],"meta": {"count": 2,"limit": 20,"item": "result"},"request_id": "req_01JZX4M8Q2TE9W"}
The payload
An array. Each element is one Reel: its shortcode, its permalink, the caption, the engagement counters, how long the clip runs, when it went up, a thumbnail URL and the account that posted it. The shape is identical to what the other Instagram post endpoints emit, so a search result and a post pulled from a profile feed can go into the same table without a translation layer.
Ordering comes from Instagram's own popularity ranking for the keyword, not from a date sort and not from anything we compute. That has a practical consequence worth internalising: the same query run tomorrow can return a different set in a different order. This is a discovery tool, not a stable index. If you need to follow specific Reels over time, take the ids out of a search once and then poll those ids directly.
One keyword goes in per call. There is no boolean syntax, no AND/OR, no field qualifiers, no date filter. Instagram's search box is what is underneath, and it takes plain terms.
Public play count. Null on items where Instagram is not publishing a view figure.
Pricing
Billing is per Reel returned, at 3 credits — about 1.5¢ each on the monthly plan — so a 20-result search runs 60 credits, roughly 30¢, and a search that finds nothing still costs 1 credit.
Estimate only, on a full-year basis. 3 credits per returned result. 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.
Billing is 3 credits per item in the array, not 3 per call. A search that returns 20 Reels costs 60 credits, roughly 30 cents on the monthly plan. Set your limit deliberately rather than accepting a default and being surprised by the bill on a crawl of 500 keywords.
Instagram may return fewer items than you ask for on a narrow term. You are only charged for what actually comes back.
Popularity ranking shifts through the day. Two calls with the same keyword an hour apart will overlap heavily but not exactly, and something ranked third in the morning can be absent by evening. Do not build a test that asserts on a specific result position.
If your job needs a fixed set, snapshot the ids once and treat the search as the seed step rather than as the source of truth.
One plain keyword or phrase per call. Operators are not supported and will be treated as literal characters — a search for "yoga AND pilates" looks for that string, not for the intersection. Run separate calls and merge on id if you need boolean logic.
Non-English terms work, and language is inferred from the query rather than settable. Very generic single words tend to return broad, low-relevance results; two or three word phrases are usually better.
Instagram is inconsistent about which counters it publishes on search surfaces. Expect a meaningful share of results with a null views or likes value, and write your ranking code so a null sorts rather than throws. shares is null on every Instagram item without exception.
Searches sit in the fast cache class, so re-running an identical query inside the window returns in milliseconds and sets x-cache: hit. Cached responses are billed the same as fresh ones. Pass fresh=true when you specifically need to bypass the cache, such as the first call of a scheduled trend run.
Questions
Send a GET to /v1/instagram/reels-search with a query parameter and your API key. Instagram's Graph API has no public keyword search for Reels at all — it only reaches media on accounts that have authorised your app — which is why keyword discovery generally cannot be built on it. This endpoint reads the same public search results you would see logged out, and returns them as JSON.
3 credits per result returned. Ask for 20 Reels and you spend 60 credits; ask for 5 and you spend 15. Credits are $0.005 each on monthly billing and $0.0045 on annual, so 20 results is about 30 cents. Failed calls are not charged, and a search that returns fewer items than requested only bills for the items you got.
You set the limit on the request. Instagram controls the actual ceiling for any given term and often returns fewer items than asked for on narrow or niche keywords. Because billing is per result, a high limit on a broad term is the expensive case to watch. Start at 10 to 20 while you are calibrating a query.
Because the ordering is Instagram's live popularity ranking, which moves throughout the day as engagement accumulates. The endpoint does not sort or filter — it returns what the platform surfaces at call time. For repeatable work, run the search once, keep the ids, and fetch those specific Reels afterwards instead of re-searching.
Not in the query. The endpoint takes a keyword and nothing else — no date range, no minimum views, no operators. Every result carries posted_at and views, so filter client-side after the call. Be aware that you are billed for results before you filter them, so a tight keyword beats a broad one plus aggressive post-filtering.
No. Only public content that appears in logged-out search is reachable. Private accounts, deleted Reels and region-restricted posts do not appear in results. We do not log in, do not bypass anything, and do not have access to anything you could not open in an incognito window yourself.
Reels search starts from a topic and returns Reels from accounts you have never heard of, ranked by Instagram. Channel posts starts from a handle you already know and returns that account's recent posts in order. Discovery versus monitoring. Most pipelines use search to find accounts, then switch to channel posts to track the ones that matter.
Next
100 trial credits on signup — no card, key on screen immediately.