Instagram
GET /v1/instagram/trending-reels

Instagram Trending Reels API

Cache-first trending Reels. Feed outage → labelled country hashtag-clips stand-in (listing field), never a silent swap. Max 50. Flat 2 credits.

2 credits per request
TL;DR
Cache-first trending Reels. Feed outage → labelled country hashtag-clips stand-in (listing field), never a silent swap. Max 50. Flat 2 credits. The Instagram Trending Reels API (Instagram) is a single authenticated 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). Every payload carries listing: "reels_feed" is the feed itself; "hashtag_clips" means Instagram was not serving the logged-out feed (it has gone dark for every country for days at a time — 6–10 Oct 2026) and the rows are instead the current top clips for the country's hashtags (listingHashtags, e.g. india/bharat/mumbai) merged and ranked by views, with a note saying exactly that. It is a labelled stand-in, not Instagram's own trending signal — branch on listing if that distinction matters to you. Flat 2 credits on a live or cache-fresh 200 of either listing; a miss on both with a last-good snapshot is labelled stale at 0 credits (held 7 days; fetchedAt is the scrape time, servedAt the handover) and only then 502. Default cache=true is cache-first (4h per-country TTL). cache=false forces a live scrape — feed listing ~18s, Polarıs hydrate cut at 50s, then the hashtag grids (~5–10s) if the feed missed; 110s hard ceiling. Envelope: platform, country, countryCode, cached, source (native | cache), listing, 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. engagement.views is omitted on reels_feed rows (logged-out /reels never exposes play counts) and present on most hashtag_clips rows. limit max 50 (store caps around 24). No fallback path on this endpoint. For a live hashtag scrape of your own tag use Instagram Reels Search.

What you get

  • Flat 2 credits on live / cache-fresh 200; last-good stale is 0 credits
  • listing: reels_feed vs hashtag_clips — the stand-in is always labelled (listingHashtags + note)
  • Cache hit is fast; feed miss listing+hydrate capped at 65s, hashtag grids ~5–10s after
  • Split CDN expiry + *IsApproximate on likes/comments; views on hashtag_clips rows
  • fetchMs / hydrateMs / fetched / hydrated survive the scrape-trace strip
  • limit max 50; labelled stale snapshot (7 days) before any 502

Try it

Open in Playground

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

Sign in to run live
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-Request-Id (include it when contacting support). Where the response has a source field, it names the path that served the data: native, extended, cache or asr. 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.
  • 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.
  • noteOnly on listing=hashtag_clips: states that Instagram's logged-out Reels feed was unavailable (and why), that the rows are a labelled hashtag-clips stand-in ranked by views, and that they are not Instagram's own trending feed.
  • 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

NameTypeRequiredDescription
countrystringNoCountry for Reels localization — full name or ISO code (e.g. 'United States', 'US', 'Turkey', 'TR'). Default United States. Unsupported values return 400 with supportedCountries[].
limitintegerNoMax items to return (default 10, max 50). Flat 2 credits per call.
cachebooleanNoDefault 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.

Using an AI agent? This endpoint is the MCP tool instagram_trending_reels via @captapi/mcp. Set it up →

How it works

  1. 1. Sign up — get 100 free credits, no card required.
  2. 2. Create a key from your dashboard.
  3. 3. Send one request to /v1/instagram/trending-reels and 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 access, 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 (held 7 days; check fetchedAt). 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.

What does a 502 upstream_error mean?+

Instagram's own public Reels feed returned a server error, so logged-out visitors see an empty grid for that country — there is nothing to list on Instagram's side. It is not a scrape miss and no credits are charged. You only see this 502 when the labelled stand-in also came back too thin: on a feed miss the endpoint first serves the country's hashtag clips grid (listing=hashtag_clips, listingHashtags, note), then a last-good snapshot (held 7 days, labelled stale, 0 credits). The 502 carries retryAfterSeconds 300 — these outages run for days (6–10 Oct 2026, every geo).

What is listing=hashtag_clips? Is that still "trending"?+

It is the fallback for a dark feed, and it is labelled so you can decide. Instagram's logged-out /reels grid has gone dark for every country for days at a time; rather than 502 for a week, the endpoint merges the current top clips for two or three country hashtags (e.g. india, bharat, mumbai — listed in listingHashtags), ranks them by views and ships them with a note. Measured 10 Oct 2026: 27–30 clips per tag, 0.5–90h old, views from a few thousand to ~1M. It is fresh, country-scoped and video-only, but it is not Instagram's own trending ranking — listing=reels_feed is. Both cost the same flat 2 credits. If you only want the real feed, treat hashtag_clips as "unavailable" on your side.

Where did a 20s cache=false call spend its time?+

fetchMs is the reels listing (and /explore/reels on a thin page). hydrateMs is per-post hydration (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. 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.

Why is engagement.views missing?+

Logged-out /reels never exposes play_count, so every row used to ship views: null. The key is omitted now — not a deleted Reel. likes and comments still arrive. For plays, use /v1/instagram/details or channel-reels on a permalink.

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.

Instagram Trending Reels API — Captapi