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:
topis relevance-ranked;recentis 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.
| Param | Type | Required | Default | Description |
|---|---|---|---|---|
id | string | Yes | — | Threads post shortcode or numeric ID |
cURL
curl -H "x-api-key: sk_byc_xxx" \
https://api.bycrawl.com/threads/posts/DQt-ox3kdE4Response
{
"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.
| Param | Type | Required | Default | Description |
|---|---|---|---|---|
ids | string | Yes | — | Comma-separated post IDs or shortcodes |
cURL
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.
| Param | Type | Required | Default | Description |
|---|---|---|---|---|
max | boolean | No | false | Compatibility parameter; official account pool is always used |
cURL
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.
| Param | Type | Required | Default | Description |
|---|---|---|---|---|
q | string | Yes | — | Search keyword |
count | integer | No | 10 | Maximum posts to return (max 25 for top, 200 for recent) |
search_type | string | No | top | top (relevance) or recent (chronological) |
since | string | No | — | ISO date/time lower bound for recent |
until | string | No | — | 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
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.
| Param | Type | Required | Default | Description |
|---|---|---|---|---|
username | string | Yes | — | Threads username |
cURL
curl -H "x-api-key: sk_byc_xxx" \
https://api.bycrawl.com/threads/users/zuckResponse
{
"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.
| Param | Type | Required | Default | Description |
|---|---|---|---|---|
username | string | Yes | — | Threads username |
cURL
curl -H "x-api-key: sk_byc_xxx" \
https://api.bycrawl.com/threads/users/zuck/postsResponse
{
"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.
| Param | Type | Required | Default | Description |
|---|---|---|---|---|
username | string | Yes | — | 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
]
}