Threads Scraper - Scrape Posts, Profiles, Search & Hashtags
Pricing
from $1.00 / 1,000 actor run starteds
Threads Scraper - Scrape Posts, Profiles, Search & Hashtags
Threads scraper for public posts, profiles, keyword search and hashtags: scrape without a login or a Threads API key. Get post text, timestamps, likes, replies, reposts, quotes, media URLs and profile follower counts as JSON, CSV or Excel. $0.002 per post, $0.001 to start.
Pricing
from $1.00 / 1,000 actor run starteds
Rating
0.0
(0)
Developer
SR
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Security
Limited permissionsShare
Threads Scraper
Threads Scraper collects public posts from profiles, keyword searches, hashtags and individual post URLs. Use this Threads scraper for brand monitoring, creator research and social listening: get post text, publication times, engagement counts, media URLs and profile summaries without supplying a login or a Threads API key. You can mix target types in one run and download the resulting posts from the default dataset as JSON, CSV or Excel.
What the Threads scraper returns
- One dataset row per post, with like, reply, repost, quote and reshare counts
- The post text, its publication time as ISO 8601 and as a Unix timestamp
- Author handle, account identifier and verification flag on every row
- Media type plus image and video URLs, and the link preview when a post carries one
- For profile targets: the follower count on every row and a full profile record (name, biography, picture, profile URL) in the run summary
- For post URLs: the related public posts Threads shows on that post's page
- A list of targets that returned nothing, each with a code and an English message
Threads Scraper modes
Profile: enter a handle such as zuck or @mosseri, or paste a profile URL.
The results contain recent public posts and the account's follower count. The
summary also holds its username, account identifier, display name, biography,
verification flag, profile picture URL and profile URL. These account records are
separate from the post dataset, so a profile without public posts can still appear
in the summary.
Post: paste a public Threads post URL. The actor returns the related posts
supplied on that page in their original order, with relation: related. These can
be posts about the requested post or recommendations chosen by Threads. Their
content can change between requests. The requested post itself is included only
when it occurs in that same list; it is not added as an extra dataset row, so you
pay only for the posts in that list. The results are not a complete conversation
export. reply_count reports the count supplied by Threads
for each returned post, even when its replies are not available as rows.
Search: enter a phrase such as climate change. The actor collects the public
posts offered for that search. Search results change as Threads changes its ranking,
so repeating a search can return different posts and engagement values.
Tag: enter a hashtag such as #ai. The actor reads the posts currently offered
under that tag. Some tags return no posts at a given time. Such a target is reported
in the errors record rather than becoming a made-up post.
Auto mode decides separately for each target. A bare word is tried as a handle
first. If no profile is found, that word is searched once instead. An explicit
handle beginning with @, or a profile URL, stays a profile request. Use a fixed
mode when you want ambiguous words to be treated consistently, such as a list of
single-word search terms.
How to use the Threads scraper
- Open the actor and add one or more targets: handles, profile URLs, post URLs, search phrases or hashtags.
- Leave the mode on
auto, or pick a fixed mode when every target is of one kind. - Set
posts_per_targetandmax_targetsto the volume your workflow needs. - Start the run, then export the dataset or read it through the Apify API, and
read the
summaryanderrorsrecords from the key-value store.
Input
targets is the list to process. It accepts a list of strings, or a string with
entries separated by commas or newlines. Surrounding whitespace, empty entries and
repeated targets are removed. Target order is retained. max_targets then limits
the normalized list, with a default of 50 and an upper bound of 500.
The mode default is auto; the other choices are profile, post, search
and tag. posts_per_target defaults to 100 and supports an upper bound of 500.
It is a limit on returned rows, not a promise that a page contains that many posts.
The actor returns what the public page supplies and does not retrieve a profile's
entire history.
concurrency defaults to 5 and retries defaults to 3. They control how targets
are requested and how many attempts are made when a page cannot be read. The
optional country field accepts a two-letter country code such as us or gb.
It selects the request location; it does not translate post text or change the
meaning of the language output field.
An example input for two profiles:
{"targets": ["zuck", "mosseri", "instagram"],"mode": "profile","posts_per_target": 3,"max_targets": 2,"concurrency": 2,"retries": 2,"country": "us"}
Only the first two profiles are requested because max_targets is 2. Each supplies
at most three dataset rows. The third target remains outside that run's scope.
Output
Every dataset row contains these post fields: post_id, code, url,
username, user_id, is_verified, text, posted_at, posted_timestamp,
like_count, reply_count, repost_count, quote_count, reshare_count,
is_reply, language, media_kind, image_urls, video_urls, link_url,
link_title, position, source_mode and source_target.
profile_follower_count appears only when the target supplied a profile. Missing
source values remain null. Image and video URL fields are always lists, which may
be empty. media_kind distinguishes text, image, carousel and video posts. Media
links are supplied by Threads and may expire; download them while they remain
available if you need a lasting copy.
Additional fields include source, platform, fetched_at and relation.
Common social field names such as post_url, author_handle, author_id, likes,
comments_count and shares are also present as aliases, so you can read either
naming style; the field names listed above stay stable for existing integrations.
The key-value store's summary record contains target and post counts, engagement
totals and profiles, the list of profile records. errors identifies targets
that could not be read, with a code and an English message. A target error does not
prevent other targets from returning posts. Use post_id to deduplicate across
separate runs; posts returned under separate targets can intentionally appear more
than once within a run.
A real dataset row from the profile run above, fetched on 2 October 2026. The counts are the values at that moment:
{"post_id": "3996155940894885511","code": "Dd1MqfcG0aH","url": "https://www.threads.com/@zuck/post/Dd1MqfcG0aH","username": "zuck","user_id": "63055343223","is_verified": true,"text": "We believe superintelligence will create significant new opportunities for all people and businesses. Meta already serves billions of people at scale and helps hundreds of millions of businesses reach customers. Today we are starting the next major pillar of our business, Meta Enterprise Platform, to help businesses use AI to grow and transform in new ways as well.","posted_at": "2026-09-28T12:35:32Z","posted_timestamp": 1790598932,"like_count": 2616,"reply_count": 2446,"repost_count": 162,"quote_count": 150,"reshare_count": 174,"is_reply": false,"language": null,"media_kind": "text","image_urls": [],"video_urls": [],"link_url": null,"link_title": null,"source": "threads-scraper","platform": "threads","fetched_at": "2026-10-02T17:14:25.647Z","relation": "listed","post_url": "https://www.threads.com/@zuck/post/Dd1MqfcG0aH","author_handle": "zuck","author_id": "63055343223","likes": 2616,"comments_count": 2446,"shares": 162,"source_mode": "profile","source_target": "zuck","profile_follower_count": 5746166,"position": 1}
Use cases
- Brand and product monitoring: search for a brand name or campaign hashtag and track how many posts mention it and how much engagement they draw.
- Creator and influencer research: compare follower counts, posting frequency and average likes or replies across a list of accounts before a partnership.
- Competitor tracking: follow the public posts of competing companies and see which announcements receive the most replies and reposts.
- Social listening and research: collect posts on a topic for sentiment analysis, trend reports or academic work, with timestamps for each snapshot.
- Related-post analysis: start from a post URL to read the related public posts Threads offers on that page, with each returned post's engagement counts.
Threads Scraper compared with other options
| Threads Scraper | Official Threads API | Browser extensions | Open-source scripts | |
|---|---|---|---|---|
| Login or app review | Not needed | Meta developer app and access token | Your own logged-in browser | Depends on the script |
| Other people's public posts | Profiles, posts, search, hashtags | Mainly your own account's content | One page at a time | Yes, if maintained |
| Engagement counts | Likes, replies, reposts, quotes, reshares | Insights for your own posts | Varies | Varies |
| Scheduling and API access | Apify schedules, webhooks, API | Your own code | Manual | Your own servers |
| Maintenance when Threads changes | Ours | Meta's | The extension author | Yours |
| Cost | Pay per delivered post | Free within limits | Often a subscription | Your time and servers |
The official Threads API is the right choice for publishing to and measuring your own account. Use this actor when you need public data about other accounts, keywords or hashtags without setting up a developer app.
Pricing
Threads Scraper uses pay-per-event pricing: $0.001 when a run starts and $0.002 for each post actually delivered to the dataset. A run with no posts has the start fee and no post charges. Profile summaries are free: there is no separate profile event. For post URLs you pay only for the related posts that are returned.
Users without a paid Apify plan receive at most ten dataset rows per run. The cap
applies across all targets, preserving the first delivered rows in target order.
Paid users retain their requested volume. To control result volume, set both
max_targets and posts_per_target to the amount your workflow needs.
For example, a run that delivers 100 posts costs $0.001 + 100 × $0.002 = $0.201.
FAQ
Does Threads Scraper require an account?
No account or login information is required for public data. Private or unavailable content is not included. Check the errors record when a requested target has no results.
Can I download every historical post or every reply?
The actor collects the posts available on the public page. It does not promise a complete history or a complete reply tree. Post URLs return the related public posts available in the page's list; Threads may offer recommendations instead of posts about the requested post.
Why do results or counts change between runs?
Posts, recommendations, hashtag availability and engagement counts change over time.
posted_at describes publication time; fetched_at describes when the actor read
that row. Compare those fields when storing repeated snapshots.
Where are profile biographies and failures?
Read summary.profiles in the summary key-value record for profile information.
Read the errors record for unavailable targets. The default dataset contains post
rows, including their author fields and, where available, profile follower counts.
Is this the same as the Threads API?
No. The official Threads API from Meta is built mainly for managing your own account: publishing, replies to your posts and insights. Threads Scraper reads public posts, profiles, searches and hashtags of any public account and needs no developer app or access token.
Can I schedule runs or call the Threads scraper from my own code?
Yes. Use Apify schedules to run it hourly or daily, and webhooks to be notified when a run finishes. Every run can also be started and read through the Apify API or the official Python and JavaScript clients.
In which formats can I export the data?
The dataset downloads as JSON, CSV, Excel, XML or HTML from the run page or the API. Image and video URL fields are lists, so in CSV they appear as numbered columns.