Threads Scraper: Posts, Profiles & Search
Pricing
from $0.10 / 1,000 result extracteds
Threads Scraper: Posts, Profiles & Search
Scrape public Threads profiles, recent posts, direct posts, visible replies, keyword search, engagement metrics, and media. No login required.
Pricing
from $0.10 / 1,000 result extracteds
Rating
0.0
(0)
Developer
Hanna Nosova
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
2
Monthly active users
7 days ago
Last modified
Categories
Share
Scrape public Threads profiles, recent profile posts, direct posts and visible replies, or keyword and hashtag search results—without a Threads or Instagram login.
At a glance
- Four modes: profile details, profile posts, direct posts with replies, and keyword/hashtag search.
- Post data: full public text, timestamps, likes, replies, reposts, quotes, media, hashtags, mentions, and author details.
- Profile data: stable user ID, username, display name, biography, follower count, verification status, avatar, and profile URL.
- Exports: JSON, CSV, Excel, XML, RSS, API, webhooks, and Apify integrations.
- No login: reads only public data exposed to logged-out crawler traffic.
Ready-to-run examples
- Scrape Zuck Threads Posts — export a profile and its recent public posts.
- Monitor Instagram Threads Profile — collect profile and recent-post data for recurring monitoring.
- Compare Brand Threads Profiles — compare several public profiles in one dataset.
- Search Threads Posts by Keyword — find recent public posts matching a keyword.
- Scrape a Threads Post and Replies — export a public post and its visible replies.
What does this Threads scraper do?
| Mode | Input | Results |
|---|---|---|
| Profile details | Handles or profile URLs | Profile identity, bio, followers, verification, avatar |
| Profile posts | Handles or profile URLs | Profile row plus recent posts and engagement |
| Direct posts and replies | Public post URLs | Requested posts plus their visible reply window |
| Search | Keywords or hashtags | Recent matching public posts with engagement and media |
| Auto | Any combination | Processes profiles, post URLs, and searches in one run |
Input examples
Recent posts from profiles
{"mode": "posts","usernames": ["zuck", "instagram"],"maxPosts": 20,"includeProfile": true}
Search Threads by keyword or hashtag
{"mode": "search","searchQueries": ["artificial intelligence", "#marketing"],"maxPosts": 20}
Get a post and its visible replies
{"mode": "post","postUrls": ["https://www.threads.com/@zuck/post/DakyAavlKLZ"],"includeReplies": true,"maxRepliesPerPost": 20}
Output example
{"itemType": "post","profileUrl": "https://www.threads.com/@zuck","username": "zuck","displayName": "Mark Zuckerberg","userId": "63055343223","isVerified": true,"postId": "3937491905269768921","shortcode": "DakyAavlKLZ","postUrl": "https://www.threads.com/@zuck/post/DakyAavlKLZ","text": "Today we're releasing...","timestamp": "2026-07-09T14:00:34.000Z","mediaType": "text","mediaUrls": [],"likeCount": 2806,"replyCount": 708,"repostCount": 194,"quoteCount": 63,"isReply": false,"isRepost": false,"isQuotePost": false,"hashtags": [],"mentions": [],"externalUrls": [],"scrapedAt": "2026-07-22T11:29:03.928Z"}
Input settings
| Setting | JSON key | Description |
|---|---|---|
| Mode | mode | posts, profile, post, search, or auto |
| Usernames or profile URLs | usernames | Public handles, @handles, or Threads profile URLs |
| Legacy profile inputs | profileUrlsOrUsernames | Backward-compatible alias for existing tasks and API clients |
| Post URLs | postUrls | Direct public Threads post URLs |
| Search queries | searchQueries | Keywords or hashtags for public Threads search |
| Maximum posts | maxPosts | Requested post limit per username or search; public availability may be lower |
| Legacy maximum posts | maxPostsPerProfile | Backward-compatible alias for existing API clients and tasks |
| Include profile | includeProfile | Save a profile row in profile-post mode |
| Include replies | includeReplies | Save visible replies below direct post URLs |
| Maximum replies | maxRepliesPerPost | Reply-row limit per direct post |
| Posted at or after | postedAfter | Inclusive ISO 8601 timestamp filter |
| Posted before | postedBefore | Exclusive ISO 8601 timestamp filter |
| Proxy | proxyConfiguration | Optional Apify Proxy route for blocked or rate-limited runs |
Output fields
| Group | Fields |
|---|---|
| Record identity | itemType, sourceUrl, scrapedAt |
| Author/profile | username, displayName, userId, isVerified, profileUrl, bio, followerCount, avatarUrl |
| Post identity | postId, shortcode, postUrl, parentPostId, rootPostId |
| Content | text, timestamp, mediaType, mediaUrls, hashtags, mentions, externalUrls |
| Engagement | likeCount, replyCount, repostCount, quoteCount |
| Classification | isReply, isRepost, isQuotePost, replyToId |
| Search | searchQuery |
Pricing
This Actor uses pay-per-event pricing. You pay a small start fee and for each profile, post, reply, or search-result row saved to the dataset.
| Event | What is charged | Free | Starter / Bronze | Scale / Silver | Business / Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|---|
start | Once per run | $0.005 | $0.005 | $0.005 | $0.005 | $0.005 | $0.005 |
result | Each saved dataset row, per 1,000 | $0.1864 | $0.16209 | $0.12643 | $0.09725 | $0.06484 | $0.04538 |
Proxy traffic, storage, and other Apify platform usage may add cost depending on your account and configuration. Error and status information is stored in RUN_SUMMARY, not charged as dataset rows.
Common workflows
- Brand monitoring: schedule profile-post and keyword searches to watch brand and competitor activity.
- Creator research: compare followers, verification, posting cadence, content formats, and engagement.
- Social listening: search product names, campaigns, executives, topics, and hashtags.
- Conversation analysis: collect a known post and the public reply window below it.
- Content datasets: export post text, media, timestamps, and engagement to CSV or a data warehouse.
- AI pipelines: run the Actor through Apify API or MCP and summarize matching public conversations.
Tips for better results
- Start with 1–5 targets and a result limit of 10–20.
- Use
mode: "profile"when you only need identity, bio, followers, and verification. - Use direct post URLs when replies are the main goal.
- Search exact brand names and distinctive phrases; broad queries can be noisy.
- Add
postedAfterandpostedBeforefor recurring reporting windows. - Enable Apify Proxy only if the direct crawler route is rate-limited; proxy traffic can add cost.
Limits and practical notes
Threads controls the public logged-out window. A profile currently exposes roughly its 15 most recent non-reply posts, and public search exposes a small recent result window. Setting a higher maxPosts does not invent unavailable history. Direct post pages can expose a larger visible reply window, but not every reply shown to a logged-in user is necessarily public to logged-out traffic.
Private, deleted, age-restricted, login-gated, or unavailable content is not returned. Threads can rotate internal public queries or rate-limit a route; the Actor falls back to server-rendered public data and reports unavailable inputs in RUN_SUMMARY rather than silently returning a misleading empty success.
API usage
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('fetch_cat/threads-profile-posts-scraper').call({mode: 'posts',usernames: ['zuck'],maxPosts: 20,includeProfile: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
from apify_client import ApifyClientimport osclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('fetch_cat/threads-profile-posts-scraper').call(run_input={'mode': 'search','searchQueries': ['artificial intelligence'],'maxPosts': 20,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
cURL
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~threads-profile-posts-scraper/runs" \-H "Authorization: Bearer $APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"mode":"post","postUrls":["https://www.threads.com/@zuck/post/DakyAavlKLZ"],"includeReplies":true}'
MCP and AI agents
Use the official Apify MCP server with only this Actor enabled:
https://mcp.apify.com?tools=fetch_cat/threads-profile-posts-scraper
Claude Code:
$claude mcp add --transport http apify "https://mcp.apify.com?tools=fetch_cat/threads-profile-posts-scraper"
JSON configuration:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=fetch_cat/threads-profile-posts-scraper"}}}
Example prompts:
- “Get the latest public Threads posts from @zuck with engagement metrics.”
- “Search Threads for my brand name and return the matching posts as a table.”
- “Get this Threads post and summarize the visible replies.”
- “Compare these five Threads creators by followers and recent-post engagement.”
Scheduling and integrations
Save the input as an Apify task and schedule it daily or weekly. Send new datasets through webhooks, Make, Zapier, Google Sheets, Slack, a data warehouse, or your own API. For monitoring, use a consistent date window and deduplicate exported rows by postId.
FAQ
Does this require a Threads or Instagram account?
No. It reads public data available to logged-out crawler traffic and does not ask for cookies, credentials, or an API key.
Can it search Threads by keyword or hashtag?
Yes. Use mode: "search" and searchQueries. Threads exposes a limited recent public search window, so result counts may be below maxPosts.
Can it scrape replies?
Yes. Use direct post URLs with includeReplies: true. The Actor saves the requested post plus the visible public reply window.
Why did I receive fewer than maxPosts?
maxPosts is a ceiling, not a promise. Logged-out profile and search pages expose a limited recent window. The Actor returns everything honestly available within that window.
Can I export to CSV, Excel, or JSON?
Yes. Open the run dataset and choose CSV, Excel, JSON, XML, HTML, or another supported Apify format, or retrieve the rows through the API.
What happens when one target fails?
Valid targets continue. The Actor preserves their rows, records the unavailable target and reason in RUN_SUMMARY, and fails the whole run only when no requested input produces public data.
Responsible use
Only collect public data you are permitted to use. Respect Threads terms, privacy rights, applicable law, and reasonable request rates. Do not use the output for spam, harassment, discrimination, or sensitive profiling.
Related Actors
- TikTok Video Scraper — public TikTok video metadata and engagement.
- TikTok Profile Scraper — public creator and profile data.
- Reddit Scraper — posts and discussions by community or query.
- Instagram Stories & Highlights Scraper — public story and highlight data when available.
- Website Change Monitor — recurring website monitoring and change detection.
Support
If a run fails or output looks wrong, open an issue from the Actor page. Include the Apify run ID or run URL, input JSON, expected output, actual output, and one reproducible public URL from Threads. Do not share private credentials, cookies, or non-public content.
Privacy and data handling
The Actor uses your supplied handles, URLs, search terms, filters, and limits only to fetch the requested public Threads data and write results to your Apify dataset and key-value store. FetchCat does not retain run data outside Apify storage or send it to advertising networks, data brokers, or model-training services.