Instagram
GET /v1/instagram/details

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.

1 credit per request
TL;DR
Get an Instagram post, Reel or carousel — caption, likes, comments, views, media URLs, author, and per-slide children on carousels. The Instagram Post & Reel Details API (Instagram) is a single authenticated 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. A 200 is the post only — no source / stages / 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.

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) or fetch_exhausted | empty_payload (502). GraphQL → embed → fallback path.
  • mediaUrlsExpireAt from CDN oe=

Try it

Open in Playground

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

Sign in to run live
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

NameTypeRequiredDescription
urlstringYesInstagram 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.
cachebooleanNoSet 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.

Using an AI agent? This endpoint is the MCP tool instagram_details via @captapi/mcp. Set it up →

How it works

  1. 1. Sign up — get 100 free credits, no card required.
  2. 2. Create a key from your dashboard.
  3. 3. Send one request to /v1/instagram/details and 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 access, 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 a slow stage first that came back empty for up to 33s before GraphQL answered. Order is GraphQL first. Slower stages run only on a miss and are capped — 404 / private / deleted still fail fast, and an og card after the fallback misses is still 200. 0 credits on 404.

Why was a live Reel returning fetch_exhausted?+

Usually a wall window, not a bad shortcode. Logged-out GraphQL is capped at 8s so a session hop still runs inside the 16s native budget; /p/ and /reel/ are both fetched before the 60s fail-cache locks the shortcode. retryable fetch_exhausted is the miss only when every path came back 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). A logged-out preview of a larger thread is 503 SESSION_UNAVAILABLE at 0 credits, not a billed 2-row sample. 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.

Instagram Post & Reel Details API | Captapi — Captapi