Threads User Posts API
Recent Threads posts — engagement{views,likes,replies,reposts,quotes}, threadId/isReply. Flat 2 credits. source + timings.
GET request to /v1/threads/user-posts that responds with clean JSON and costs 2 credits. Pass cache=true for a free 24h cache hit; default is always fresh. Start with 100 free credits — no credit card.What is the Threads User Posts API?
Pass a Threads profile URL or @handle and get recent public posts as clean JSON: id, code, url, text, ISO publishedAt, threadId / replyToId / isReply / isQuote (rebuild multi-part Threads), top-level author{} (full card once — per-post rows keep slim author without repeating profileImage), engagement{views,likes,replies,reposts,quotes} (views null when Meta omits them on hydrate), and media[] (carousel-aware), plus mediaUrlsExpireAt on each post and on author{} (when the signed media links expire). Threads exposes only a short window of recent public posts on this surface (typically the latest handful) — limit caps what you receive; it cannot increase what Threads returns. Envelope includes source (native | cache) and timings.path / timings.totalMs. Instagram usernames often differ on Threads (@womenshealth is @womenshealthmag) — known aliases remap without a scrape; other empty handles retry a related threads.com/@ link from the Instagram profile and set requestedHandle when remapped. A JS boot shell is unavailable, not empty. Unknown handle (after the Instagram remap): 404. A temporary fetch failure is a retryable 502 UPSTREAM_UNAVAILABLE at 0 credits. Flat 2 credits on every successful path. Pass cache=true for the 24h shared cache.
What you get
- engagement with views + likes/replies/reposts/quotes
- threadId / replyToId / isReply / isQuote for multi-part Threads
- source (native | cache) on every response
- requestedHandle when an Instagram username remaps to the Threads handle
- Flat 2 credits; temporary failures are a retryable 502 at 0 credits
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/threads/user-posts?url=https%3A%2F%2Fwww.threads.net%2F%40zuck" \
-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": {
"handle": "nytimes",
"author": {
"username": "nytimes",
"displayName": "The New York Times",
"verified": true,
"profileImage": "https://scontent-dfw6-2.cdninstagram.com/v/t51.2885-19/358027803_831551617930176_7923984927359078168_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby43MjAuYzIifQ&_nc_ht=scontent-dfw6-2.cdninstagram.com&_nc_cat=1&_nc_oc=Q6cZ2gGQA3JcnKQFfxyClQKaHDv8Q5_czQpQiPri-G_P9hfImFYvXNk9vNzeyobH_kQvP9Y&_nc_ohc=TwEk211szzgQ7kNvwFcrGtY&_nc_gid=8hOzf2CLy6HVB1RuL6P2DQ&edm=APs17CUBAAAA&ccb=7-5&oh=00_AQNGn_bixIfCPkwtWjUXOIFTdeu1JeDyvTth_UN-tRGzRw&oe=6ADBDBA6&_nc_sid=10d13b",
"mediaUrlsExpireAt": "2026-10-23T22:11:50.000Z"
},
"totalReturned": 2,
"posts": [
{
"platform": "threads",
"id": "4010994930771875389",
"code": "Dep6qNsjNY9",
"url": "https://www.threads.net/@nytimes/post/Dep6qNsjNY9",
"text": "Greta Lee, Taylor Swift and Colman Domingo were among the stars on the gray and beige carpet at the sixth annual Academy Museum of Motion Pictures gala on Saturday.\n\nThe gala’s décor was inspired by the museum’s new exhibition, “The Horror Show,” which explores and celebrates decades of horror filmmaking.",
"publishedAt": "2026-10-18T23:57:57.000Z",
"threadId": "4010994930771875389",
"replyToId": null,
"quoteId": null,
"isReply": false,
"isQuote": false,
"author": {
"username": "nytimes",
"displayName": "The New York Times",
"verified": true
},
"engagement": {
"likes": 57,
"replies": 1,
"reposts": null,
"quotes": 0
},
"media": [
"https://scontent-dfw6-1.cdninstagram.com/v/t51.82787-15/855107266_17987054931120479_5612134646240846500_n.jpg?stp=c0.135.1080.1080a_dst-jpg_e35_s1080x1080_tt6&_nc_cat=103&ig_cache_key=NDAxMDk5NDkzMDc3MTg3NTM4OQ%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuMTA4MC5zZHIucmVndWxhcl9waG90by5DMyJ9&_nc_ohc=VtL9s2YLoPoQ7kNvwHtRnU8&_nc_oc=Adp_0rfY-FD0SFdiNtmwFRQneJ0X3dD9wFOB5v3DNZld3fIbbCPQ2gG9MPKUJXM54E8&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-dfw6-1.cdninstagram.com&_nc_gid=8hOzf2CLy6HVB1RuL6P2DQ&_nc_ss=7a22e&oh=00_AQNyMlx4iwI1BCnI3cTxAiTrcsyOLybtsGQIHFzgWMBgWw&oe=6ADBCE39"
],
"mediaUrlsExpireAt": "2026-10-23T21:14:33.000Z"
},
{
"platform": "threads",
"id": "4010994965249029684",
"code": "Dep6qtzjHY0",
"url": "https://www.threads.net/@nytimes/post/Dep6qtzjHY0",
"text": "See more photos: https://www.nytimes.com/2026/10/18/style/taylor-swift-academy-museum-gala-2026.html?smid=threads-nytimes",
"publishedAt": "2026-10-18T23:58:01.000Z",
"threadId": "4010994930771875389",
"replyToId": "4010994930771875389",
"quoteId": null,
"isReply": true,
"isQuote": false,
"author": {
"username": "nytimes",
"displayName": "The New York Times",
"verified": true
},
"engagement": {
"likes": 10,
"replies": null,
"reposts": null,
"quotes": 0
},
"media": [],
"mediaUrlsExpireAt": null
}
]
}
}Billing metadata is returned in response headers: X-Captapi-Credits (credits charged), X-Captapi-Cache (hit or miss), and X-Captapi-Request-Id (include it when contacting support). Where the response has a source field, it names the path that served the data: native, extended, cache or asr. 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
handleAccount handle.totalReturnedNumber of items returned in this response.sourcenative or cache.
Author
The author object contains:
usernameAccount username / handle.displayNameDisplay name of the account. Canonical across profile endpoints (prefer over name).verifiedWhether Meta shows a verified badge on the post author.profileImageProfile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release).mediaUrlsExpireAtISO-8601 time the earliest signed media link on this object expires (Meta CDN oe= stamp). Re-fetch after it.
Posts
Each item in posts contains:
platformPlatform identifier for this response (matches the endpoint's platform).idId of this posts item.codeCode. Example: "Dep6qNsjNY9".urlCanonical URL of the item.textText content.publishedAtPost publish time as ISO-8601 UTC.threadIdId of the thread root post. Multi-part Threads share one threadId — group by this to rebuild the chain.replyToIdParent post id when this row is a reply in a multi-part Thread (null on the root).quoteIdQuote id.isReplytrue when the post replies to another post in a Thread chain.isQuotetrue when the post quotes another post.authorTop-level: full profile card for the requested handle (once). Per-post author is slim (username/displayName/verified, no profileImage) to avoid repeating CDN URLs.engagementEngagement metrics for the item.mediaMedia attached to the item.mediaUrlsExpireAtISO-8601 time the earliest signed media link on this object expires (Meta CDN oe= stamp). Re-fetch after it.
Timings
Deprecated: timings will be removed from response bodies on 2026-12-17. Read the Server-Timing response header instead (total;dur=<ms>). Until then the timings object contains:
pathPath. Example: "native".totalMsTotal ms. Example: 14378.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | Threads profile URL or @handle. 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 100). Threads exposes only a short window of recent public posts on this surface. limit caps what you receive; it cannot increase what Threads returns. Flat 2 credits on every successful call. |
| 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 2 credits. 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/threads/user-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 Threads User Posts API do?+
The Threads User Posts API lets you list items in bulk with metadata from a public Threads post using one GET request to /v1/threads/user-posts. It returns clean JSON — no OAuth or infrastructure setup required.
How many credits does the Threads User Posts API cost?+
Each successful call costs 2 credits. 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 Threads 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 is @womenshealth / @menshealth / @vogue / @theverge 404 THREADS_POSTS_NOT_FOUND?+
Not because they have no posts. Those are Instagram usernames — on Threads the same brands are @womenshealthmag, @menshealthmag, @voguemagazine, and @verge. A JS boot shell used to be classified empty and 404 immediately. Known aliases remap without scraping Instagram; other brands still read a related threads.com/@ link from the Instagram profile. A successful remap returns handle as the Threads username and requestedHandle as what you sent. A hydrated Threads profile with zero public posts is still 404 (0 credits). Prefer the Threads URL when you know it.
Why is this 2 credits when older docs said ~14?+
Every successful call is flat 2 credits, same class as twitter/search. The old ~14 / ~0.7-per-post figure was the rate of a fetch path this endpoint no longer uses; it is not what the meter charges.
I set limit=100 but only got a handful of posts. Is the endpoint broken?+
No. Threads exposes only a short window of recent public posts on this surface. limit caps what you receive; it cannot increase what Threads returns. The public profile page carries the latest handful of posts — fewer rows, but fresh ones. That is the surface, not a regression.
How do I rebuild a multi-part Thread?+
Group posts by threadId. Within a thread, replyToId points at the previous post's id (root has replyToId null / isReply false). isQuote + quoteId mark quote posts.
Is the Threads User 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. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d. Use it for analytics, monitoring, and content automation.
More Threads APIs
Ready to use the Threads User Posts API?
Sign up, grab your key, and make your first call in 60 seconds.