Threads Profile Feed API
List a profile's recent threads, replies, media posts or reposts, with text, likes, replies and post time.
- 1 credit per call
- Failed calls are free
- Updated
- threads.profile.feed
{ "result_count": 5, "posts": [ { "type": "thread", "url": "https://www.threads.com/@zuck/post/Ddt7cL5EfUG", "content": { "caption": "Agrippa said it's time to get back to work 😎", "like_count": 5086, "media_type": 8, "quote_count": 49, "reply_count": 528, "repost_count": 266, "taken_at_unix": 1790355021 } }, { "type": "thread", "url": "https://www.threads.com/@zuck/post/DdoxAnGDrMh", "content": { "caption": "Excited to see you at Meta Connect today 😎", "like_count": 2997, "media_type": 2, "quote_count": 44, "reply_count": 560, "repost_count": 208, "taken_at_unix": 1790182897 } } ]}
| # | Text | Likes | Replies | Reposts | Posted (Unix time) | Link | Type |
|---|---|---|---|---|---|---|---|
| 1 | Agrippa said it's time to get back to work 😎 | 5086 | 528 | 266 | 1,790,355,021 | https://www.threads.com/@zuck/post/Ddt7cL5EfUG | thread |
| 2 | Excited to see you at Meta Connect today 😎 | 2997 | 560 | 208 | 1,790,182,897 | https://www.threads.com/@zuck/post/DdoxAnGDrMh | thread |
| 3 | Muse Spark 1.3 is rolling out today with frontier performance a… | 1649 | 266 | 128 | 1,788,377,183 | https://www.threads.com/@zuck/post/Dcy_A8pGo-m | thread |
| 4 | Muse Spark 1.3 is rolling out today with frontier performance a… | 1649 | 266 | 128 | 1,788,377,183 | https://www.threads.com/@zuck/post/Dcy_A8pGo-m/media | thread |
| 5 | Muse Voice Transcribe is MSL's first real-time audio perception… | 1422 | 208 | 118 | 1,788,283,092 | https://www.threads.com/@zuck/post/DcwLClnmOrR | thread |
What you send
The input
object of the request, with every field the endpoint accepts.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| handle | string | yes | The profile's handle. | zuck |
| feed | string | no | Which tab to read: threads, replies, media or reposts. | media |
| limit | integer | no | How many posts to return. | 5 |
Fields it returns
What each record in the response holds, with the values from the sample above.
| Field | Type | What it is | Example |
|---|---|---|---|
| posts[].content.caption | string | The post's text. | Agrippa said it's time to get back to work 😎 |
| posts[].content.like_count | integer | Likes, as Threads shows them. | 5086 |
| posts[].content.reply_count | integer | Replies, as Threads shows them. | 528 |
| posts[].content.repost_count | integer | Reposts, as Threads shows them. | 266 |
| posts[].content.taken_at_unix | integer | When it was posted, as a Unix time in seconds. | 1,790,355,021 |
| posts[].url | string | The thread's link. | https://www.threads.com/@zuck/post/Ddt7cL5EfUG |
| posts[].content | object | The post. | 7 fields |
| posts[].content.media_type | integer | Threads' media type code for the post. | 8 |
| posts[].content.quote_count | integer | Quotes, as Threads shows them. | 49 |
| posts[].type | string | What kind of item it is, such as thread. | thread |
| posts | array | The returned threads. | 5 records |
| result_count | integer | How many results this answer holds. | 5 |
Call it from your code, or ask your agent
Set UPSCRAPE_API_KEY to your key and copy a working request.
curl --request POST \ --url https://data.upscrape.com/execute \ --header "Authorization: Bearer $UPSCRAPE_API_KEY" \ --header "Content-Type: application/json" \ --header "Prefer: wait=30" \ --data '{ "capability": "threads.profile.feed", "input": { "feed": "media", "handle": "zuck", "limit": 5 }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "threads.profile.feed", "input": { "feed": "media", "handle": "zuck", "limit": 5 }}''')response = requests.post( "https://data.upscrape.com/execute", headers={ "Authorization": f"Bearer {os.environ['UPSCRAPE_API_KEY']}", "Content-Type": "application/json", "Prefer": "wait=30", }, json=payload,)response.raise_for_status()print(json.dumps(response.json(), indent=2))
const response = await fetch("https://data.upscrape.com/execute", { method: "POST", headers: { "Authorization": `Bearer ${process.env.UPSCRAPE_API_KEY}`, "Content-Type": "application/json", "Prefer": "wait=30", }, body: JSON.stringify({ "capability": "threads.profile.feed", "input": { "feed": "media", "handle": "zuck", "limit": 5 }}),});if (!response.ok) { throw new Error(`Upscrape request failed: ${response.status}`);}console.log(JSON.stringify(await response.json(), null, 2));
https://data.upscrape.com/mcp
Using Upscrape, get Mark Zuckerberg's (@zuck) latest media posts on Threads and rank them by likes.
More from the Threads API
The same data from other platforms
Threads Profile Feed API FAQ
The short answers. The docs have the long ones.
How much does the Threads Profile Feed API cost?
1 credit per successful call, shown before it runs. You buy credits once, and paid credits never expire.
What do I send?
Send handle. The input fields below list every option with its type and limits.
Do I need a Threads login?
No. It reads public Threads data; nothing runs on your account.
Can my AI agent call it?
Yes, over MCP: the agent finds threads.profile.feed, checks its price and runs it with the same credits as the REST API.
Your first Threads call is free.
Up to 100 free credits to start, no card needed.