Threads Scraper | 25 Fields, 4 Modes, No Login, Monitor avatar

Threads Scraper | 25 Fields, 4 Modes, No Login, Monitor

Pricing

from $1.20 / 1,000 posts

Go to Apify Store
Threads Scraper | 25 Fields, 4 Modes, No Login, Monitor

Threads Scraper | 25 Fields, 4 Modes, No Login, Monitor

Scrape Meta Threads (threads.com) posts, profiles, hashtags & search. No login, no cookies. Get text, media, likes, replies & reposts. Pay only per post delivered. Works in Claude, ChatGPT & any MCP agent.

Pricing

from $1.20 / 1,000 posts

Rating

5.0

(2)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

3

Bookmarked

245

Total users

99

Monthly active users

15 hours ago

Last modified

Share

๐Ÿงต Threads Scraper: Posts, Profiles, Hashtags & Search (No Login)

Part of the Social & Market Research MCP. This actor's data is also available to AI agents through our Social & Market Research MCP server, eight social, news and search-interest tools behind one endpoint. No result, no charge.

โšก Pay only per post delivered. No login, no cookies, no ban risk. ๐Ÿ’ธ Empty searches, blocked pages and failed runs are never billed.

What does Threads Scraper do?

Threads Scraper turns any public Meta Threads target, a profile, a search keyword, a hashtag, or a direct post URL, into structured JSON: post text, media URLs, likes, replies, reposts, quote counts, author info, and full timestamps. Meta never shipped a public Threads API, so the usual options are manual copy-paste or a brittle browser build. This actor reads the same public pages any logged-out visitor sees on threads.com, four modes in one actor, full engagement counts and media captured on every post, and you pay only for posts actually delivered.

Built for unattended running. This actor has served more than 40,000 runs to date, with per-request IP rotation and a deadline watchdog that returns partial results instead of dying mid-run. A run that delivers nothing charges nothing, so even a run that hits a wall costs you $0.

โœ… No login | โœ… No cookies | โœ… Pay per post delivered | โœ… Zero charge on empty runs | โœ… MCP-ready for AI agents

Who is it for?

Brand and social teams tracking mentions, hashtags, and competitor accounts. Market researchers building sentiment or trend datasets from live conversation. Growth and content teams watching which formats and hooks are working on Threads right now. Anyone feeding an AI agent that needs current Threads data without building a scraper of their own.

How much does it cost to scrape Threads posts?

You pay per post actually delivered. Nothing else: no subscription, no per-run start fee, no monthly minimum.

EventPriceYou pay when
Post delivered$0.0012 on Gold, $0.002 on FreeA post record lands in your dataset
Apify planPrice per 1,000 posts
Free$2.00
Bronze$1.80
Silver$1.60
Gold and above$1.20

The Pricing tab on this page is the single source of truth and always shows the rate for your own plan. If this table and the Pricing tab ever disagree, the Pricing tab is right.

What a real job costs. Apify's Free plan includes $5 of usage credit every month, about 2,500 posts a month at no cost to you. A 500-post hashtag pull costs about $0.60 on Gold. A 20,000-post competitor and hashtag monitoring sweep across a month costs about $24.00 on Gold.

What is never charged. Empty searches, blocked pages, and failed runs cost nothing. The charge event fires only after a post record is in your dataset. Several Threads scrapers on the Store add a per-run start fee, which is what actually dominates the bill on a scheduled monitor that runs many times a day, so compare total cost, not just the headline rate.

How does it work?

The actor requests the same public threads.com pages a logged-out visitor gets, then extracts the structured post data Threads' own front-end embeds in the page to render it, the same JSON payload the site itself uses, just read instead of displayed. No account, no cookies, no anti-bot fragility, and every request goes out through a fresh proxy session so one throttled IP never stalls a whole run.

For each post it flattens Threads' deeply nested response into one analysis-ready record. Reply and repost posts are filtered out by default; toggle the input to include them, and use the is_reply / is_repost flags to sort them out downstream. For search mode, the actor fans out across every logged-out surface that carries results for your query: the recent and top feeds, the query's own tag feed, and repeated recency windows over the run, all deduplicated into one result set, which is how it exceeds the roughly 20-post single-feed cap. Each run's summary lists the exact search_windows yield in the run's OUTPUT record, so you can audit it.

How many posts should I expect per run?

Set expectations by mode before you run it, because Threads is not uniform here:

ModeRealistic yield per runNotes
Searchtens to hundredsBest mode for volume. Fans out across several logged-out surfaces and deduplicates.
HashtagtensRecent or top feed for a tag.
Postexactly what you passOne record per post URL, plus quoted or parent context.
Profileabout 4 to 5 recent posts per usernameThreads' own logged-out limit, not a cap we set. List several usernames to reach a higher total.

That profile figure is deliberate honesty rather than a bug report. A logged-out visitor is served only the handful of most recent posts on a profile, and the timeline then repeats the same posts instead of paging deeper, so raising Max posts does not produce more. We verified this repeatedly against live profiles across several weeks. The actor detects the repeat and stops within about three requests rather than paying to spin, and you are never charged for posts that do not exist. If you need many posts about a person rather than by them, use search mode with their name or handle as the query, then filter on the username field if you only want their own posts.

Reaching a high maxPosts in profile mode: the fix is more usernames, not a bigger number. List several in profileUsernames and the run draws from each in turn until the total is met or the list runs out, skipping any username that returns nothing rather than failing the run. Verified: 6 usernames, maxPosts: 20, returned exactly 20 posts spread 5/4/4/4/2/1 across 5 of the 6, one had nothing to give.

๐Ÿงพ What input does it take?

{
"mode": "hashtag",
"hashtag": "ai",
"maxPosts": 25,
"resultType": "top",
"includeReplies": false,
"includeReposts": false
}
InputRequiredWhat it does
modeYesprofile, post, search, or hashtag
profileUsernamesFor profile modeOne or more usernames, without the @
postUrlsFor post modeOne or more direct threads.com post URLs
searchQueryFor search modeKeyword or phrase to search
hashtagFor hashtag modeTag to pull, without the #
maxPostsNoCaps how many posts are returned, which is how you cap cost
resultTypeNorecent or top, applies to search and hashtag modes
includeRepliesNoInclude reply posts, excluded by default
includeRepostsNoInclude repost posts, excluded by default
monitorModeNoDeliver and charge only posts not seen in a prior run, see Monitor mode below

๐Ÿ“ค What data do you get back?

[
{
"post_id": "3937491905269768921",
"code": "DakyAavlKLZ",
"url": "https://www.threads.com/@zuck/post/DakyAavlKLZ",
"username": "zuck",
"user_full_name": "Mark Zuckerberg",
"user_pic_url": "https://scontent-iad6-1.cdninstagram.com/v/t51.82787-19/550174606_17925811725103224_8363667901743352243_n.jpg...",
"user_verified": true,
"text": "Today we're releasing Muse Spark 1.1, a strong agentic and coding model at a very low price. It's available through our new Meta Model API and in Meta AI.",
"posted_at": "2026-07-09T14:00:34.000Z",
"posted_at_human": "Thu, 09 Jul 2026 14:00:34 GMT",
"like_count": 2766,
"reply_count": 617,
"repost_count": 189,
"quote_count": 62,
"has_media": false,
"media_urls": [],
"media_type": "text",
"is_reply": false,
"is_repost": false,
"hashtags": [],
"mentions": [],
"urls": [],
"scraped_at": "2026-07-15T04:18:09.233Z"
},
{
"post_id": "3938102254417839213",
"code": "DalR2qzoP9n",
"url": "https://www.threads.com/@aibuilds_dev/post/DalR2qzoP9n",
"username": "aibuilds_dev",
"user_full_name": "AI Builds",
"user_pic_url": "https://scontent-iad6-1.cdninstagram.com/v/t51.82787-19/412201558_17902200018103224_5921147736203352243_n.jpg...",
"user_verified": false,
"text": "Been testing Muse Spark 1.1 all morning, latency is noticeably better than the last release. Full notes here: https://ai-builds.dev/muse-spark-1-1 #ai #llm cc @zuck",
"posted_at": "2026-07-09T16:42:11.000Z",
"posted_at_human": "Thu, 09 Jul 2026 16:42:11 GMT",
"like_count": 84,
"reply_count": 6,
"repost_count": 2,
"quote_count": 0,
"has_media": true,
"media_urls": ["https://scontent-iad6-1.cdninstagram.com/v/t51.2885-15/442019873_17902200105103224_o.jpg..."],
"media_type": "image",
"is_reply": true,
"parent_post_id": "3937491905269768921",
"is_repost": false,
"hashtags": ["ai", "llm"],
"mentions": ["zuck"],
"urls": ["https://ai-builds.dev/muse-spark-1-1"],
"scraped_at": "2026-07-15T04:18:11.885Z"
},
{
"post_id": "3938340871122098765",
"code": "DalXk93hQmT",
"url": "https://www.threads.com/@ml_weekly/post/DalXk93hQmT",
"username": "ml_weekly",
"user_full_name": "ML Weekly Digest",
"user_pic_url": "https://scontent-iad6-1.cdninstagram.com/v/t51.82787-19/398120441_17899044518103224_2241536203352243_n.jpg...",
"user_verified": false,
"text": "",
"posted_at": "2026-07-09T18:05:47.000Z",
"posted_at_human": "Thu, 09 Jul 2026 18:05:47 GMT",
"like_count": 31,
"reply_count": 1,
"repost_count": 0,
"quote_count": 0,
"has_media": false,
"media_urls": [],
"media_type": "text",
"is_reply": false,
"is_repost": true,
"original_post_id": "3937491905269768921",
"hashtags": [],
"mentions": [],
"urls": [],
"scraped_at": "2026-07-15T04:18:13.401Z"
}
]

A real run returns an array of records, one per post. The first record above was captured live from a real public Threads post by @zuck. The next two show the same schema for a reply and a repost, since a single scrape rarely returns both variants at once: notice parent_post_id on the reply and original_post_id on the repost, the two fields a single-post sample can't demonstrate.

Every post record contains these fields:

FieldDescription
๐Ÿ†” post_idNumeric Threads post ID
๐Ÿ”ก codePost shortcode used in the URL
๐ŸŒ urlCanonical threads.com post URL
๐Ÿ‘ค usernameAuthor username without the @
๐Ÿท๏ธ user_full_nameAuthor display name
โœ… user_verifiedTrue if the author is verified
๐Ÿ“ท user_pic_urlAuthor profile picture URL
๐Ÿ“ textFull post text
๐Ÿ•’ posted_atISO timestamp of publication
๐Ÿ•“ posted_at_humanHuman readable publication timestamp
โค๏ธ like_countNumber of likes
๐Ÿ’ฌ reply_countNumber of replies
๐Ÿ” repost_countNumber of reposts
๐Ÿ—จ๏ธ quote_countNumber of quote posts
๐Ÿ–ผ๏ธ media_typeimage, video, carousel, or text
๐Ÿ“Ž has_mediaTrue when media is attached
๐ŸŽž๏ธ media_urls[]Array of media file URLs
#๏ธโƒฃ hashtags[]Hashtags extracted from the text
@ mentions[]Mentions extracted from the text
๐Ÿ”— urls[]Plain URLs extracted from the text
โ†ฉ๏ธ is_replyTrue if this post is a reply
๐Ÿ”‚ is_repostTrue if this post is a repost
๐Ÿงต parent_post_idParent post ID for replies
๐Ÿงฌ original_post_idOriginal post ID for reposts
๐Ÿ•“ scraped_atISO timestamp of when the record was captured

Every run also ends with a final _type: "info" record. It is informational only and never billed.

What are the limitations?

Worth knowing before you buy, so there are no surprises:

  • Profile mode returns only about 4 to 5 posts per username. That is Threads' own logged-out limit, not a cap we set, verified repeatedly against live profiles. List more usernames rather than raising maxPosts for a bigger total.
  • Search and hashtag surfaces can intermittently come back with no post data embedded at all, a platform-side condition on Threads' logged-out pages, not a broken query. The actor detects this after a single request and stops rather than paying for retries into the same empty response; profile and post modes are unaffected. If a search or hashtag run comes back empty, retry after a short wait before assuming your query was too narrow.
  • No official Threads API exists. This actor reads the same public HTML a logged-out browser gets, so a front-end change on Meta's side can require an update on ours. We watch for that; it is not something you need to monitor yourself.
  • Media URLs point to Meta's CDN and expire. Download anything you need to keep promptly rather than storing the link long-term.
  • Public post data only. No DMs, no analytics dashboard metrics, no data behind a login wall.

๐Ÿ’ผ What can you use it for?

Brand and topic monitoring Search Threads for your brand name or a keyword and capture every public post that mentions it. Flag spikes in conversation volume before they turn into a PR moment.

Trend and hashtag tracking Pull the recent or top feed for any tag to see what is gaining traction. Compare hashtag velocity across days to spot early breakouts.

Competitor and creator watch Snapshot a rival account's latest posts with full engagement metrics. Build a rolling dataset of which formats and hooks perform best on Threads.

AI training and sentiment analysis Assemble structured Threads corpora for LLM fine-tuning or sentiment scoring. Feed live posts into a Claude, ChatGPT, or MCP agent for summarization and classification.

๐Ÿš€ How do I get started?

  1. Open the actor and pick a Mode: Profile posts, Post detail, Search query, or Hashtag feed.
  2. Fill in the matching field: usernames, post URLs, search text, or hashtag (without the #).
  3. Set Max posts to cap the run size, and optionally toggle Include replies or Include reposts.
  4. For search and hashtag modes, pick Result type: Recent or Top.
  5. Click Save & Start, then download as JSON, CSV, or Excel, or pull via API or MCP.

๐Ÿ” Run on a schedule

Turn this from a one-off pull into a standing feed with Apify's built-in Schedules. No code, no cron server of your own.

  1. Run the actor once with the input you want repeated, then click Save as a task (top of the run form). This keeps your exact input attached for every future run.
  2. In the Apify Console, go to Schedules (left sidebar) โ†’ Create new.
  3. Name it, set your timezone, and pick a frequency: a preset (hourly, daily or weekly) or a custom cron expression (e.g. 0 6 * * * for daily at 6am).
  4. Under Actors or tasks to run, add the task you saved in step 1.
  5. Save. From then on it runs unattended on your schedule, billed the same pay-per-post way as a manual run. Nothing is charged just for the schedule existing.

Prefer to automate the setup itself? Same thing via the API:

curl -X POST "https://api.apify.com/v2/schedules?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "threads-scraper-daily",
"cronExpression": "0 6 * * *",
"isEnabled": true,
"actions": [{ "type": "RUN_ACTOR", "actorId": "themineworks/threads-scraper" }]
}'

Full options for time zones, run notifications and pausing a schedule are in Apify's Schedules documentation.

Monitor mode: pay only for NEW posts

Set monitorMode: true and this actor remembers what it delivered last time (keyed on post_id). On the next scheduled run, only genuinely new posts are pushed and charged. Re-running the same input daily costs you for the new posts each day, not the whole feed every time.

{ "monitorMode": true }

Pairs directly with Run on a schedule above: save a task with monitorMode: true, attach it to a daily schedule, and you have a standing "what's new" feed with no duplicate charges. The run summary reports new_this_run and skipped_duplicates so you can see the dedup working. First run establishes the baseline (everything is "new"); every run after that is incremental.

The summary lives in the run's OUTPUT record (Storage โ†’ Key-value store โ†’ OUTPUT), not in the dataset, so your dataset holds posts and nothing else. It carries posts_scraped, charged_for, and the per-window fan-out yield.

This actor reads only public Threads content, the same posts a logged-out visitor already sees on threads.com. It does not log in, does not use cookies, and does not access anything behind an authentication wall. That said, this is general information and not legal advice. Public post data can still include personal data, so you remain responsible for your own compliance with GDPR, CCPA, and any other law that applies to how you use the data.

FAQ

Does Threads have an official API? No. Meta has not released a public Threads API, which is why this scraper exists. It reads only the public data a logged-out visitor sees on threads.com.

How am I charged? Pay per post. You are billed only for posts actually delivered. Runs that return zero posts are never charged.

Can I include replies and reposts? Yes. Both are excluded by default. Toggle Include replies and Include reposts to add them, then use the is_reply and is_repost flags to sort or filter downstream.

Which input modes are supported? Four: profile (a user's recent posts, about 4 to 5 per username because that is all Threads shows a logged-out visitor, so add more usernames for a higher total), post (one or more post URLs with detail), search (posts matching a keyword, the fastest single-query route to volume), and hashtag (a tag's recent or top feed).

Is it legal to scrape Threads? The actor collects only publicly available posts and never accesses private accounts. Public data can still include personal data under laws like the GDPR, so scrape only what you have a legitimate reason to use.

Is there a Threads API in 2026? Meta has still not shipped a public read API for Threads. Third-party options are scrapers like this one, which read only what a logged-out visitor sees on threads.com.

Can I monitor a keyword on Threads over time? Yes. Save a search-mode input and put it on a schedule (see "Run on a schedule"). Each run appends new posts to your dataset, and the in-run recency windows catch posts that appear while it runs.

What's the cheapest way to get Threads data? Compare total cost, not just the headline rate. This actor charges $1.20 per 1,000 posts on Gold and above with no start fee, no minimum, and no billing on empty or failed runs. A cheaper per-post rate with a per-run start fee usually costs more on a scheduled monitor. If a competitor is genuinely cheaper for your workload, use them.

Can I use Threads Scraper through an MCP server? Yes. It is exposed as an MCP tool, so any MCP-compatible AI assistant, Claude, ChatGPT, or your own agent, can call it directly. See "Use from Claude, ChatGPT & any MCP agent" above for the paste-ready prompt and setup.

๐Ÿค– Use from Claude, ChatGPT & any MCP agent

Hosted MCP endpoint, no install, OAuth on first connect:

https://mcp.apify.com/?tools=themineworks/threads-scraper

Claude Desktop / Cursor config (token auth):

{
"mcpServers": {
"threads": {
"url": "https://mcp.apify.com/?tools=themineworks/threads-scraper",
"headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
}
}
}

Things an agent can ask for once connected:

  • "Search Threads for posts about [topic] from the last week and summarize the sentiment."
  • "Pull the last 25 posts from @nasa and tell me which ones got the most engagement."
  • "Track posts mentioning [my brand] on Threads and flag anything that reads negative."

For multi-platform social research in one connection (Threads + Reddit + X + YouTube + Google Trends + news), use our Social & Market Research MCP server, eight tools behind one endpoint.

Copy this into your AI assistant

Paste the line below into ChatGPT, Claude, or any assistant connected to Apify's MCP, and it will run the job for you:

Use the Apify actor themineworks/threads-scraper to pull the last 25 posts tagged #ai on Threads, sorted by top. Return the results as a table.

Or call it programmatically with the Apify client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('themineworks/threads-scraper').call({
mode: 'hashtag',
hashtag: 'ai',
maxPosts: 25,
resultType: 'top',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

๐Ÿ› ๏ธ Complete your social listening pipeline

Threads is one channel. Add the others in the same suite:

Typical flow: search Threads for a brand or keyword, cross-check the same handle on Instagram and X, then pull Reddit for longer-form conversation.

Found a bug or have a feature request? Open an issue on the actor's Apify Console page or reach out through the Apify profile.