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.
Who is it for?
- Social media analysts comparing public Threads activity and engagement
- Brand and PR teams monitoring public conversations and account posts
- Creator marketers researching public profiles and content patterns
- Developers connecting Threads datasets to APIs, schedules, webhooks, or AI agents
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 |
Automatic Apify Proxy routing by default, with one bounded direct fallback; named groups are used only when you select one your account can access |
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. - Keep automatic Apify Proxy routing enabled for the most reliable shared-cloud route. Select a named proxy group only when your Apify account has access to it.
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 uses automatic Apify Proxy routing, makes one bounded direct fallback when needed, and reports unavailable inputs in RUN_SUMMARY.
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 ApifyClient
import os
client = 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().items
print(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.
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.