Threads Scraper — Posts, Replies & Profiles, No Login
Pricing
$9.00 / 1,000 results
Threads Scraper — Posts, Replies & Profiles, No Login
Threads scraper without login: extract public posts, profiles, replies, search and hashtags with engagement data via API. Try free.
Pricing
$9.00 / 1,000 results
Rating
0.0
(0)
Developer
Vnx0
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
5 days ago
Last modified
Categories
Share
Scrape public Threads.com data without login, cookies, or API keys: profiles, user posts, replies tabs, single-post threads, keyword search, and hashtag feeds. This Threads scraper returns one flat row per post with real like, reply, repost, and quote counts, plus a profile row when you want it.
Threads only shows logged-out visitors a window of recent content (about 10 profile posts, about 29 items per post thread, one page per search or hashtag — checked 2026-09-10). This Actor keeps every visible row, tells you when the login wall cut a run short, and never bills you for rows date filters removed or for an all-empty run.
What you can scrape
- Profiles — username, full name, bio, profile picture, verified flag, follower count, bio-link website, post URL. (
followingCountstays null for guests — Threads does not serve it logged-out.) - User posts (
mode: posts) — recent posts per username, newest first. - Author replies (
mode: replies) — the profile Replies tab, not just top-level posts. - Post threads — any
postUrlsentry returns the post plus its reply thread;replySort: topputs the best-liked replies first. - Keyword search —
searchQuerieswithsearchSortType: top | recent. - Hashtag feeds —
hashtagswith or without#. - Media and context — photo/video/carousel URLs with dimensions,
mediaType,hasAudiofor video, hashtags, mentions, externalurls, link-preview URL, repost and quote lineage (repostedFrom,quotedPostAuthor,parentPostId,rootPostId),scrapedFromMode, andsearchQueryon search rows.
Threads profile scraper
Pass handles, @handles, or profile URLs in usernames:
{ "usernames": ["zuck", "@mosseri", "https://www.threads.com/@creators"], "mode": "posts", "includeProfile": true, "maxPostsPerProfile": 10 }
mode applies to usernames: posts (default), replies, or profile (metadata only). includeProfile: true adds one profile row per username alongside posts. maxPostsPerProfile: 0 means no per-profile cap (global maxItems still applies).
Scrape Threads posts
Each post row carries 41 fields (about 29 on a typical row — conditional repost, quote, and reply fields are omitted when they do not apply unless you set compactOutput: false):
| Group | Fields |
|---|---|
| Identity | type, postId, code, url, username, userId, userFullName, userIsVerified |
| Content | text, publishedAt, takenAtTimestamp, isEdited, isReply, replyToAuthor, hashtags, mentions, urls |
| Engagement | likeCount, replyCount, repostCount, quoteCount, reshareCount |
| Repost / quote | isRepost, repostedFrom, repostedPostId, repostedPostUrl, isQuotePost, quotedPostId, quotedPostUrl, quotedPostAuthor |
| Thread | parentPostId, rootPostId |
| Media | mediaType, mediaCount, mediaUrls, media[{type,url,width,height}], hasAudio, linkPreviewUrl |
| Source | scrapedFromMode, searchQuery, scrapedAt |
Profile rows carry type, username, userId, fullName, biography, profilePicUrl, profileUrl, isVerified, followerCount, followingCount, website, isPrivate.
Post threads and top replies
{ "postUrls": ["https://www.threads.com/@zuck/post/DdCYWl7GktV"], "includeReplies": true, "replySort": "top", "maxRepliesPerPost": 50 }
includeReplies: falsereturns exactly one row for the post URL.replySort: top(default) keeps the root post first and ranks replies by likes;recentkeeps page order.maxRepliesPerPostcaps expansion per URL;maxItemscaps the whole run.
Threads search scraper
{ "searchQueries": ["climate change", "ai agents"], "searchSortType": "top", "postedAfter": "2026-01-01", "maxItems": 100 }
Search returns the public results page (single page per query — Threads-side limit). postedAfter / postedBefore (YYYY-MM-DD or ISO) drop rows before billing, so filtered-out rows cost nothing.
Threads hashtag scraper
{ "hashtags": ["coffee", "#travel"], "maxItems": 100 }
Same single-page window as search. The # prefix is optional; output rows carry searchQuery: "#coffee" so mixed runs stay attributable.
Output fields and export
Every run writes flat rows to the default dataset (JSON, CSV, Excel, XML in the Console) and a RUN_SUMMARY object to the key-value store with per-target outcomes, date-excluded counts, and error reasons. An all-empty run fails with the summary instead of billing green — check RUN_SUMMARY.targetsEmpty before retrying.
{"type": "post","postId": "3981852126213720917","code": "DdCYWl7GktV","url": "https://www.threads.com/@zuck/post/DdCYWl7GktV","username": "zuck","text": "Post text here","publishedAt": "2026-09-01T12:00:00.000Z","likeCount": 4969,"replyCount": 1034,"repostCount": 372,"quoteCount": 277,"mediaType": "text","hashtags": [],"mentions": [],"scrapedFromMode": "posts","scrapedAt": "2026-09-10T00:00:00.000Z"}
Pricing
Pay-per-result: one billable event per dataset row (post or profile). Date-excluded rows are never pushed and never billed. Set maxTotalChargeUsd (0 = no cap) to stop cleanly at a budget. Start small: one username with maxPostsPerProfile: 5 shows the full schema for a few cents, then raise maxItems for bulk runs. The final per-1K price is listed on the Pricing tab.
How to scrape Threads
- Click Try for free and open the Input tab.
- Add
usernames,postUrls,searchQueries, orhashtags(combine them in one run). - Pick
modefor usernames and setmaxItemsas your spend control. - Click Start, then open the Dataset tab to preview rows.
- Export as JSON, CSV, or Excel, or call the API for pipelines.
- Add an Apify Schedule for daily creator or keyword checks.
Threads scraper API
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('vnx0/threads-scraper-no-login').call({usernames: ['zuck'],mode: 'posts',includeProfile: true,maxPostsPerProfile: 10,maxItems: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python:
from apify_client import ApifyClientclient = ApifyClient(token="APIFY_TOKEN")run = client.actor("vnx0/threads-scraper-no-login").call(run_input={"searchQueries": ["ai agents"], "maxItems": 50})print(client.dataset(run["defaultDatasetId"]).list_items().items[:2])
Prefer no code: run from Console, schedule it, attach a webhook, or connect Make, Zapier, or n8n. AI agents can call it through the Apify MCP server.
Use cases
- Creator research — compare recent posts, follower counts, and engagement across handles.
- Brand and keyword monitoring — schedule daily
searchQueriesruns and diff the dataset. - Hashtag tracking — pull
#tagfeeds for campaigns or events. - Conversation analysis — expand a post thread with top replies first for sentiment review.
- Content research — collect text, hashtags, mentions, and media URLs for analysis pipelines.
- Competitor checks — watch public posting cadence and repost/quote pickup.
This Actor does not do lead enrichment, email extraction, follower-list pulls, or new-post delta detection — schedule full runs and diff on postId instead.
Limitations
| Limit | What happens |
|---|---|
| Logged-out window (~10 profile posts, ~29 thread items, 1 page search/hashtag) | Run keeps visible rows and notes truncation in logs |
| Private or login-gated accounts | Target reported empty in RUN_SUMMARY, skipped |
| View counts, follower/following lists, full history | Not served to guests — never promised, never null-filled silently |
| Media binaries | URLs only; CDN links expire — download promptly |
| Threads layout changes | Embedded-data extractor with DOM fallback; failures logged per target |
FAQ
Do I need a Threads or Instagram login, cookies, or API key? No. Only what Threads serves to logged-out visitors, over Apify Proxy by default.
Is there an official Threads API? How is this different? Meta's official API covers your own content, publishing, and insights behind app review. This Actor reads public profiles, posts, search, and hashtags and returns them as rows you can export or call via API — no app review.
Can I scrape private accounts? No. Public data only.
Why did I get fewer rows than my max? The max is a ceiling, not a guarantee. Inactive profiles, niche queries, and the logged-out window return fewer rows. The run still succeeds if any target returned data.
Do view counts come back? No. Threads does not expose them to guests.
Do date filters save money?
Yes. postedAfter / postedBefore exclusions happen before the dataset push, so excluded rows cost nothing.
What if every target returns nothing?
The run fails with a RUN_SUMMARY explaining which targets were empty and why, instead of a green billed run.
threads.com or threads.net?
Both URL forms are accepted as input; output URLs use the canonical threads.com form.
How do I export to CSV or Excel?
Run in Console, open Storage, download — or fetch GET /v2/datasets/{id}/items?format=csv with your token.
Can AI agents use it? Yes — via the Apify API or MCP server with the same JSON input.
Troubleshooting
No valid targets— provide at least one ofusernames,postUrls,searchQueries,hashtags.- All-empty failure — read
RUN_SUMMARY.targetsEmptyfor per-target reasons (not-found-404,no-rows-returned); check handle spelling and try one known-public profile. - Thin search results — split multi-word phrases into separate queries; try
recentsort. - Private account — expected empty; remove it from the list.
- Cost worries — set
maxPostsPerProfile: 5+maxTotalChargeUsd: 1for a sample run first. - Proxy errors — leave
proxyon automatic routing unless you have a reason to change it.
Legal and support
Reads public pages only; respects the logged-out window; no credential handling. Found a bug or Threads changed layout? Open an issue on the Actor page — reports with a failing input and RUN_SUMMARY get fixed first.