Instagram Channel Posts API
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.
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
Query parameters
Instagram profile URL, @handle, or username, e.g. https://instagram.com/username/. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.
Max items to return (default 20, max 200). Billed per result.
Pagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response (e.g. 3937014945555313553_1697296). A null nextCursor means the end of the list.
Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.
Response
Success. The data object for this endpoint.
Changes
No recorded changes to this operation across all 3 revisions of this API.