Instagram Post & Reel Details API
Get an Instagram post, Reel or carousel — caption, likes, comments, views, media URLs, author, and per-slide children on carousels.
Paste an Instagram post or Reel URL and get the item as clean JSON: caption, like and comment counts, media URLs, author profile, duration when it is a Reel, and publish date (ISO 8601 with milliseconds). postType is customer vocabulary — image | video | carousel (never Meta's internal "Sidecar"). productType is clips | feed | carousel (carousel_container is normalized). On Reels, engagement.views is the canonical play count when the media object exposes it, and viewsSource is instagram|facebook whenever views is set. Every present counter carries a precision flag (likesIsApproximate / commentsIsApproximate / viewsIsApproximate — false: Instagram counts are exact integers). Carousels omit durationSeconds, engagement.views, viewsIsApproximate, and children[].videoUrl on image slides — the same rule as views that do not apply. Carousels ship mediaCount plus children[] with per-slide id / mediaType / thumbnailUrl / videoUrl. mediaUrlsExpireAt is the earliest Instagram CDN oe= stamp (typically ~5 days) across media URLs. previewComments is Instagram's embedded preview (usually 2); previewCommentsTruncated is true when engagement.comments is larger — it does not point at /v1/instagram/comments (that path used to return the same preview after a billed hang). Slim preview authors omit avatar/verified — those keys are null, never fabricated false. A 200 is the post only — no source / timings. Fetch is GraphQL first, then the public embed card; if GraphQL misses, a fallback path starts in parallel (55s deadline), so a login-wall window does not 502 just because the fallback never ran. A definitive miss is reason not_found | private | deleted (404, retryable false — fix the URL); a fallback "Post does not exist" verdict maps to not_found too, so deleted Reels stop cycling as retryable 502s. A timeout/login-wall cascade is fetch_exhausted (502, retry later). A resolved but hollow body is empty_payload (502, retryable). A public embed/og card is a 200 even when later paths miss. 404/502 are 0 credits. Flat 1 credit on a 200. Pass cache=true for the 24h shared cache.
Request
- Base URL: https://api.captapi.com
- URL: https://api.captapi.com/v1/instagram/details
- Auth: one of:
- HTTP bearer
- API key in header X-API-Key
Query parameters
Instagram post or reel URL, e.g. https://instagram.com/reel/ID/. 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.
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.