Threads
GET /v1/threads/user-posts

Threads User Posts API

Recent Threads posts — engagement{views,likes,replies,reposts,quotes}, threadId/isReply. Flat 2 credits. source + stages/ms.

2 credits per request
TL;DR
Recent Threads posts — engagement{views,likes,replies,reposts,quotes}, threadId/isReply. Flat 2 credits. source + stages/ms. The Threads User Posts API (Threads) is a single authenticated 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). Threads exposes only a short window of recent public posts on this surface — limit caps what you receive; it cannot increase what Threads returns. Native trades count for freshness (recent timeline) vs the extended path (fewer recent rows is not a regression). Cascade order is per-platform config (Threads default: Decodo → Evomi → Webshare → Apify last) on a Threads-only pool (Instagram native% is the canary — Threads 403s do not rotate that pool). Envelope includes source (native | extended | cache), stages/ms per tier, 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. Flat 2 credits on every successful path — the old ~0.7/post Apify rate is measurement-only (credits_computed), never the meter. 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 + stages/ms (Decodo → Evomi → Webshare → Apify; order is config)
  • requestedHandle when an Instagram username remaps to the Threads handle
  • Flat 2 credits on native and extended

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/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": "zuck",
    "author": {
      "username": "zuck",
      "displayName": "Mark Zuckerberg",
      "verified": true,
      "profileImage": "https://scontent-cdg4-2.cdninstagram.com/v/t51.82787-19/550174606_17925811725103224_8363667901743352243_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDgwLmMyIn0&_nc_ht=scontent-cdg4-2.cdninstagram.com&_nc_cat=100&_nc_oc=Q6cZ2gHf4XJXymdRHno1xv4ZWDptPQ_F47AvofZR9ZypzIXJ5_ggqvnOJ4NFY10teCcuKSw&_nc_ohc=vLH8jAZMCqoQ7kNvwFFwBjL&_nc_gid=wkyjiyQ2aEsOml1qJ-3q-Q&edm=APs17CUBAAAA&ccb=7-5&oh=00_AQBvZqkyiiQ8DOAXcD-rNsrA7GYbSMXCSzCPUIBJWAPwew&oe=6A6E2ABE&_nc_sid=10d13b"
    },
    "totalReturned": 2,
    "posts": [
      {
        "platform": "threads",
        "id": "3937491905269768921",
        "code": "DakyAavlKLZ",
        "url": "https://www.threads.net/@zuck/post/DakyAavlKLZ",
        "text": "Today we're releasing Muse Spark 1.1 -- a strong agentic and coding model at a very low price. It's available through our new Meta Model API and in Meta AI.",
        "publishedAt": "2026-07-09T14:00:34.000Z",
        "threadId": "3937491905269768921",
        "replyToId": null,
        "quoteId": null,
        "isReply": false,
        "isQuote": false,
        "author": {
          "username": "zuck",
          "displayName": "Mark Zuckerberg",
          "verified": true
        },
        "engagement": {
          "views": null,
          "likes": 2852,
          "replies": 765,
          "reposts": 196,
          "quotes": 63
        },
        "media": []
      },
      {
        "platform": "threads",
        "id": "3937491928497827415",
        "code": "DakyAwYFK5X",
        "url": "https://www.threads.net/@zuck/post/DakyAwYFK5X",
        "text": "Muse Spark 1.1 is strongest at agentic performance, tool use, and computer use. It does well on long-running tasks with 1M token context window, can delegate execution to sub-agents running in parallel, and is trained to use computer interfaces on desktop, mobile, or browser.",
        "publishedAt": "2026-07-09T14:00:37.000Z",
        "threadId": "3937491905269768921",
        "replyToId": "3937491905269768921",
        "quoteId": null,
        "isReply": true,
        "isQuote": false,
        "author": {
          "username": "zuck",
          "displayName": "Mark Zuckerberg",
          "verified": true
        },
        "engagement": {
          "views": null,
          "likes": 912,
          "replies": 91,
          "reposts": 59,
          "quotes": 14
        },
        "media": [
          "https://scontent-cdg4-3.cdninstagram.com/v/t51.82787-15/741068464_17977387650103224_214669101615299168_n.webp?_nc_cat=110&ig_cache_key=MzkzNzQ5MTkyODQ5NzgyNzQxNQ%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuMTYyMC5zZHIucmVndWxhcl9waG90by5DMyJ9&_nc_ohc=BnavDWIpJKMQ7kNvwGW14gJ&_nc_oc=Ado5sxMS3V9I9TFA6KpOo5ZTsDLrt2liAWKAxWtcz-ea50_hZb2YjO_d70TiTHhjkGA&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-cdg4-3.cdninstagram.com&_nc_gid=wkyjiyQ2aEsOml1qJ-3q-Q&_nc_ss=7a22e&oh=00_AQDyLjCkW1XRN7kshX0Uybz1QIy_tJdKTcfMdl2WJNISyA&oe=6A6E32AC"
        ]
      }
    ]
  }
}

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

  • handleAccount handle.
  • totalReturnedNumber of items returned in this response.

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).

Posts

Each item in posts contains:

  • platformPlatform identifier for this response (matches the endpoint's platform).
  • idId of this posts item.
  • codeCode. Example: "DakyAavlKLZ".
  • 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.

Parameters

NameTypeRequiredDescription
urlstringYesThreads 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.
limitintegerNoMax 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 path (native and extended).
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 2 credits. Pass cache=true for a free 24h cache hit; default is always fresh.

Using an AI agent? This endpoint is the MCP tool threads_user_posts 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/threads/user-posts and 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 proxies, 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 — native and extended (Apify) share one published price, same class as twitter/search. The old ~14 / ~0.7-per-post figure is still recorded as credits_computed for subsidy reports; it is not what the meter charges. Native landing does not change the customer price (already 2); it improves row count and margin.

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. Native returns fewer but fresher rows (recent timeline) than the extended scrape — that is the intended trade, 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.

Threads User Posts API | Captapi — Captapi