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

# Instagram Channel Posts API

`GET /v1/instagram/channel-posts`

## Request

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

Latest posts from a public Instagram profile — carousel children[], mediaCount, user{} in one call.

Send a profile URL or @handle and get recent posts as JSON 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. Profile URLs are always https://www.instagram.com/{username}/ (www + trailing slash) on the envelope, user{}, and author{}. Each item includes postType / productType (image/feed, video/clips, carousel — productType is clips | feed | carousel; Meta's carousel_container is normalized), caption (not a duplicated description), mediaCount (1 for singles; children.length when carousel expansion ran; null on carousel when slides were not expanded — never a fabricated 1), and children[] (per-slide id / mediaType / thumbnailUrl / videoUrl — [] on non-carousels and on unexpanded carousels). Cover thumbnailUrl is the first slide; carousel cover videoUrl stays null — video slides live in children[]. Also likes, comments, and on videos: durationSeconds, hasAudio, music{}, isAd / isAffiliate / isPaidPartnership when Instagram exposes them. accessibilityCaption when Instagram provides alt-text (backfilled from the api/v1 feed overlay — populated e.g. on @instagram/DbbY9pdm6Q2; still often null on nasa/natgeo). Envelope always includes the same keys on both paths: user / userId (null when unknown), degraded, degradedReason (null when healthy; extended, extended-timeout, or extended-timeout-served-stale when soft-fail). The fallback path is hard-capped at ~105s; on timeout we serve the last cached page for that profile (degradedReason=extended-timeout-served-stale + cachedAt) when one exists, else an empty extended-timeout page — never a gateway timeout. Metrics: engagement.views + viewsSource on videos. Cursor pagination via nextCursor + hasMore. Billing ceil(n × 0.3); empty and labelled-stale timeout responses are 0 credits. Pass cache=true for the 24h shared cache (successful fetches always refresh it). Set client timeouts ≥130s.

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

## Query parameters

- `url` string, required
- `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.
    - `totalReturned` integer: Number of items returned in this response.
    - `posts` 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 posts item.
      - `postType` string: Content type. YouTube community: "text" | "image" | "poll" | "video" | "playlist" | "quiz". Instagram: "image" | "video" | "carousel".
      - `productType` string, nullable: Platform product type (e.g. clips, feed). Null when not applicable (image/carousel) — never an empty string.
      - `caption` string: Post or creative caption when the platform exposes one.
      - `description` string: Description of this posts item.
      - `publishedAt` string: Publish date (ISO 8601) when the platform exposes an absolute timestamp.
      - `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.
      - `author` object: Author name or handle.
        - `username` string
        - `displayName` string
        - `url` string: Canonical URL of the item.
        - `followers` integer
        - `verified` boolean
        - `profileImage` string
      - `engagement` object: Engagement metrics for the item.
        - `views` integer, nullable
        - `likes` integer
        - `comments` integer
        - `viewsInstagram` integer
        - `viewsFacebook` integer
      - `hashtags` string[]: Hashtags extracted from the text.
      - `mentions` string[]: Accounts mentioned in the text.
    - `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.

## 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)
