Threads Scraper
Scrape public Threads profiles and recent posts without login: bios, followers, post text, likes, timestamps and media URLs. From $0.40 per 1,000 results.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
profiles,maxPostsPerProfile,query(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0004 per Threads profile or post = $0.4 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Threads profile or post | One genuine public Threads profile or post row. Samples and diagnostics are free. | $0.0004 |
| Actor Start | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). | $0.001 |
Pay-per-event pricing: you are billed per result, not per subscription — a run that returns nothing costs nothing beyond the start fee. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-04, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
profiles | Public Threads handles or profile URLs. Leave empty for an uncharged sample row. | array |
maxPostsPerProfile | Maximum genuine public posts saved for each supplied public profile. | integer |
query | Optional case-insensitive text filter applied to posts from the supplied profiles. This is not a global Threads search. | string |
includeProfile | Save one public profile row for every successfully resolved handle. | boolean |
fallbackToResidential | Direct HTTP is always attempted first. When enabled, one blocked or transient request is retried through the supplied Apify proxy settings. | boolean |
What you get
A structured dataset — each result includes fields like:
recordTypeusernamedisplayNamefollowerCountisVerifiedprofileUrltextlikeCountpublishedAtpostUrlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Social Media Scrapers
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
Facebook Pages Scraper
Scrape public Facebook Page names, categories, likes, talking-about counts, verified badges and images without login.
LinkedIn Profile Posts Scraper
LinkedIn profile posts scraper at $0.90 per 1,000 posts, flat on every plan. Post text, author, image, publish time and URL.
LinkedIn Company Posts Scraper
LinkedIn company posts scraper at $0.90 per 1,000 posts plus a $0.001 run start. Public post text, reactions, comments and URLs. No login or cookies needed.
LinkedIn Post Comments Scraper
Scrape public LinkedIn post comments: author name, profile URL, reaction count. No login or cookie. Up to 10 per post.
RedNote Scraper
Scrape public RedNote (Xiaohongshu) notes: description, author, likes, collects, comments, shares and images.
RedNote (Xiaohongshu) Profile Scraper
RedNote (Xiaohongshu) profile scraper API. Nickname, RedNote ID, follower counts, likes and collects, verification, IP location, gender and recent notes.
Where this tool sits
- Categories
- Social Media Scrapers
- Platforms
- Threads
Threads Profiles & Recent Posts Scraper
Collect public Threads profiles and their latest public posts without a Threads login. It uses an HTTP-only direct path: Threads' crawler-facing profile metadata resolves the public profile, then the public profile-posts query returns recent posts.
What it returns
Every row carries a recordType so you can split the dataset in one pass.
profile rows (recordType: "profile"):
| Field | What it holds |
|---|---|
username, displayName | the handle and the public display name |
bio | public bio text |
followerCount | approximate follower count, as Threads publishes it |
profilePicUrl, profileUrl | avatar image and the canonical public profile URL |
id, source | stable row id and the path the data came from |
post rows (recordType: "post"):
| Field | What it holds |
|---|---|
postId, postCode, postUrl | ids and the canonical threads.com/@user/post/... link |
username | the author handle |
text | the public post text |
likeCount | likes, or null when Threads does not expose a count |
publishedAt | ISO timestamp |
imageUrls | up to five public image URLs |
hasVideo, isReply | booleans for media type and whether the post is a reply |
diagnostic rows (recordType: "diagnostic") are deterministic free rows carrying a code — BLOCKED, RATE_LIMITED, NOT_FOUND, NETWORK or TARGET_ERROR — for invalid input, blocking, rate limits, target errors, no matching posts, or no results.
Only validated public profile and post rows are charged. Samples and diagnostics are never charged.
Input
{
"profiles": ["zuck", "https://www.threads.com/@instagram"],
"maxPostsPerProfile": 10,
"includeProfile": true,
"query": "AI",
"fallbackToResidential": false
}
| Field | Default | Notes |
|---|---|---|
profiles | ["zuck"] prefilled | public handles or full threads.com/@handle URLs; both forms are accepted |
maxPostsPerProfile | 10 | 1–30 genuine public posts saved per profile |
includeProfile | true | set false to skip profile rows and pay only for posts |
query | — | case-insensitive text filter applied to the posts from the profiles you supplied |
fallbackToResidential | false | allow one bounded proxy retry after a block or transient failure |
proxyConfiguration | proxy off | only used by that one fallback retry |
query is intentionally account-scoped: Threads does not provide a reliable anonymous global search path, so this Actor does not claim one. Turning includeProfile off is the cheapest way to run a posts-only monitor, since each skipped profile row is one row you are not billed for.
Leave profiles empty to receive one clearly labelled, uncharged sample profile row.
Proxy behavior
The Actor always tries direct HTTP first. When fallbackToResidential is enabled and a direct request is blocked, rate-limited, or has a transient network failure, it makes one bounded retry using the supplied Apify proxy configuration. It does not retry successful requests and does not use a proxy for media downloads.
Pricing
$0.40 per 1,000 rows ($0.0004 each), plus $0.001 each time a run starts. Flat rate — no volume tiers, no plan gates — and you are charged only for rows actually returned.
A row is a genuine profile or post row. Samples, diagnostics, duplicates, blocked look-ups and no-result runs never incur the per-result fee — a run that returns nothing costs only the $0.001 start fee. Direct HTTP is the default path, so no residential bandwidth is billed unless you explicitly switch on fallbackToResidential.
Limits
- Public profiles and public posts only.
maxPostsPerProfileis capped at 30 to keep costs and target load bounded.- Profile follower counts are approximate when Threads abbreviates them in public metadata.
- Threads can change anonymous endpoints. A diagnostic row means no result was charged.
Use public data in accordance with applicable law and Threads' terms.