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.
GET request to /v1/instagram/details that responds with clean JSON and costs 1 credit. Pass cache=true for a free 24h cache hit; default is always fresh. Start with 100 free credits — no credit card.What is the Instagram Post & Reel Details API?
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. Every 200 ships source / stages / timings. Fetch is Decodo page first, then native GraphQL, then Apify. A definitive miss is reason not_found | private | deleted (404, retryable false — fix the URL). A public page Decodo can see is a 200 even when Apify misses (og-card fallback) — not fetch_exhausted. 404 is 0 credits. Flat 1 credit on a 200. Pass cache=true for the 24h shared cache.
What you get
- Caption, media URLs, and publish date (.000Z)
- engagement.views + viewsSource on Reels when the media object exposes plays
- Per-counter *IsApproximate flags on engagement
- mediaCount + children[] on carousels
- Named miss: not_found | private | deleted (404). Decodo-first, Apify fallback.
- mediaUrlsExpireAt from CDN oe=
Try it
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
curl "https://api.captapi.com/v1/instagram/details?url=https%3A%2F%2Fwww.instagram.com%2Fp%2FDbYaLffE2DD%2F" \
-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",
"url": "https://www.instagram.com/p/DbYaLffE2DD/",
"id": "DbYaLffE2DD",
"postType": "Sidecar",
"productType": "carousel_container",
"caption": "Suit up!\n\nThese photos show NASA astronaut candidates @astro_fuhrmann and @astro_lawler preparing for their training flights aboard a high-flying WB-57 aircraft. These high-altitude flights train astronaut candidates to operate in tight spaces while wearing a pressure suit—a feat that prepares them for missions to the @ISS, Moon, or beyond.\n\nWhy are pressure suits necessary? The two main bodily dangers of high altitude are extremely thin air and low oxygen. Pressure suits counteract those dangers and make it possible to survive if something goes wrong in the aircraft.\n\nCredit: NASA\n\n#NASA #FlightSuit #Aircraft",
"description": "Suit up!\n\nThese photos show NASA astronaut candidates @astro_fuhrmann and @astro_lawler preparing for their training flights aboard a high-flying WB-57 aircraft. These high-altitude flights train astronaut candidates to operate in tight spaces while wearing a pressure suit—a feat that prepares them for missions to the @ISS, Moon, or beyond.\n\nWhy are pressure suits necessary? The two main bodily dangers of high altitude are extremely thin air and low oxygen. Pressure suits counteract those dangers and make it possible to survive if something goes wrong in the aircraft.\n\nCredit: NASA\n\n#NASA #FlightSuit #Aircraft",
"publishedAt": "2026-07-29T15:12:56Z",
"durationSeconds": null,
"thumbnailUrl": "https://scontent-cdg6-1.cdninstagram.com/v/t51.82787-15/759146473_18631780879049152_2448145103133242635_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=1&ig_cache_key=Mzk1MjAyMzc0MDE1ODgxNjA1Ng%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkNBUk9VU0VMX0lURU0ueHBpZHMuMTQ0MC5zZHIucmVndWxhcl9waG90by5DMyJ9&_nc_ohc=BPWQAJMWpuwQ7kNvwGdQP1J&_nc_oc=AdpoHH53slN9fDJSer4UjuFXtie2IU4sLFlWgiGTWkMWn-EWgJmycNqbEl-vSfl9oio&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-cdg6-1.cdninstagram.com&_nc_gid=1yBugmDENcLlZjn1A6HEwA&_nc_ss=7a22e&oh=00_AQBHLNkf4idtmygEvZN9hi2njvz2sW_xF8-tUE-yiJHOBw&oe=6A701485",
"videoUrl": null,
"author": {
"username": "nasa",
"displayName": "NASA",
"url": "https://instagram.com/nasa",
"verified": true,
"profileImage": "https://scontent-cdg6-1.cdninstagram.com/v/t51.2885-19/29090066_159271188110124_1152068159029641216_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDgwLmMyIn0&_nc_ht=scontent-cdg6-1.cdninstagram.com&_nc_cat=1&_nc_oc=Q6cZ2gG0njRcG3R5cIO9GnRRbYfsbfpvVHqGuePg7pDchBmh38Bj_6EQCeIjnFgc-p5lkTA&_nc_ohc=sUQGBsPKUTMQ7kNvwFOpZpy&_nc_gid=1yBugmDENcLlZjn1A6HEwA&edm=AOmX9WgBAAAA&ccb=7-5&oh=00_AQA7UnNpNR2oyCzn_iZJwhJgHlzakMt5b8t3btT6ne2AUA&oe=6A701229&_nc_sid=bfaa47"
},
"engagement": {
"likes": 34510,
"comments": 178
},
"hashtags": [
"NASA",
"FlightSuit"
],
"mentions": [
"astro_fuhrmann",
"astro_lawler"
]
}
}Billing metadata is returned in response headers: X-Captapi-Credits (credits charged), X-Captapi-Cache (hit or miss), and X-Captapi-Source. 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).urlCanonical URL of the item.idStable platform ID for the item.postTypeContent type. YouTube community: "text" | "image" | "poll" | "video" | "playlist" | "quiz". Instagram: "image" | "video" | "carousel".productTypeInstagram surface: "clips" (Reel), "feed" (in-feed video/photo), or "carousel". Meta's carousel_container token is normalized to carousel.captionPost or creative caption when the platform exposes one.descriptionDescription text.publishedAtPublish date (ISO 8601) when the platform exposes an absolute timestamp.durationSecondsReel length in seconds. Omitted on carousels and still images — there is no duration to report.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.hashtagsHashtags extracted from the text.mentionsAccounts mentioned in the text.
Author
The author object contains:
usernameAccount username / handle.displayNameDisplay name of the account. Canonical across profile endpoints (prefer over name).urlCanonical URL of the item.verifiedWhether the account is verified on this platform.profileImageProfile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release).
Engagement
The engagement object contains:
likesLike count (number).commentsComment count.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | 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. |
| cache | boolean | No | Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh. |
Authentication: send your key as Authorization: Bearer capt_live_.... A typical call costs 1 credit. Pass cache=true for a free 24h cache hit; default is always fresh.
How it works
- 1. Sign up — get 100 free credits, no card required.
- 2. Create a key from your dashboard.
- 3. Send one request to
/v1/instagram/detailsand parse the JSON response.
Use cases
Analytics
Track views, likes, and engagement over time.
Competitor Monitoring
Benchmark the performance of other creators.
Dashboards
Power reporting and BI with real metadata.
Content Curation
Filter and rank videos by performance.
Frequently asked questions
What does the Instagram Post & Reel Details API do?+
The Instagram Post & Reel Details API lets you fetch full metadata and key stats from a public Instagram post using one GET request to /v1/instagram/details. It returns clean JSON — no OAuth or infrastructure setup required.
How many credits does the Instagram Post & Reel Details API cost?+
Each successful call costs 1 credit. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d. 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 proxies, rate limits, retries, and authentication for you.
Why did "Post not found" take 40–65 seconds?+
An older GraphQL/embed/web ladder hung 35s. Details then ran Decodo first; that stage now parse_empties for up to 33s on every call (0 mapped posts in 7 days) before GraphQL answers. Order is GraphQL first. Decodo is miss-only and capped at 12s — 404 / private / deleted still fail fast, an og card after Apify misses is still 200. 0 credits on 404.
Why was a live Reel returning fetch_exhausted?+
That was the old native GraphQL deadline, not a bad shortcode. GraphQL is first again and usually the winner (~14s). retryable fetch_exhausted is the miss only when GraphQL and the capped Decodo/Apify fallbacks are all empty.
Why does previewComments only have 2 rows when engagement.comments is 411?+
Instagram only embeds a short preview on the media payload. previewCommentsTruncated is true when engagement.comments is larger. That is a cap, not a handoff — /v1/instagram/comments paginates only with a working session (nextCursor). Logged-out it may return the same preview with truncatedReason=logged_out_preview. Slim preview authors often omit avatar and the verified badge — those keys are then null, not fabricated false.
How long do Instagram media URLs last?+
Signed Instagram CDN links carry oe= (hex Unix), typically about five days. mediaUrlsExpireAt is the earliest stamp across videoUrl, thumbnailUrl, author.profileImage, and carousel children. Persist the post URL and refetch; do not cache the CDN links past that stamp.
Is the Instagram Post & Reel Details API suitable for production use?+
Yes. It is a stable REST endpoint with predictable JSON and automatic retries. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d. Use it for analytics, monitoring, and content automation.
More Instagram APIs
Ready to use the Instagram Post & Reel Details API?
Sign up, grab your key, and make your first call in 60 seconds.