Instagram Trending Reels API
Cache-first trending Reels. Wall miss is labelled stale 200, not 502. Max 50. Flat 2 credits.
GET request to /v1/instagram/trending-reels that responds with clean JSON and costs 2 credits. Cache is on by default (4h TTL). Every successful call costs the flat fee — including cache hits. Pass cache=false to force a live scrape. Start with 100 free credits — no credit card.What is the Instagram Trending Reels API?
On-demand trending Reels from Instagram's logged-out /reels Explore feed (not keyword search). Flat 2 credits on a live or cache-fresh 200; a wall miss with a last-good snapshot is labelled stale at 0 credits (6h) instead of 502. Default cache=true is cache-first (4h per-country TTL). cache=false forces a live scrape — listing ~18s, Polarıs hydrate cut at 50s, scrape cap 65s (110s hard ceiling). Envelope: platform, country, countryCode, cached, source (native | cache), requested, totalReturned, hasMore (always false — no cursor), nextCursor null, truncatedReason (hydrate_deadline | age_filter | upstream_supply | null), fetchMs / hydrateMs / totalMs, fetched / hydrated / hydrateSkipped. Each reel splits videoUrlExpiresAt / thumbnailUrlExpiresAt and flags likesIsApproximate / commentsIsApproximate / viewsIsApproximate. limit max 50 (hydrate store still caps around 24). No Apify on this path. For live keyword search use Instagram Reels Search.
What you get
- Flat 2 credits on live / cache-fresh 200; last-good stale is 0 credits
- Cache hit is fast; miss listing+hydrate capped at 65s (50s hydrate cut)
- Split CDN expiry + *IsApproximate on likes/comments/views
- fetchMs / hydrateMs / fetched / hydrated survive the scrape-trace strip
- limit max 50; labelled stale snapshot (6h) instead of 502 on wall
Try it
Fill in the parameters below and copy a ready-to-run request, or open the live Playground to run it against your account (no API key paste).
Parameters
curl "https://api.captapi.com/v1/instagram/trending-reels" \
-H "Authorization: Bearer capt_live_..."
# or: -H "x-api-key: capt_live_..."Edit the parameters and the code updates instantly. Switch languages and hit copy.
Example response
{
"success": true,
"data": {
"platform": "instagram",
"country": "United States",
"countryCode": "US",
"cached": true,
"totalReturned": 2,
"requested": 10,
"hasMore": false,
"nextCursor": null,
"truncatedReason": null,
"reels": [
{
"platform": "instagram",
"url": "https://www.instagram.com/reel/DbYmqpplO_N/",
"id": "3952078729724096461",
"shortcode": "DbYmqpplO_N",
"postType": "Video",
"productType": "clips",
"section": null,
"topic": null,
"caption": "The Sun and Moon are coming together to put on a show for Earth, and we'll be sharing it with you. 😎\n\nOn Aug. 12, a total solar eclipse will pass over Earth, and we'll be broadcasting it live along the path of totality. Check our link in bio to learn how to watch along with us!\n\n#NASA #Sun #TotalSolarEclipse2026",
"description": "The Sun and Moon are coming together to put on a show for Earth, and we'll be sharing it with you. 😎\n\nOn Aug. 12, a total solar eclipse will pass over Earth, and we'll be broadcasting it live along the path of totality. Check our link in bio to learn how to watch along with us!\n\n#NASA #Sun #TotalSolarEclipse2026",
"publishedAt": "2026-07-29T17:02:45Z",
"durationSeconds": null,
"thumbnailUrl": "https://scontent-lga3-3.cdninstagram.com/v/t51.82787-15/760192799_18631809481049152_7782886010573196119_n.jpg?stp=dst-jpg_e15_tt6&_nc_ht=scontent-lga3-3.cdninstagram.com&_nc_cat=104&_nc_oc=Q6cZ2gGam1aPbxqnPf0b0JKP7tArIHvIrXRHft307eWE7UMXS_pr6S4N6-Dm4L-cNp1JOIg&_nc_ohc=NLXhSIvSAE8Q7kNvwG7hHBp&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AQAOYlO_MiU0ymVZP-LUmVyzq1Qfu0qndl3JUXVB6LqVwA&oe=6A6FEEDB&_nc_sid=8b3546",
"videoUrl": "https://scontent-lga3-1.cdninstagram.com/o1/v/t2/f2/m86/AQOkpXQA9C2FhMuyAbNvepC6OP6PrkitJW3nqH3dhIDVm7lu82BvCIZApUA5L2uZr02DWsYDPOvZUymd3s8Q5RQJ_i1Bkk9Qx3VnTwk.mp4?_nc_cat=111&_nc_sid=5e9851&_nc_ht=scontent-lga3-1.cdninstagram.com&_nc_ohc=DqUQRmuNQ38Q7kNvwEf3m2C&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5JTlNUQUdSQU0uQ0xJUFMuQzMuNzIwLmRhc2hfYmFzZWxpbmVfMV92MSIsInhwdl9hc3NldF9pZCI6MTg2MzE4MDkzMTAwNDkxNTIsImFzc2V0X2FnZV9kYXlzIjowLCJ2aV91c2VjYXNlX2lkIjoxMDA5OSwiZHVyYXRpb25fcyI6NDQsInVybGdlbl9zb3VyY2UiOiJ3d3cifQ%3D%3D&ccb=17-1&vs=d63b773f9b2109a6&_nc_vs=HBksFQIYUmlnX3hwdl9yZWVsc19wZXJtYW5lbnRfc3JfcHJvZC9ENjQ4OTVCRTVEN0I2MDc3MzFGQkNDNUI1MjZDN0RCMl92aWRlb19kYXNoaW5pdC5tcDQVAALIARIAFQIYUWlnX3hwdl9wbGFjZW1lbnRfcGVybWFuZW50X3YyLzlBNDA3ODFBQjMyMTkwODU4OTg3RTNFRUYzNUJBMkE4X2F1ZGlvX2Rhc2hpbml0Lm1wNBUCAsgBEgAoABgAGwKIB3VzZV9vaWwBMRJwcm9ncmVzc2l2ZV9yZWNpcGUBMRUAACaAjpb3hOKYQhUCKAJDMywXQEZnztkWhysYEmRhc2hfYmFzZWxpbmVfMV92MREAdf4HZeadAQA&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&_nc_ss=7a22e&_nc_zt=28&oh=00_AQDrxCQWJjYdJ_A1wP9NAqwnYMpcGLVAhJP0LpoE3AyyTg&oe=6A6C1F8C",
"author": {
"username": "nasa",
"url": "https://instagram.com/nasa"
},
"engagement": {
"views": 51078,
"likes": 10645,
"comments": 149,
"viewsInstagram": 40862,
"viewsFacebook": 10216
},
"hashtags": [
"NASA",
"Sun"
],
"mentions": []
},
{
"platform": "instagram",
"url": "https://www.instagram.com/reel/DbL6n0ggXDZ/",
"id": "3948507321457537241",
"shortcode": "DbL6n0ggXDZ",
"postType": "Video",
"productType": "clips",
"section": null,
"topic": null,
"caption": "Sound on!\n\nSonifications take images from across the universe and turn them into music, with different notes corresponding to different frequencies of light.\n\nThis sonification of NGC 4736, a bright spiral galaxy found 16 million light-years from Earth, sweeps clockwise around the image. As it reaches neutron stars and black holes (spotted by our @nasachandraxray telescope), it turns them into pitched tones on a glass marimba. Other sources of light are represented by piano notes or a low, ethereal drone.\n\n#NASA #Space #MusicLife",
"description": "Sound on!\n\nSonifications take images from across the universe and turn them into music, with different notes corresponding to different frequencies of light.\n\nThis sonification of NGC 4736, a bright spiral galaxy found 16 million light-years from Earth, sweeps clockwise around the image. As it reaches neutron stars and black holes (spotted by our @nasachandraxray telescope), it turns them into pitched tones on a glass marimba. Other sources of light are represented by piano notes or a low, ethereal drone.\n\n#NASA #Space #MusicLife",
"publishedAt": "2026-07-24T18:46:42Z",
"durationSeconds": null,
"thumbnailUrl": "https://scontent-lga3-1.cdninstagram.com/v/t51.82787-15/753557824_18630272896049152_5085604310932259746_n.jpg?stp=dst-jpg_e15_fr_s1080x1080_tt6&_nc_ht=scontent-lga3-1.cdninstagram.com&_nc_cat=1&_nc_oc=Q6cZ2gGam1aPbxqnPf0b0JKP7tArIHvIrXRHft307eWE7UMXS_pr6S4N6-Dm4L-cNp1JOIg&_nc_ohc=JXie426E2AIQ7kNvwGlg-Up&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AQDfQIt5ChHfvw1haYF6Huy5Tm0DHMMWjvyPqrGpi7_tTA&oe=6A7021E6&_nc_sid=8b3546",
"videoUrl": "https://scontent-lga3-1.cdninstagram.com/o1/v/t2/f2/m86/AQPmdAz9D4QKeO_RBry8I2ja9L4hPZ0xY85OXT_W30_E9E5cOr_RoiOcZHVX6a9Fvjg8qStE7fTYF0T9sgmzJyxUs6ay7J6Bvu0fLb4.mp4?_nc_cat=109&_nc_sid=5e9851&_nc_ht=scontent-lga3-1.cdninstagram.com&_nc_ohc=9d9-4rCXivsQ7kNvwFJggA4&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5JTlNUQUdSQU0uQ0xJUFMuQzMuNzIwLmRhc2hfYmFzZWxpbmVfMV92MSIsInhwdl9hc3NldF9pZCI6MTg2MzAyNzI3NzAwNDkxNTIsImFzc2V0X2FnZV9kYXlzIjo0LCJ2aV91c2VjYXNlX2lkIjoxMDA5OSwiZHVyYXRpb25fcyI6MzQsInVybGdlbl9zb3VyY2UiOiJ3d3cifQ%3D%3D&ccb=17-1&vs=53b7030fc1cf7a2a&_nc_vs=HBksFQIYUmlnX3hwdl9yZWVsc19wZXJtYW5lbnRfc3JfcHJvZC9CODQ0NkUzMkVERDMxMDM4NjFFNDk1OTc4NjM0NzFCQl92aWRlb19kYXNoaW5pdC5tcDQVAALIARIAFQIYUWlnX3hwdl9wbGFjZW1lbnRfcGVybWFuZW50X3YyL0JCNEUzREJGMERFRTc3RDY4Nzc5QzA5QzRFQUVCNzkxX2F1ZGlvX2Rhc2hpbml0Lm1wNBUCAsgBEgAoABgAGwKIB3VzZV9vaWwBMRJwcm9ncmVzc2l2ZV9yZWNpcGUBMRUAACaAkrjozIiYQhUCKAJDMywXQEEAAAAAAAAYEmRhc2hfYmFzZWxpbmVfMV92MREAdf4HZeadAQA&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&_nc_ss=7a22e&_nc_zt=28&oh=00_AQBlTouRSWFhKYJdRHR9XtTa3aGhEHVVC578ay32Lrz7mQ&oe=6A6C2F2A",
"author": {
"username": "nasa",
"url": "https://instagram.com/nasa"
},
"engagement": {
"views": null,
"likes": 485567,
"comments": 2174,
"viewsInstagram": null,
"viewsFacebook": null
},
"hashtags": [
"NASA",
"Space"
],
"mentions": [
"nasachandraxray"
]
}
],
"note": "Snapshot-backed trending list (typical freshness under 24h). Instagram returns a small overlapping batch per scrape; duplicates across requests are expected. For live keyword search use /v1/instagram/reels-search.",
"cachedAt": "2026-07-29T18:00:00Z",
"stale": true,
"ageHours": 32
}
}Billing metadata is returned in response headers: X-Captapi-Credits (credits charged), X-Captapi-Cache (hit or miss), and X-Captapi-Source. Failed requests (4xx/5xx) are never charged. See the full list of error codes in the error reference.
Response structure
A successful call returns success and a data object with the following fields:
Top-level fields
platformPlatform identifier for this response (matches the endpoint's platform).countryLocalized country name used for native geo (e.g. United States).countryCodeISO-3166 alpha-2 for the same country (e.g. US). Prefer this for joins.cachedtrue when served from the per-country response cache (4h TTL); false on a live scrape. Billing is flat 2 credits either way.sourcenative on a live scrape; cache on a hit. Never a vendor name.totalReturnedNumber of items returned in this response.requestedThe limit you asked for.hasMoreAlways false — this Explore window has no cursor.nextCursorAlways null on this endpoint.truncatedReasonhydrate_deadline | age_filter | upstream_supply | null. Why totalReturned < requested.noteHonesty copy: cache-first vs live scrape, flat 2 credits including cache hits, single-flight, 110s hard deadline, 60s failure cache, duplicates expected, ~180d content-age filter, views null on logged-out hydrate, points to reels-search for keyword scrapes.cachedAtCached at. Example: "2026-07-29T18:00:00Z".staleStale. Example: true.ageHoursAge hours. Example: 32.
Reels
Each item in reels contains:
platformPlatform identifier for this response (matches the endpoint's platform).urlCanonical URL of the item.idId of this reels item.shortcodeInstagram shortcode of the post (posts/reels only).postTypeContent type. YouTube community: "text" | "image" | "poll" | "video" | "playlist" | "quiz". Instagram: "image" | "video" | "carousel".productTypePlatform product type (e.g. clips, feed). Null when not applicable (image/carousel) — never an empty string.sectionSection.topicTopic.captionReel caption. description is not duplicated on this endpoint.descriptionDescription of this reels item.publishedAtPublish date (ISO 8601) when the platform exposes an absolute timestamp.durationSecondsAlways present on each reel. Float seconds (3dp) when known; null when the source omitted it.thumbnailUrlThumbnail image URL.videoUrlPlayback URL when the platform exposes one. Content type varies by platform — check videoType (hls vs mp4) before treating it as a downloadable file.authorAuthor name or handle.engagementEngagement metrics for the item.hashtagsHashtags extracted from the text.mentionsAccounts mentioned in the text.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| country | string | No | Country for Reels localization — full name or ISO code (e.g. 'United States', 'US', 'Turkey', 'TR'). Default United States. Unsupported values return 400 with supportedCountries[]. |
| limit | integer | No | Max items to return (default 10, max 50). Flat 2 credits per call. |
| cache | boolean | No | Default true (cache-first): serve the per-country response cache when present (TTL 4 hours). Every successful call costs 2 credits — including cache hits. Set false to force a live scrape (measured miss 45–75s, hard-capped at 110s). Raise client timeouts above 90s — n8n/Make defaults will fail a miss. The fresh result still refreshes the cache. |
Authentication: send your key as Authorization: Bearer capt_live_.... A typical call costs 2 credits. Cache is on by default (4h TTL). Every successful call costs the flat fee — including cache hits. Pass cache=false to force a live scrape.
instagram_trending_reels via @captapi/mcp. Set it up →How it works
- 1. Sign up — get 100 free credits, no card required.
- 2. Create a key from your dashboard.
- 3. Send one request to
/v1/instagram/trending-reelsand parse the JSON response.
Use cases
Discovery
Surface items matching a topic, tag, sound, or trend query.
Monitoring
Watch a list feed over time for new activity.
Research
Sample structured list results for analysis.
Pipelines
Ingest list results into your own store or CRM.
Frequently asked questions
What does the Instagram Trending Reels API do?+
The Instagram Trending Reels API lets you list items in bulk with metadata from a public Instagram trending reels using one GET request to /v1/instagram/trending-reels. It returns clean JSON — no OAuth or infrastructure setup required.
How many credits does the Instagram Trending Reels API cost?+
Each successful call costs 2 credits. Every successful call costs 2 credits — including cache hits. Cache is on by default (4h per-country TTL); pass cache=false to force a live scrape. Failures are 0 credits. Failed or empty results are never charged.
Do I need a Instagram API key or OAuth?+
No. A single Captapi key works across every platform Captapi supports — YouTube, TikTok, Instagram, Facebook, Twitter/X, Reddit, Threads, Bluesky, Pinterest, LinkedIn, Rumble, Spotify, Kwai, and more. We handle proxies, rate limits, retries, and authentication for you.
Are cache hits free? What is the TTL?+
No. Live/cache-fresh 200s still cost 2 credits. A wall miss with a last-good snapshot is labelled stale at 0 credits (6h). Default is cache-first (4h per-country TTL): a hit is fast. cache=false forces a live scrape (measured 45–75s). Raise n8n/Make timeouts above 90s or a miss looks like a client bug.
Why did Japan or South Korea return 502 with afterAgeFilter 0?+
A thin /reels/ page (often one leftover shortcode) used to skip /explore/reels/, then the age filter dropped that one stale post. That surfaces as fetch_thin — a scrape-yield miss, not a filter-threshold miss. A failed country is remembered for 60s; if a last-good grid exists it is served as labelled stale 200 (0 credits) instead of 502.
Where did a 20s cache=false call spend its time?+
fetchMs is Decodo listing of /reels (and /explore/reels on a thin page). hydrateMs is Polarıs shortcode hydrate (cut at 50s). totalMs covers the scrape plus the cache write. They live in timings{path,fetchMs,hydrateMs,totalMs} and are also lifted onto the payload root. stages still does not ship. A cache miss is listing+hydrate under the 65s scrape cap; a hit is fast. source is native on a live scrape and cache on a hit.
Why did I get 7 or 8 rows when I asked for 10?+
truncatedReason names it. upstream_supply = Instagram only listed that many. age_filter = the ~180-day Explore rule dropped older posts. hydrate_deadline = Polarıs hydrate hit the 50s cut and returned what it had — retry may yield more.
Is the Instagram Trending Reels API suitable for production use?+
Yes. It is a stable REST endpoint with predictable JSON and automatic retries. Every successful call costs 2 credits — including cache hits. Cache is on by default (4h TTL); pass cache=false to force a live scrape. Use it for analytics, monitoring, and content automation.
More Instagram APIs
Ready to use the Instagram Trending Reels API?
Sign up, grab your key, and make your first call in 60 seconds.