---
title: "Instagram Channel Reels API"
method: GET
path: "/v1/instagram/channel-reels"
tags: ["Instagram"]
---

# Instagram Channel Reels API

`GET /v1/instagram/channel-reels`

## Request

- Base URL: `https://api.captapi.com`
- URL: `https://api.captapi.com/v1/instagram/channel-reels`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Latest Reels from a public Instagram profile — pass userId to skip resolve; ceil(n×0.3) credits; nextCursor + hasMore.

Send a profile URL/@handle or a numeric userId and get that account's recent Reels (videos only) plus a top-level user{} profile block (id, username, displayName, url, verified, followers, avatar, isPrivate) so you do not need a second channel-details call. Prefer userId when you already have it (from basic-profile or profile-search) — it skips handle→ID resolve (the old sequential path alone could cost ~80s; url/@handle now uses the same raced resolver as profile-search). instagram.com/handle/ and instagram.com/@handle/ both parse. Each Reel includes videoUrl, thumbnailUrl, caption (not a duplicated description), likes, comments, duration (decoded from the CDN efg blob when the mapper had none), publish date, coauthors[], and split CDN expiry — videoUrlExpiresAt (~1.5d, the tight window) and thumbnailUrlExpiresAt (~4d), never collapsed to one min. reels[].author is the clip owner — the clips tab includes collabs; coauthors[] names the partners, so a reel authored by a collaborator still shows the queried channel there. Read data.user for the requested account — user.id / userId / displayName are lifted from matching reel authors when handle→ID resolve missed (extended path), never from a collab first row. Envelope: requested + totalReturned, and two clocks — fetchedAt is when the data came from Instagram, servedAt is when we handed it over; on a stale last-good page (stale + cached) the gap is the data's age, fetchedAt is never restamped to the request time. Billing is ceil(n × 0.3) credits on the returned reel count (17 → 6, 5 → 2), including a labelled last-good page after a live miss. Metrics when Instagram exposes them: engagement.views + viewsSource; likes:null never ships next to likeAndViewCountsDisabled:false (an unread count makes the flag null — unknown, not a claim). Cursor pagination via nextCursor; hasMore is true until the end of the list, and null on a degraded page (unknown — never a false end). Several fetch paths run in parallel until the 100s wall; the first with reels wins. A 6h last-good page is served stale when live paths miss. A miss with no snapshot is 502 UPSTREAM_UNAVAILABLE at 0 credits. A deleted / renamed / banned account is a non-retryable 404 PROFILE_NOT_FOUND decided at resolve time — never a retryable 502 that sends pollers into all-day loops on a dead handle. Pass cache=true for the 24h shared cache (0 credits on hit).

Docs: https://captapi.com/apis/instagram-channel-reels

## Query parameters

- `url` string
- `userId` string
- `limit` integer
- `cursor` string
- `cache` boolean

## Response `200`

Success. The data object for this endpoint.

- object
  - `success` unknown, required
  - `data` object, required
    - `url` string: Canonical URL of the item.
    - `requested` integer: The limit you asked for — makes totalReturned readable (asked 50 got 1 vs asked 1 got 1).
    - `totalReturned` integer: Number of items returned in this response.
    - `reels` object[]
      - `platform` string: Platform identifier for this response (matches the endpoint's platform).
      - `url` string: Canonical URL of the item.
      - `id` string: Id of this reels item.
      - `shortcode` string: Instagram shortcode of the post (posts/reels only).
      - `mediaId` string: Media id. Example: "3971891348174241278".
      - `caption` string: Post or creative caption when the platform exposes one.
      - `publishedAt` string: Publish date (ISO 8601) when the platform exposes an absolute timestamp.
      - `durationSeconds` number: Float seconds. When the mapper had no duration, decoded from the video URL's efg blob (duration_s) — no extra fetch.
      - `thumbnailUrl` string: Thumbnail image URL.
      - `videoUrl` string: Playback URL when the platform exposes one. Content type varies by platform — check videoType (hls vs mp4) before treating it as a downloadable file.
      - `videoUrlExpiresAt` string: ISO expiry from videoUrl's signed CDN oe= (~1.5 days — the tightest window on the row). Re-pull before it lapses if you archive video.
      - `thumbnailUrlExpiresAt` string: ISO expiry for thumbnailUrl (~4 days). Split from videoUrlExpiresAt — one merged field would collapse both to the tighter window.
      - `hasAudio` boolean: Whether the video has an audio track — not "uses a licensed library track". A music attribution (original or licensed) implies true; upstream false next to a music object is reconciled to true.
      - `author` object: The reel's owner (post author), never the audio attribution — on original-audio reels author.username and music.artist match because original audio is credited to the poster.
        - `id` string: Id of this reels item.
        - `username` string: Account username / handle.
        - `displayName` string: Display name of the account. Canonical across profile endpoints (prefer over name).
        - `url` string: Canonical URL of the item.
        - `verified` boolean: Whether the account is verified on this platform.
        - `avatar` string: Avatar / profile picture URL. Canonical across profile endpoints.
        - `followers` integer, nullable: Follower count.
        - `isPrivate` boolean: Whether the account is private.
      - `coauthors` object[]: Collab partners (coauthor_producers) on this reel. A reel authored by another account with the queried channel in coauthors is Instagram's Collaborator feature putting one reel on two profiles — filter on author + coauthors, not author alone. [] when solo.
        - `id` string: Id of this reels item.
        - `username` string: Account username / handle.
        - `displayName` string: Display name of the account. Canonical across profile endpoints (prefer over name).
        - `url` string: Canonical URL of the item.
        - `verified` boolean: Whether the account is verified on this platform.
        - `profileImage` string
      - `engagement` object: Engagement metrics for the item.
        - `likes` integer
        - `comments` integer
        - `views` integer
        - `likesIsApproximate` boolean
        - `commentsIsApproximate` boolean
        - `viewsIsApproximate` boolean
        - `viewsSource` string
      - `hashtags` unknown[]: Hashtags extracted from the text.
        - unknown
      - `mentions` string[]: Accounts mentioned in the text.
      - `isPaidPartnership` boolean: Is paid partnership. Example: false.
      - `isAd` boolean: Whether the item is a paid promotion.
      - `isAffiliate` boolean: Whether the channel is an affiliate.
      - `likeAndViewCountsDisabled` boolean: True = counts hidden, false = counts shown and likes carries a number, null = unknown. likes:null next to false never ships — an unread count nulls the flag instead of claiming counts are visible.
      - `music` object: Reel soundtrack metadata (id, type, trackTitle, albumArt) when Facebook exposes it.
        - `id` string: Id of this reels item.
        - `title` string
        - `artist` string
        - `clusterId` unknown
        - `assetId` unknown
        - `canonicalId` unknown
        - `artistId` unknown
        - `durationMs` unknown
        - `audioType` string
        - `coverUrl` unknown
        - `isTrendingInClips` boolean
        - `isExplicit` unknown
        - `hasLyrics` unknown
      - `musicId` string: ID of the soundtrack used.
    - `nextCursor` string: Cursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches).
    - `hasMore` boolean: Whether more results are available beyond this page. When true, pass nextCursor to fetch the next page.
    - `userId` string: Numeric Instagram user id of the requested profile.
    - `user` object
      - `id` string: Id of this user item.
      - `username` string: Account username / handle.
      - `displayName` string: Display name of the account. Canonical across profile endpoints (prefer over name).
      - `url` string: Canonical URL of the item.
      - `verified` boolean: Whether the account is verified on this platform.
      - `isPrivate` boolean: Whether the account is private.
      - `avatar` string: Avatar / profile picture URL. Canonical across profile endpoints.
      - `followers` integer: Follower count.
      - `postCount` integer: Total posts/statuses/videos for the account. Canonical across profile endpoints (prefer over posts / videoCount / tweetCount).
    - `degraded` boolean: Degraded. Example: false.
    - `degradedReason` unknown
    - `fetchedAt` string: When the data came from Instagram — the snapshot clock, never restamped to the request time. Null on a stale page whose snapshot predates the stamp (honest unknown).

## Other responses

- `400`: Bad request: wrong platform URL, unknown endpoint, or an invalid parameter value. Not billed.
- `401`: Missing, invalid or revoked API key. Not billed.
- `402`: Not enough credits for this request. Not billed.
- `404`: The resource does not exist or is not public. Not billed.
- `422`: A required parameter is missing or has the wrong type. Not billed.
- `429`: Rate limit reached. Wait for Retry-After seconds. Not billed.
- `502`: The platform could not be reached or returned nothing usable. Retryable, not billed. 503 and 504 use the same envelope.

---

[API](https://skmtc.dev/captapi/apis/captapi-api.md) · [All operations](https://skmtc.dev/captapi/apis/captapi-api/llms.txt) · [OpenAPI document](https://skmtc.dev/captapi/apis/captapi-api/revisions/c9b9ac5ff1bd?raw)
