Instagram Channel Posts API
Latest posts from a public Instagram profile — carousel children[], mediaCount, user{} in one call.
GET request to /v1/instagram/channel-posts that responds with clean JSON and costs ~6 credits (0.3/result). 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 Channel Posts API?
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; apify-fallback, apify-timeout, or apify-timeout-served-stale when soft-fail). Apify soft-fail is hard-capped at ~105s; on timeout we serve the last cached page for that profile (degradedReason=apify-timeout-served-stale + cachedAt) when one exists, else an empty apify-timeout page — never a 524 at Cloudflare's 125s edge. 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.
What you get
- Top-level user{} profile (null on degraded path)
- Carousel children[] + honest mediaCount (null if unexpanded)
- Stale-serve on extended-timeout (cachedAt labelled)
- Uniform envelope: degraded / degradedReason / user / userId
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/channel-posts?url=https%3A%2F%2Fwww.instagram.com%2Fnasa%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,
"cached": false,
"creditsUsed": 6,
"requestId": "8f3c2a1e-4b9d-4e6a-9c1f-2d7e5b8a0c34",
"fetchedAt": "2026-08-17T19:43:38.545Z",
"cachedAt": null,
"data": {
"url": "https://www.instagram.com/nasa/",
"totalReturned": 2,
"posts": [
{
"platform": "instagram",
"url": "https://www.instagram.com/reel/DbYmqpplO_N/",
"id": "3952078729724096461",
"postType": "Video",
"productType": "clips",
"caption": "The Sun and Moon are coming together to put on a show for Earth, and we'll be sharing it with you. 😎\n\nOn Aug. 12, a total solar eclipse will pass over Earth, and we'll be broadcasting it live along the path of totality. Check our link in bio to learn how to watch along with us!\n\n#NASA #Sun #TotalSolarEclipse2026",
"description": "The Sun and Moon are coming together to put on a show for Earth, and we'll be sharing it with you. 😎\n\nOn Aug. 12, a total solar eclipse will pass over Earth, and we'll be broadcasting it live along the path of totality. Check our link in bio to learn how to watch along with us!\n\n#NASA #Sun #TotalSolarEclipse2026",
"publishedAt": "2026-07-29T17:02:45Z",
"thumbnailUrl": "https://scontent-lga3-3.cdninstagram.com/v/t51.82787-15/760192799_18631809481049152_7782886010573196119_n.jpg?stp=dst-jpg_e15_tt6&_nc_ht=scontent-lga3-3.cdninstagram.com&_nc_cat=104&_nc_oc=Q6cZ2gGam1aPbxqnPf0b0JKP7tArIHvIrXRHft307eWE7UMXS_pr6S4N6-Dm4L-cNp1JOIg&_nc_ohc=NLXhSIvSAE8Q7kNvwG7hHBp&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AQAOYlO_MiU0ymVZP-LUmVyzq1Qfu0qndl3JUXVB6LqVwA&oe=6A6FEEDB&_nc_sid=8b3546",
"videoUrl": "https://scontent-lga3-1.cdninstagram.com/o1/v/t2/f2/m86/AQOkpXQA9C2FhMuyAbNvepC6OP6PrkitJW3nqH3dhIDVm7lu82BvCIZApUA5L2uZr02DWsYDPOvZUymd3s8Q5RQJ_i1Bkk9Qx3VnTwk.mp4?_nc_cat=111&_nc_sid=5e9851&_nc_ht=scontent-lga3-1.cdninstagram.com&_nc_ohc=DqUQRmuNQ38Q7kNvwEf3m2C&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5JTlNUQUdSQU0uQ0xJUFMuQzMuNzIwLmRhc2hfYmFzZWxpbmVfMV92MSIsInhwdl9hc3NldF9pZCI6MTg2MzE4MDkzMTAwNDkxNTIsImFzc2V0X2FnZV9kYXlzIjowLCJ2aV91c2VjYXNlX2lkIjoxMDA5OSwiZHVyYXRpb25fcyI6NDQsInVybGdlbl9zb3VyY2UiOiJ3d3cifQ%3D%3D&ccb=17-1&vs=d63b773f9b2109a6&_nc_vs=HBksFQIYUmlnX3hwdl9yZWVsc19wZXJtYW5lbnRfc3JfcHJvZC9ENjQ4OTVCRTVEN0I2MDc3MzFGQkNDNUI1MjZDN0RCMl92aWRlb19kYXNoaW5pdC5tcDQVAALIARIAFQIYUWlnX3hwdl9wbGFjZW1lbnRfcGVybWFuZW50X3YyLzlBNDA3ODFBQjMyMTkwODU4OTg3RTNFRUYzNUJBMkE4X2F1ZGlvX2Rhc2hpbml0Lm1wNBUCAsgBEgAoABgAGwKIB3VzZV9vaWwBMRJwcm9ncmVzc2l2ZV9yZWNpcGUBMRUAACaAjpb3hOKYQhUCKAJDMywXQEZnztkWhysYEmRhc2hfYmFzZWxpbmVfMV92MREAdf4HZeadAQA&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&_nc_ss=7a22e&_nc_zt=28&oh=00_AQDrxCQWJjYdJ_A1wP9NAqwnYMpcGLVAhJP0LpoE3AyyTg&oe=6A6C1F8C",
"author": {
"username": "nasa",
"displayName": "NASA",
"url": "https://instagram.com/nasa",
"followers": 104263202,
"verified": true,
"profileImage": "https://scontent-lga3-1.cdninstagram.com/v/t51.2885-19/29090066_159271188110124_1152068159029641216_n.jpg?stp=dst-jpg_s320x320_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDgwLmMyIn0&_nc_ht=scontent-lga3-1.cdninstagram.com&_nc_cat=1&_nc_oc=Q6cZ2gGam1aPbxqnPf0b0JKP7tArIHvIrXRHft307eWE7UMXS_pr6S4N6-Dm4L-cNp1JOIg&_nc_ohc=sUQGBsPKUTMQ7kNvwEjppQT&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AQABrOC8fhriT4lnoxQ6_A9newYDo18-mqvkuOv21yGkUQ&oe=6A701229&_nc_sid=8b3546"
},
"engagement": {
"views": 51078,
"likes": 10645,
"comments": 149,
"viewsInstagram": 40862,
"viewsFacebook": 10216
},
"hashtags": [
"NASA",
"Sun"
],
"mentions": []
},
{
"platform": "instagram",
"url": "https://www.instagram.com/p/DbYaLffE2DD/",
"id": "3952023811948503235",
"postType": "Sidecar",
"productType": null,
"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",
"thumbnailUrl": "https://scontent-lga3-1.cdninstagram.com/v/t51.82787-15/759146473_18631780879049152_2448145103133242635_n.jpg?stp=dst-jpg_e35_s1080x1080_sh2.08_tt6&_nc_ht=scontent-lga3-1.cdninstagram.com&_nc_cat=1&_nc_oc=Q6cZ2gGam1aPbxqnPf0b0JKP7tArIHvIrXRHft307eWE7UMXS_pr6S4N6-Dm4L-cNp1JOIg&_nc_ohc=nvbF_-MRTWYQ7kNvwE_MszZ&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AQBJhJwZzwhl7hvGpLhh1jBk2dWyz3xAd05kIR1XwonMrg&oe=6A701485&_nc_sid=8b3546",
"author": {
"username": "nasa",
"displayName": "NASA",
"url": "https://instagram.com/nasa",
"followers": 104263202,
"verified": true,
"profileImage": "https://scontent-lga3-1.cdninstagram.com/v/t51.2885-19/29090066_159271188110124_1152068159029641216_n.jpg?stp=dst-jpg_s320x320_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDgwLmMyIn0&_nc_ht=scontent-lga3-1.cdninstagram.com&_nc_cat=1&_nc_oc=Q6cZ2gGam1aPbxqnPf0b0JKP7tArIHvIrXRHft307eWE7UMXS_pr6S4N6-Dm4L-cNp1JOIg&_nc_ohc=sUQGBsPKUTMQ7kNvwEjppQT&_nc_gid=EJ9eFsuBV8RTUu0BGi0U6A&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AQABrOC8fhriT4lnoxQ6_A9newYDo18-mqvkuOv21yGkUQ&oe=6A701229&_nc_sid=8b3546"
},
"engagement": {
"likes": 34106,
"comments": 177,
"views": null
},
"hashtags": [
"NASA",
"FlightSuit"
],
"mentions": [
"astro_fuhrmann",
"astro_lawler"
]
}
],
"nextCursor": "3947740140450436425_528817151",
"hasMore": true
}
}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, cached, creditsUsed, requestId, fetchedAt, cachedAt, and a data object with the following fields:
Top-level fields
urlCanonical URL of the item.totalReturnedNumber of items returned in this response.nextCursorCursor 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).hasMoreWhether more results are available beyond this page. When true, pass nextCursor to fetch the next page.
Posts
Each item in posts contains:
platformPlatform identifier for this response (matches the endpoint's platform).urlCanonical URL of the item.idId of this posts item.postTypeContent type. YouTube community: "text" | "image" | "poll" | "video" | "playlist" | "quiz". Instagram: "image" | "video" | "carousel".productTypePlatform product type (e.g. clips, feed). Null when not applicable (image/carousel) — never an empty string.captionPost or creative caption when the platform exposes one.descriptionDescription of this posts item.publishedAtPublish date (ISO 8601) when the platform exposes an absolute timestamp.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.authorAuthor name or handle.engagementEngagement metrics for the item.hashtagsHashtags extracted from the text.mentionsAccounts mentioned in the text.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | 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. |
| limit | integer | No | Max items to return (default 20, max 200). Billed per result. |
| cursor | string | No | 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. |
| cache | boolean | No | Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh. Envelope includes cached + cachedAt on hits. |
Authentication: send your key as Authorization: Bearer capt_live_.... A typical call costs ~6 credits (0.3/result) — billed per result, so the exact amount scales with how many items you request. Pass cache=true for a free 24h cache hit; default is always fresh (metrics refresh within ~1 hour).
instagram_channel_posts via @captapi/mcp. Set it up →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/channel-postsand parse the JSON response.
Use cases
Content Pipelines
Ingest a channel's catalog in bulk.
Monitoring
Detect new uploads automatically.
Archiving
Snapshot a creator's library — metadata plus CDN media URLs (re-fetch before mediaUrlsExpireAt).
Analytics
Aggregate performance across many videos.
Frequently asked questions
What does the Instagram Channel Posts API do?+
The Instagram Channel Posts API lets you list items in bulk with metadata from a public Instagram post using one GET request to /v1/instagram/channel-posts. It returns clean JSON — no OAuth or infrastructure setup required.
How many credits does the Instagram Channel Posts API cost?+
At the default limit this endpoint costs 6 credits (0.3 per result). Billing scales with how many results you request. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Hits include cached + cachedAt. 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.
Is the Instagram Channel Posts 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. Hits include cached + cachedAt. 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 Channel Posts API?
Sign up, grab your key, and make your first call in 60 seconds.