How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
zuckin Usernames. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Scrape public Threads posts with no login: the latest posts of a profile, one post with its replies, or the top posts for a keyword. Each post is one clean JSON row with text, date, likes, replies, reposts, media, the quoted post and the author with followers.
Good for
- Track what a brand, creator or competitor posts on Threads, with likes, replies and reposts.
- Collect a post and its replies for sentiment or discussion analysis.
- Find top posts about a topic or hashtag.
- Feed clean, typed Threads rows into an AI agent, a spreadsheet or a database.
Not a good fit
- Only public data. No DMs, no private profiles, nothing that needs login.
- No view counts, bios, followers lists or contact data.
- Some large profiles are shown only to logged-in visitors. They return
not_found. The Actor does not try to get around this. - Search returns the top ~25–30 posts per keyword. There is no "recent" search or date filter without login.
- Replies: only the first page that Threads shows without login, usually 10–15 replies.
- Counts are a snapshot at fetch time.
Who uses it
Social media managers
Track what brands and creators post on Threads.
Influencer agencies
Compare engagement per follower across creators.
Researchers
Collect a post and its replies for sentiment analysis.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.002 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Post | $0.0015 (from $0.0012 on paid Apify plans) | One Threads post row saved to the Dataset (profile post, target post, reply or search result). |
| Empty result | $0.0005 | One input that returned no posts: a profile that does not exist, is private, has no posts or is shown only to logged-in visitors; a missing post; a search with no results. |
Examples
- One result: about $0.0035.
- 1,000 results: about $1.50.
- Every day 100 results, for 30 days: about $4.56 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 3,300 results.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Why not use the official Threads API?
The official API needs an app, a token and a review. It mostly reads your own account.
Why is there no view count?
Threads does not show views to logged-out visitors.
Why does a big profile return not found?
Some large profiles are shown only to logged-in users.
Do I need a Threads or Instagram account?
No. The Actor reads only public pages without login, cookies or tokens.
Are the counts live?
They are a snapshot at fetchedAt. Run again to refresh them.
Is the data complete?
It is what threads.com shows a logged-out visitor at fetch time. Deleted posts, private profiles and profiles that need login are not included, and some counts can be null.
Is scraping Threads allowed?
The Actor reads only public pages at a modest rate and does not log in or bypass any wall. Meta's terms limit automated collection. You are responsible for how you collect, store and reuse the content, including personal data and authors' rights.
Details
Step by step on Apify
- Open the Input tab.
- Keep Mode on Profile posts and keep
zuckin Usernames, or add your own. - Keep Max posts per input at
20(prefill and default). - Click Start.
- Open the Posts view in the Output tab and check
text,likesandauthor.followers.
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Brand or creator monitoring | mode: profile, usernames | post | text, createdAt, likes, replies, reposts | Schedule the Actor, export to Sheets |
| Discussion analysis | mode: post, postUrls | post with role | role, text, replyToUsername, likes | Sentiment or topic analysis |
| Topic research | mode: search, queries | post | text, author.username, likes, url | AI summary, content ideas |
| Influencer shortlist | mode: profile, usernames | post with author | author.followers, author.verified, likes | Compare engagement per follower |
Tips for better results
- Use profile mode for the newest posts of an account.
- Search gives top posts only, so use several keywords.
- Expect about 10 to 15 replies per post without login.
Limits and good to know
- Empty result: one per input that returned no posts: a profile that does not exist, is private, has no posts or is shown only to logged-in visitors; a missing post; a search with no results. It covers the requests made for that input
- Actor start: charged by Apify once per run, per GB of memory. The default 512 MB counts as one
- Free:
errorrows (Threads failed), duplicate posts and duplicate inputs - Up to 50 usernames, post URLs or keywords per run, and up to 500 posts per input
- About 3,500 posts per run. In tests, 20 profiles × 200 posts gave 3,444 posts in 142 seconds. A bigger request stops at the Actor's internal time limit with
PARTIALandSAFETY_LIMIT, keeps the posts saved so far, and charges only for them. For more data, use several runs - A profile ends where its public feed ends, even if
maxItemsis higher - Search: top ~25–30 posts per keyword. Replies: the first page only, usually 10–15 per post
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. Some values are changed for privacy. In Excel or CSV each field is a column.
{
"status": "complete",
"statusReason": null,
"errorCode": null,
"postId": "4007137472223477566",
"code": "DecNkzeCX8-",
"url": "https://www.threads.com/@instagram/post/DecNkzeCX8-",
"mode": "profile",
"input": "instagram",
"role": "profile_post",
"author": {
"username": "instagram",
"fullName": "Instagram",
"userId": "63404918397",
"verified": false,
"followers": 38354704,
"profilePicUrl": "https://scontent-den2-1.cdninstagram.com/v/…"
},
"text": "@example_user made a whole retro wall phone by hand ☎️✨",
"createdAt": "2026-10-13T16:14:12.000Z",
"likes": 170,
"replies": 10,
"reposts": 6,
"quotes": 1,
"shares": 2,
"mediaType": "video",
"media": [
{ "type": "video", "url": "https://scontent-den2-1.cdninstagram.com/o1/v/…mp4?…", "width": 720, "height": 1280, "thumbnailUrl": "https://scontent-den2-1.cdninstagram.com/v/…jpg?…" }
],
"quotedPost": null,
"repostedPost": null,
"isReply": false,
"replyToUsername": null,
"linkUrl": null,
"linkTitle": null,
"topic": null,
"pinned": false,
"fetchedAt": "2026-10-14T15:36:27.390Z"
}Use it from code
Actor ID: cliqtomedia/threads-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/threads-scraper").call(run_input={
"mode": "profile",
"usernames": [
"zuck"
]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~threads-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode": "profile", "usernames": ["zuck"]}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/threads-scraper")
result = tool.invoke({"run_input": {"mode": "profile", "usernames": ["zuck"]}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (28)
| Field | Type | Meaning |
|---|---|---|
status | string | complete = a post (one post event). not_found = unknown, private or empty input (one empty-result event). error = input failed (free). |
statusReason | string | Why a not_found or error row has no post. |
errorCode | string | Machine-readable reason, e.g. PRIVATE_PROFILE, NO_POSTS, NO_RESULTS, BLOCKED. |
postId | string | Threads post ID. |
code | string | Short post code from the URL. |
url | string | Post URL (or the input URL for not_found rows). |
mode | string | Mode of the run. |
input | string | Username, post URL or keyword this row came from. |
role | string | profile_post, search_result, target (the requested post), self_thread (author's thread continuation) or reply. |
author | object | username, fullName, userId, verified, followers (profile mode only, else null), profilePicUrl. |
text | string | Post text. |
createdAt | string | Publish time, ISO 8601 UTC. |
likes | integer | Like count. |
replies | integer | Direct reply count. |
reposts | integer | Repost count. |
quotes | integer | Quote count. |
shares | integer | Share count. |
mediaType | string | text, photo, video, carousel or other. |
media | array | Photos and videos: type, url, width, height, thumbnailUrl. Media URLs are signed and expire after some days. |
quotedPost | object | Quoted post: postId, url, username, text, createdAt. |
repostedPost | object | Reposted post: postId, url, username, text, createdAt. |
isReply | boolean | True when the post is a reply. |
replyToUsername | string | Username this post replies to. |
linkUrl | string | Link attached to the post (Threads redirect removed). |
linkTitle | string | Title of the attached link. |
topic | string | Topic tag of the post. |
pinned | boolean | Pinned to the author's profile. |
fetchedAt | string | When the row was scraped, ISO 8601 UTC. |
Input settings (7)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Mode required | mode | string | "profile" |
| Usernames | usernames | array | ["zuck"] |
| Post URLs | postUrls | array | |
| Search keywords | queries | array | |
| Max posts per input | maxItems | integer | 20 |
| Include replies (post mode) | includeReplies | boolean | true |
| Proxy | proxyConfiguration | object | {"useApifyProxy": true} |
Use cases with this tool
Each guide shows all the steps and the other tools.