Scrape every public post from one or more Threads profiles by username. Text, timestamps, likes, replies, reposts, media URLs and permalinks. Monitor mode returns only posts new since the last run. No login, no API key.
Run it on Apify: apify.com/themineworks/threads-profile-scraper Docs, FAQ and pricing: themineworks.com/actors/threads-profile-scraper
Price: From $1.20 per 1,000 posts on Apify's higher plans ($2.00 on the free plan), plus a $0.005 start fee per run. Failed and empty results are never charged.
- Fetch by username, multiple profiles per run
- Full post text, timestamps, and engagement counts
- Media URLs and permalinks per post
- Monitor mode bills only for posts new since the last run
- No login, no API key
You need a free Apify account and its API token (Settings, API & Integrations).
pip install apify-clientfrom apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("themineworks/threads-profile-scraper").call(run_input={
"profileUsernames": [
"zuck"
],
"maxPosts": 25
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)npm install apify-clientimport { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('themineworks/threads-profile-scraper').call({
"profileUsernames": [
"zuck"
],
"maxPosts": 25
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);One request that runs the actor and returns the results in the response (for runs under 5 minutes):
curl -X POST "https://api.apify.com/v2/acts/themineworks~threads-profile-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"profileUsernames": ["zuck"], "maxPosts": 25}'This repo includes ready-made clients that save results to JSON and CSV:
python3 threads_profile_scraper.py --token YOUR_APIFY_TOKEN --profile-usernames "zuck" --max-posts "25"
node threads_profile_scraper.mjs --token YOUR_APIFY_TOKEN --profile-usernames "zuck" --max-posts "25"| Field | Type | Default | Description |
|---|---|---|---|
profileUsernames (required) |
array | ["zuck"] |
Threads usernames (without @) to scrape, used when mode=profile |
maxPosts |
integer | 25 |
Maximum posts to return across the whole run |
includeReplies |
boolean | false |
If true, include reply posts in the output |
includeReposts |
boolean | false |
If true, include reposts in the output |
monitorMode |
boolean | false |
Run on a schedule and get ONLY posts not delivered in a previous run, so you pay per new post instead of… |
One row per result, as JSON, CSV, Excel or through the API.
| Field | Type | Description |
|---|---|---|
post_id |
string | Unique numeric post ID |
code |
string | Threads post shortcode |
url |
string | Full URL to the Threads post |
username |
string | Username of the post author |
user_full_name |
string | Display name of the post author |
text |
string | Text content of the post |
posted_at |
string | ISO 8601 timestamp when the post was published |
like_count |
integer | Number of likes on the post |
reply_count |
integer | Number of replies to the post |
repost_count |
integer | Number of reposts |
quote_count |
integer | Number of quote posts |
media_type |
string | Type of media attached (text, image, video, carousel) |
hashtags |
array | List of hashtags used in the post |
scraped_at |
string | ISO 8601 timestamp of when the record was scraped |
The actor works as a tool in Claude, Cursor or any MCP client through Apify's MCP server:
https://mcp.apify.com/?tools=themineworks/threads-profile-scraper
Yes. Pass a list of usernames and each one is fetched in the same run.
Remembers every post already delivered for a given username, so a scheduled run returns and bills only for posts new since the last one.
No. It reads public profile timelines only, the same posts a logged-out visitor would see.
Post text, timestamp, like/reply/repost counts, media URLs, and the permalink, plus author metadata.
This one is scoped to profile timelines only. Threads Scraper covers profile, post, search, and hashtag modes in one actor.
From $1.20 per 1,000 posts on Apify's higher plans ($2.00 on the free plan), plus a $0.005 start fee per run. Failed and empty results are never charged. You can cap what a single run may spend with the maximum cost setting on Apify.
Yes. Every run saves to an Apify dataset you can download as JSON, CSV, Excel or XML, or read through the API. The Python and Node clients in this repo also write the results to local files.
Yes. Save your input as a task on Apify and attach a schedule, or call the API from your own cron job. Scheduled runs are billed the same way as manual ones.
- Threads Scraper: Meta Threads data that returns actual data
- Reddit Scraper: Free Reddit data with full comment trees
- LinkedIn Post Scraper: Search LinkedIn posts by keyword without login
Part of The Mine Works: 151 pay-per-result scrapers with no login and no browser setup on your side.
MIT © The Mine Works