Skip to Content

Threads

Meta’s text-based social platform. All data is retrieved through the official account pool; SSR data fallback is disabled; profile lookup alone may use Apify after official access fails. Public profile and user-post lookup requires approved and granted threads_profile_discovery access.

Unavailable engagement/profile counts and reply totals are null, not zero. Post responses include a nullable canonicalId (public shortcode) for stable identity across retrieval paths. Legacy numeric IDs remain accepted.

  • Post IDs: Use the shortcode (e.g. DQt-ox3kdE4) or numeric ID
  • User lookup: Use username for all user endpoints (profile, posts, replies)
  • Search scope: top is relevance-ranked; recent is chronological through the managed provider boundary; cursor pagination is unavailable
  • Result counts: Requested counts are maximums, not guaranteed matches.

Posts

GET /threads/posts/:id — 2 credits

Get a single post by shortcode or ID. Fields unavailable from the provider, including views, may be null.

ParamTypeRequiredDefaultDescription
idstringYes—Threads post shortcode or numeric ID
curl -H "x-api-key: sk_byc_xxx" \ https://api.bycrawl.com/threads/posts/DQt-ox3kdE4

Response

{ "id": "3759936745132642616", "mediaId": "18062699315155466", "code": "DQt-ox3kdE4", "canonicalId": "DQt-ox3kdE4", "dedupKey": "threads:post:DQt-ox3kdE4", "text": "Priscilla and I started CZI almost 10 years ago...", "user": { "id": "314216", "username": "zuck", "profilePic": "https://...", "isVerified": true }, "media": [], "views": null, "stats": { "likes": 818, "replies": 927, "quotes": 16, "reposts": 112, "shares": 119 }, "createdAt": "2025-11-06T14:30:09.000Z", "replyTo": null, "threadChain": [], "isReply": false }

GET /threads/posts?ids=a,b,c — 2 credits per item

Batch get multiple posts. The request fails explicitly if any requested post cannot be retrieved through the official account pool; successful arrays never contain hidden per-item error placeholders.

ParamTypeRequiredDefaultDescription
idsstringYes—Comma-separated post IDs or shortcodes
curl -H "x-api-key: sk_byc_xxx" \ "https://api.bycrawl.com/threads/posts?ids=DQt-ox3kdE4,DQEmdfkkSNE"

Response

[ { "id": "3759936745132642616", "mediaId": "18062699315155466", "code": "DQt-ox3kdE4", "canonicalId": "DQt-ox3kdE4", "dedupKey": "threads:post:DQt-ox3kdE4", "text": "Priscilla and I started CZI almost 10 years ago...", "user": { "id": "314216", "username": "zuck", "profilePic": "https://...", "isVerified": true }, "media": [], "views": 166996, "stats": { "likes": 818, "replies": 927, "quotes": 16, "reposts": 112, "shares": 119 }, "createdAt": "2025-11-06T14:30:09.000Z", "replyTo": null, "threadChain": [], "isReply": false } ]

GET /threads/posts/:id/replies — 3 credits

Get replies to a Threads post. totalReplies is null when unknown; a numeric value is an observed total, not an exhaustive-retrieval guarantee. hasMore indicates truncation. Pagination beyond the first batch is not supported.

ParamTypeRequiredDefaultDescription
maxbooleanNofalseCompatibility parameter; official account pool is always used
curl -H "x-api-key: sk_byc_xxx" \ "https://api.bycrawl.com/threads/posts/DW4Gb79kQc0/replies"

Response

{ "rootPost": { "id": "3870872187813562164", "code": "DW4Gb79kQc0", "text": "Original post text...", "user": { "id": "314216", "username": "zuck", "profilePic": "https://...", "isVerified": true }, "stats": { "likes": 2613, "replies": 476, "quotes": 55, "reposts": 189, "shares": 336 }, "createdAt": "2026-04-09T14:00:00.000Z" }, "replies": [ { "id": "3870872993254359647", "code": "DW4Hqm0AMge", "text": "This is a reply to the original post", "user": { "id": "63125302142", "username": "justincookphoto", "profilePic": "https://...", "isVerified": false }, "media": [], "stats": { "likes": 92, "replies": 5, "quotes": 0, "reposts": 0, "shares": 0 }, "createdAt": "2026-04-09T15:00:00.000Z", "replyTo": null, "threadChain": [], "isReply": true } // ...more items ], "totalReplies": 476, "hasMore": true }

GET /threads/posts/search?q=xxx — 3 credits per call (top and recent)

Search posts by keyword. top uses the public relevance page. recent uses a provider that supports true chronological search rather than re-sorting a relevance-only sample.

ParamTypeRequiredDefaultDescription
qstringYes—Search keyword
countintegerNo10Maximum posts to return (max 25 for top, 200 for recent)
search_typestringNotoptop (relevance) or recent (chronological)
sincestringNo—ISO date/time lower bound for recent
untilstringNo—ISO date/time upper bound for recent

Both top and recent use managed retrieval with bounded recovery. Recent never falls back to relevance-only results. If retrieval fails without usable data, the request fails. A valid short or empty result is not an error.

Inspect search.partial, reason, requestedCount and returnedCount. Incomplete retrieval preserves collected posts with partial: true and reason: "incomplete_results"; otherwise reason is null. partial: false is not an exhaustive-recall guarantee. Date bounds are filtered locally; keyword matching is not exact-phrase matching. Acquisition diagnostics are internal: source, sources and fallbackAttempted are no longer returned. Use canonicalId (the public shortcode) for persistent identity and post/replies/batch lookups, or dedupKey (threads:post: plus shortcode) for namespaced deduplication. Existing id values remain compatible but can differ between retrieval paths. When neither a shortcode nor a valid Threads permalink is available, canonicalId and dedupKey are null; retain the original id without assuming cross-source equality.

Identical searches share a cache for up to 60 seconds; recovery results may use a shorter cache. top and recent have separate keys. Concurrent identical searches share work across workers. Coordination outages return a temporary service error rather than starting duplicate upstream work; retry with backoff. Each successful API request is still billed normally, including cache hits.

Unavailable engagement stats are null, never invented zeros. Numeric values represent observed counts. Search cursors are not returned because this endpoint does not accept pagination.

Both top and recent cost 3 credits per successful request, regardless of count or the number of matches returned. Failed requests are refunded by the Gateway.

curl -H "x-api-key: sk_byc_xxx" \ "https://api.bycrawl.com/threads/posts/search?q=threads&search_type=recent"

Response

{ "posts": [ { "id": "3847614751430661572", "mediaId": "17913742854319868", "code": "DVleTsbk9XE", "text": "Artists! Show me your most recent artwork!...", "user": { "id": "63436967516", "username": "koshino.yoshihiro", "profilePic": "https://...", "isVerified": true }, "media": [], "stats": { "likes": 41, "replies": 118, "quotes": 0, "reposts": 0, "shares": 0 }, "createdAt": "2026-03-07T13:50:42.000Z" } // ...more items ] }

Users

GET /threads/users/:username — 2 credits

Get user profile.

ParamTypeRequiredDefaultDescription
usernamestringYes—Threads username
curl -H "x-api-key: sk_byc_xxx" \ https://api.bycrawl.com/threads/users/zuck

Response

{ "id": "314216", "username": "zuck", "fullName": "Mark Zuckerberg", "profilePic": "https://...", "bio": "I build stuff", "isVerified": true, "followerCount": 5439848, "followingCount": 0 }

GET /threads/users/:username/posts — 2 credits

Get the first official batch of a user’s posts. Connected accounts use me/threads; other public accounts require approved and granted profile discovery. Custom counts and pagination are unavailable.

This is not a complete post history. Repeating the request fetches the first batch again, not a next page. No usable cursor or completeness flag is returned; do not interpret a short or empty batch as proof that the account has no older posts. Passing cursor, count, page, after, before, limit or offset returns HTTP 400.

ParamTypeRequiredDefaultDescription
usernamestringYes—Threads username
curl -H "x-api-key: sk_byc_xxx" \ https://api.bycrawl.com/threads/users/zuck/posts

Response

{ "posts": [ { "id": "3759936745132642616", "code": "DQt-ox3kdE4", "text": "Priscilla and I started CZI almost 10 years ago...", "user": { "id": "314216", "username": "zuck", "profilePic": "https://...", "isVerified": true }, "stats": { "likes": 818, "replies": 927, "quotes": 16, "reposts": 112, "shares": 119 }, "hasMedia": false, "createdAt": "2025-11-06T14:30:09.000Z" } // ...more items ] }

GET /threads/users/:username/replies — 2 credits

Get the first official reply batch for a matching connected account. Arbitrary-user reply lists, custom counts and pagination are unavailable. Reply items preserve replyId, replyCode, replyText, replyTimestamp and replier. Missing text, parent context, self/other classification and author metadata are null when not supplied by Meta.

ParamTypeRequiredDefaultDescription
usernamestringYes—Threads username

Response

{ "replies": [ { "type": "others", "replyId": "3848726738042452746", "replyCode": "DVpbJOqkXsK", "replyText": "Congrats! This is wild...", "replyTimestamp": "2026-03-09T02:40:01.000Z", "stats": { "likes": 60, "replies": 12, "quotes": 0, "reposts": 0, "shares": 5 }, "replier": { "id": "314216", "username": "zuck", "profilePic": "https://...", "isVerified": true }, "replyTo": { "postId": "3848622568860907884", "postCode": "DVpDdXjgXls", "postText": "Original post text...", "postUrl": "https://www.threads.com/@otheruser/post/DVpDdXjgXls", "author": { "id": "63215166896", "username": "otheruser", "profilePic": "https://...", "isVerified": true } } } // ...more items ] }
Last updated on