Threads Public Data API
Search public Threads conversations, discover accounts and retrieve profiles or individual posts. Build source-linked brand research from observed matches—not a complete archive or a guaranteed real-time feed.
Open the standalone Threads data demoYour first public Threads profile lookup
Replace <API_KEY> with your authorized platform API key from the dashboard. Query URLs contain your key; keep it out of shared links, screenshots, source control and logs, and make production calls server-side.
The example calls get-user-details with username=zuck, a public account handle. Inspect status and data.user before using its identity or follower count. This is a read-only request with no Threads account credential; live availability, a populated profile and optional fields are not guaranteed.
Base URL https://api.opendata-api.com
curl -X GET 'https://api.opendata-api.com/api/project/threads-scraper/get-user-details?key=<API_KEY>&username=zuck'import requests
response = requests.request(
"GET",
"https://api.opendata-api.com/api/project/threads-scraper/get-user-details",
params={
"key": "<API_KEY>",
"username": "zuck",
},
timeout=30,
)
response.raise_for_status()
print(response.json())const url = new URL("https://api.opendata-api.com/api/project/threads-scraper/get-user-details");
url.search = new URLSearchParams({
"key": "<API_KEY>",
"username": "zuck",
}).toString();
const response = await fetch(url, {
method: "GET",
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());Public Threads data request basics
- This independent, read-only API covers available public Threads data. It does not publish posts, access private activity, list follower identities or provide private audience analytics. Use data only for authorized, lawful purposes, respect platform terms and privacy, and define retention for stored public content.
- Use the account handle, such as zuck, where username is required—not a display name, profile URL or numeric account ID. Review similar-name candidates rather than assuming ownership. Preserve pk, id and code as separate strings; an account-post id can include an account suffix, and a shortcode is not a numeric post ID.
- Within the operation payload, iterate data.results[] for keyword search, follow node.thread, then iterate thread_items[] and read each post. For account posts, iterate data.posts[], then node.thread_items[], and read each post. A wrapper can contain multiple posts: flatten every thread item before counting or exporting, while retaining author, text, source identifiers and posting time when available.
- search-posts accepts only query; list-user-posts accepts only username, and user search exposes no pagination input. A returned data.cursor does not authorize cursor, page, limit, date-range or sort inputs. Results are changing samples, not exhaustive histories. Implement bounded polling, deduplication, relevance review and alerts in your own application without claiming a real-time feed.
- For get-post-details, supply code or url even though both fields are individually optional. code is a 5–32 character shortcode using letters, digits, underscores or hyphens; url must be an HTTPS public post URL on threads.com or threads.net and takes precedence if both are set. URL-encode the full URL as a query value. Invalid or unavailable posts can fail.
- After checking status, treat search-users results:[] as no matches for that query and get-user-details user:null as an unavailable profile observation—not a confirmed deletion. bio_links:[] is a valid optional-link result. No populated link-item schema is established by the empty example; inspect actual returned links without inventing websites, contact details, ownership or outreach permission.
- Keep unavailable counters, including view_count:null, unknown rather than zero. Public follower and interaction counts can change; store a UTC retrieval time separately from taken_at, which is Unix posting time in seconds. Deduplicate repeated matches using one consistent string post identifier and keep later metric observations separately. reply_count and quote_count are counts, not reply or quote records.
Check transport, business status and result shape
Check HTTP status separately from the gateway's code/message/data business status: code 200 indicates gateway business success, but HTTP 200 alone does not. Then inspect the operation payload inside data, including its status, request_id and nested data. A successful user search can return results:[], and a successful profile lookup can return user:null; neither is proof of account deletion. Validate the selected operation's result shape before parsing it, and keep unavailable metrics unknown rather than zero.
Choose your Threads research task
- Find public keyword matches for brand research
-
search-posts requires query, such as coffee. Iterate data.results[], follow node.thread, then flatten thread_items[] and read each post. Review relevance and deduplicate string post IDs before counting mentions. Polling, alerts and sentiment analysis belong in your application; no pagination input is exposed.
- Inspect available posts from a known account
-
list-user-posts requires username, not a display name or numeric account ID. If you only know a name, use search-users and review the candidate handle first. Iterate data.posts[], then node.thread_items[], and read each post. Retain every returned thread item and treat the collection as a sample rather than the account's complete history.
- Resolve a post link and observe engagement
-
get-post-details needs at least one selector: code is a public post shortcode from a returned post or link, while url is an HTTPS post URL on threads.com or threads.net. URL takes precedence if both are supplied. Read data.post for text, attribution and available likes, replies, reposts and quotes; null views remain unknown.
- Discover handles and enrich public profiles
-
search-users requires a name or username in query; review data.results[].node before selecting an account. get-user-details and get-user-details-with-bio-link require the selected username. Use the first for public identity, biography and follower count, or the second when optional bio_links matter. Empty search results, null profiles and empty link arrays are distinct outcomes.
Posts & Content Research
/api/project/threads-scraper/search-posts Search Public Threads Posts by Keyword
Full docs →Details
Pass a required query string to find public Threads posts matching a keyword or phrase. The response includes status, request_id and data.results; to read individual posts, iterate data.results[], follow node.thread, then iterate thread_items[] and read each post. Observed post fields include string pk and id, code, user.username, caption.text when available, taken_at as Unix seconds and like_count. One result wrapper can contain more than one post, so flatten all thread_items before counting or exporting matches. Use returned text and author metadata to assess relevance rather than treating a match as a verified brand mention. Results can change between requests and do not represent every matching post. data.cursor may be returned, but this operation accepts only query: no cursor, page, date-range or sort input is supported. Deduplication, polling schedules, alerts and sentiment classification are application logic, not built-in API features.
Test this Threads data endpoint 1 required · 0 optional
| Parameter | In | Value |
|---|---|---|
| query |
Request cost is temporarily unavailable. No price is assumed.
/api/project/threads-scraper/list-user-posts Retrieve Available Posts for a Threads Username
Full docs →Details
Provide a required Threads username, not a display name or numeric account ID, to retrieve the available public account posts. The response includes status, request_id and data.posts. Iterate data.posts[], then node.thread_items[], and read each post; the observed account collection contained threads with multiple items. Post fields include pk and id as strings, code, user.username, caption.text when available, taken_at as Unix seconds and like_count. A collection id may contain an account suffix, so preserve it intact rather than coercing it to a number. This is an available content sample, not a complete posting history. data.cursor was present, but username is the only supported input; there is no cursor, page, limit, date-range or sort parameter. Store retrieval times and deduplicate identifiers when comparing repeated account observations. Content visibility and availability can change, and absent metrics must remain unknown.
Test this Threads data endpoint 1 required · 0 optional
| Parameter | In | Value |
|---|---|---|
| query |
Request cost is temporarily unavailable. No price is assumed.
/api/project/threads-scraper/get-post-details Look Up a Threads Post by URL or Shortcode
Full docs →Details
Retrieve one public Threads post by code or url. Supply at least one selector: code is the post shortcode, not its numeric ID; url must be an HTTPS Threads post URL on threads.com or threads.net. If both are supplied, url takes precedence. URL-encode a full URL when passing it as a query value. The response includes status, request_id and data.post with string id, code, username, text, taken_at as Unix seconds, url, like_count, reply_count, repost_count, quote_count and view_count. The observed shortcode lookup preserved the author, text and timestamp of the same post returned by the account-post collection. view_count was explicitly null: unavailable views must remain unknown, not be converted to zero. Engagement values are observations, not private analytics. Reply and quote counts do not include reply or quote records. Only public, available posts are in scope; invalid or unavailable inputs can fail.
Test this Threads data endpoint 0 required · 2 optional
| Parameter | In | Value |
|---|---|---|
| query | ||
| query |
Request cost is temporarily unavailable. No price is assumed.
Profiles & Account Discovery
/api/project/threads-scraper/search-users Search Threads Accounts by Name or Username
Full docs →Details
Pass a required query containing a name, username or account-search keyword. The response includes status, request_id and data.results, with candidate profiles at data.results[].node. Observed fields include username, string pk and id, full_name, is_verified, follower_count and profile_pic_url. Select the intended username before requesting its full profile or account posts: a similar display name is not proof of identity. A query for a nonexistent random username returned a successful response with data.results:[]. Treat an empty result array as no matches for that query, not as an outage or definitive proof that a particular account was deleted. Results are not an exhaustive account directory, and no pagination parameter is exposed.
Test this Threads data endpoint 1 required · 0 optional
| Parameter | In | Value |
|---|---|---|
| query |
Request cost is temporarily unavailable. No price is assumed.
/api/project/threads-scraper/get-user-details Get a Public Threads Profile by Username
Full docs →Details
Provide a required Threads username to retrieve its public profile. The response includes status, request_id and data.user. Observed profile fields include string pk and id, username, full_name, is_verified, follower_count, biography and profile_pic_url. The public zuck account resolved consistently to Mark Zuckerberg with pk and id 63055343223. Preserve account identifiers as strings, and treat the follower count as an observation that can change between requests. A tested nonexistent username returned status:ok with data.user:null. Keep that as an unavailable profile observation, not proof of deletion. This operation does not return follower identities, private activity or audience demographics. Use the separate bio-link profile lookup when optional public links are needed, or the account-post operation for available content.
Test this Threads data endpoint 1 required · 0 optional
| Parameter | In | Value |
|---|---|---|
| query |
Request cost is temporarily unavailable. No price is assumed.
/api/project/threads-scraper/get-user-details-with-bio-link Get a Threads Profile with Optional Bio Links
Full docs →Details
Provide a required Threads username to retrieve the public profile variant that includes optional bio-link information. The response includes status, request_id and data.user. Observed fields include string pk and id, username, full_name, is_verified, follower_count, biography, profile_pic_url and bio_links. The tested zuck profile returned the expected account identity and an empty bio_links array. No nonempty bio-link item schema was established by that result. Treat bio links as optional: an empty array is valid, not an instruction to infer a website or contact address. Preserve any returned links as supplied and review destinations before using them. Public links do not establish contact permission, email availability or account ownership. This operation does not expose private profile activity, and its public follower count is not a follower list.
Test this Threads data endpoint 1 required · 0 optional
| Parameter | In | Value |
|---|---|---|
| query |
Request cost is temporarily unavailable. No price is assumed.
Public Threads search, profile and post capabilities
Search public Threads conversations, discover accounts and retrieve structured profile and post data for your own research applications. This independent, read-only API covers six focused operations.
- Keyword post search: retrieve matching thread entries with author usernames, post identifiers, text and posting timestamps
- Account discovery: search names or usernames and review candidate accounts before selecting a handle
- Public profiles: look up identity, biography, verification status and observed follower count by username
- Profile bio links: retrieve optional publicly listed links alongside profile metadata
- Account posts: inspect the available thread collection for a known username, including multiple posts within a thread
- Individual post details: resolve a public post URL or shortcode to its text, source link and available likes, replies, reposts and quotes
Build creator directories, brand-mention review queues, competitor-content comparisons and source-linked research datasets. Scheduling, deduplication, sentiment analysis and comparisons between stored observations belong in your application. Returned collections are samples, not an exhaustive archive or guaranteed real-time feed. No pagination input is exposed, even when a response includes a cursor. Private account activity, follower lists, reply records and private analytics are not included; unavailable metrics remain unknown rather than zero.