Threads Scraper avatar

Threads Scraper

Pricing

from $0.02 / actor start

Go to Apify Store
Threads Scraper

Threads Scraper

Scrape public Threads profiles, posts, replies and search results without login. Get text, likes, replies, reposts, media, hashtags and follower counts. Export to JSON, CSV, Excel or API.

Pricing

from $0.02 / actor start

Rating

0.0

(0)

Developer

Eonix Pvt Ltd

Eonix Pvt Ltd

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Threads Scraper — Posts, Profiles & Replies (Meta Threads)

Scrape public Threads (threads.net / threads.com) profiles, their latest posts, full reply threads and keyword search results. No login, no cookies, no Threads account needed. You get clean, ready-to-use data: post text, likes, replies, reposts, quotes, images, videos, hashtags, mentions, follower counts and more, exported as JSON, CSV, Excel or straight into your tools.

What you can scrape

  • 👤 Profiles: name, bio, follower count, verified badge, profile picture, bio links
  • 📝 A profile's posts: text, publish date, likes, replies, reposts, quotes, images, videos, link previews, hashtags, mentions. Multi-part threads are split into individual posts and linked together.
  • 💬 Replies to any post: the post itself plus its replies, including nested reply chains, each linked to its parent via parentPostId
  • 🔎 Keyword search: the top public posts Threads shows for any search term

Why scrape Threads instead of (or as well as) Instagram?

Every Threads account is an Instagram account: same creators, same brands, same audience. But while Instagram scrapers are everywhere, Threads has roughly 10x less competition, so the data is fresher, less picked over, and a real edge for anyone doing research or outreach. Threads is also text-first, so you get what people actually say about brands and topics, not just captions under photos.

Use cases

  • Brand monitoring: track what people say about your brand, products or competitors. Schedule the Actor with a search query and get new mentions every day.
  • Creator & influencer research: compare follower counts, posting frequency and engagement (likes, replies, reposts) across creators before you reach out.
  • Lead generation: find people and businesses talking about a problem you solve, then collect their profiles and bio links.
  • Market research & trend spotting: see which topics, hashtags and formats get the most engagement in your niche.
  • AI agents & RAG: feed clean, structured Threads conversations (posts + reply trees) into LLM pipelines, sentiment analysis or vector databases.
  • Community & crisis monitoring: follow the full reply thread of a viral post and export every reply for analysis.

Sample output

Real items from a test run with the default input (profiles: ["zuck"]), trimmed for readability (long image URLs shortened with …):

[
{
"type": "profile",
"userId": "63055343223",
"username": "zuck",
"fullName": "Mark Zuckerberg",
"biography": "Mostly superintelligence and MMA takes",
"profilePicUrl": "https://instagram.fcmb1-2.fna.fbcdn.net/v/t51.82787-19/825322135_17989325280103224_1252773933700107438_n.jpg?…",
"followerCount": 5744496,
"isVerified": true,
"isPrivate": false,
"externalUrl": null,
"bioLinks": [],
"threadsProfileUrl": "https://www.threads.com/@zuck",
"sourceInput": "zuck",
"scrapedVia": "http",
"scrapedAt": "2026-09-26T19:18:05.647Z"
},
{
"type": "post",
"id": "3994109866205639942",
"code": "Ddt7cL5EfUG",
"url": "https://www.threads.com/@zuck/post/Ddt7cL5EfUG",
"username": "zuck",
"text": "Agrippa said it's time to get back to work 😎",
"publishedAt": "2026-09-25T16:50:21.000Z",
"likeCount": 4132,
"replyCount": 368,
"repostCount": 219,
"quoteCount": 37,
"images": ["https://instagram.fcmb1-2.fna.fbcdn.net/v/t51.82787-15/823965183_17989304049103224_2823186847710225415_n.webp?…"],
"videos": [
"https://instagram.fcmb1-2.fna.fbcdn.net/o1/v/t16/f2/m84/AQO9jbyD1anYYh9Ih-HQxh8Gsmaj7GE6TCSyT4NL7VnDyjGKtRTmiPMsJiPcbBQBtl4kjZmi0I46RbXZXy5pS30YZGNz4XY5audLQaE.mp4?…"
],
"isReply": false,
"parentPostId": null,
"hashtags": [],
"source": "profile"
},
{
"type": "post",
"id": "3992880350758034895",
"code": "Ddpj4YZkd3P",
"url": "https://www.threads.com/@zuck/post/Ddpj4YZkd3P",
"username": "zuck",
"text": "Here's everything I announced at Meta Connect today 👇",
"publishedAt": "2026-09-24T00:07:31.000Z",
"likeCount": 2656,
"replyCount": 602,
"repostCount": 161,
"quoteCount": 34,
"images": [],
"videos": [],
"isReply": false,
"parentPostId": null,
"hashtags": [],
"source": "profile"
}
]

All output fields

Every item has a type of either "post" or "profile". Use the Posts & replies and Profiles tabs in the dataset view to see them separately. Missing values are always null (never an empty string), counts are numbers, and dates are ISO-8601 (UTC).

Post fieldDescription
id, code, urlThreads post ID, short code and link
username, userId, userFullName, userIsVerifiedAuthor
textFull post text
publishedAtWhen it was posted (ISO-8601)
likeCount, replyCount, repostCount, quoteCount, reshareCountEngagement
images, videosMedia URLs (highest resolution available; carousels included)
linkPreview{ url, displayUrl, title, imageUrl } for posts that share a link (tracking redirect removed)
isReply, parentPostId, replyToUsernameReply structure: rebuild whole conversation trees with parentPostId
quotedPostIdID of the post being quoted, if any
topicTag, hashtags, mentionsThreads topic tag, #hashtags in the text (plus the topic tag), and @mentions
source, sourceInputHow it was found (profile, post, reply, search) and which of your inputs produced it
scrapedVia, scrapedAthttp or browser, and when it was scraped
Profile fieldDescription
userId, username, fullNameIdentity
biographyBio text
followerCountFollowers
isVerified, isPrivateBadges and privacy
profilePicUrlLargest available profile picture
externalUrl, bioLinksFirst bio link and all bio links
threadsProfileUrlLink to the profile

Pricing: pay only for results

This Actor uses simple pay-per-event pricing. You only pay for what you get:

EventPriceWhen
Actor start$0.01Once per run
Post scraped$0.001Per post, reply or search result saved
Profile scraped$0.003Per profile saved

That's $1 per 1,000 posts. Duplicates are never charged, and if a profile or post can't be scraped, you pay nothing for it.

Worked example: you want the latest 100 posts from 10 creators. 10 profiles × $0.003 + 1,000 posts × $0.001 + $0.01 start = $1.04.

Stay in control of cost: set Max results in the input, or set Max total charge in the run options. When the limit is reached, the Actor stops cleanly, keeps everything scraped so far, and records budgetReached: true in the run's STATS record.

Input

The default input works out of the box: it scrapes the profile and latest posts of @zuck. Fill in at least one of Profiles, Post URLs, Search queries or Start URLs.

ParameterTypeDefaultWhat it does
profileslist of text["zuck"]Usernames (zuck, @zuck) or profile URLs. Returns the profile + latest posts.
postUrlslist of text[]Post links, e.g. https://www.threads.com/@zuck/post/Ddt7cL5EfUG. Returns the post + replies. threads.net and short /t/CODE links work too.
searchQuerieslist of text[]Keywords to search for.
startUrlslist of URLs[]Any mix of profile, post and search URLs (handy for bulk import from a spreadsheet).
maxPostsPerProfilenumber50Posts per profile. 0 = profile details only.
maxRepliesPerPostnumber100Replies per post URL. 0 = the post only.
maxPostsPerSearchnumber50Results per search query.
maxResultsnumber50Cap on total items for the whole run. 0 = no cap.
enableBrowserFallbackyes/notrueIf Threads blocks plain requests 3 times in a row, retry with a real browser.
maxConcurrencynumber5Pages fetched in parallel.
proxyConfigurationproxyApify ResidentialThreads blocks datacenter IPs; keep residential.

Example input:

{
"profiles": ["zuck", "mosseri"],
"postUrls": ["https://www.threads.com/@zuck/post/Ddt7cL5EfUG"],
"searchQueries": ["web scraping"],
"maxPostsPerProfile": 100,
"maxRepliesPerPost": 200,
"maxResults": 1000
}

How to use it from your code and tools

In the snippets below, replace ACTOR_ID with the ID shown at the top of this Actor's page (for example username/threads-scraper) and YOUR_APIFY_TOKEN with your token from Apify Console → Settings → Integrations.

REST API (any language)

Run the Actor and get the results in one call:

curl -X POST "https://api.apify.com/v2/acts/ACTOR_ID/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"profiles": ["zuck"], "maxPostsPerProfile": 20}'

(In the URL, write ACTOR_ID as username~threads-scraper, with a tilde instead of the slash.)

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("ACTOR_ID").call(run_input={"profiles": ["zuck"], "maxPostsPerProfile": 20})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item["type"] == "post":
print(item["publishedAt"], item["likeCount"], item["text"])

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('ACTOR_ID').call({ searchQueries: ['your brand'], maxPostsPerSearch: 50 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((item) => item.type === 'post'));

Make (Integromat)

Add the Apify → Run an Actor module, pick this Actor, paste your input JSON, and enable Run synchronously. Then add Apify → Get Dataset Items to loop over the results into Google Sheets, Airtable, Slack, a CRM, or anywhere else.

n8n

Use the Apify node with the Run Actor and get dataset operation (or an HTTP Request node calling the REST endpoint above). Schedule it with a Cron trigger for daily brand monitoring.

AI agents (MCP)

Give Claude, ChatGPT, Cursor or any MCP-compatible agent direct access to Threads data through the Apify MCP server:

https://mcp.apify.com?actors=ACTOR_ID

Add it as a remote MCP server in your client, authenticate with your Apify account, and ask things like "What are people on Threads saying about our product launch this week?"

FAQ

Do I need a Threads or Instagram account? No. The Actor only reads public pages, exactly as a logged-out visitor sees them. Never give a scraper your account credentials.

Why did one of my profiles fail? Open the run's Storage → Key-value store → FAILED_INPUTS record. It lists every input that returned nothing and why. The most common reason is that the username doesn't exist or is private: Threads shows a login page for both, so the Actor can't tell them apart and reports "profile may not exist, may be private, or was blocked". You are not charged for failed inputs.

How many search results can I get? Without logging in, Threads shows only its top results for each query, usually 10–25 posts. For deeper coverage, add several related queries, or scrape the profiles that show up in the results.

Do image and video links expire? Yes. Threads media URLs are signed and expire after a few days. Download the files promptly if you need to keep them.

What is scrapedVia? http means the fast, lightweight route was used; browser means Threads was blocking plain requests and the Actor switched to a real headless browser for those inputs. The data is identical either way.

How do I rebuild a conversation tree? Every reply has parentPostId. Direct replies point to the post you scraped; nested replies point to the reply they answer.

Can I schedule it? Yes. Use Schedules in Apify Console (e.g. every morning), and combine with Make, n8n or a webhook to push new posts wherever you need them.

Limitations

  • Only public data. Private profiles, follower/following lists, likes lists and anything else that needs a login are out of scope.
  • Search returns Threads' top logged-out results only (see FAQ).
  • A profile's feed lists its own posts (including multi-part threads), not replies it made on other people's posts.
  • Threads changes its website often. If something breaks, we update the Actor, and you can report issues on the Issues tab.

This Actor collects only publicly available data that any logged-out visitor can see. It does not log in, bypass paywalls, or access private content. Scraping public data is generally lawful, but you are responsible for how you use it: comply with Threads'/Meta's Terms of Service, the GDPR, CCPA and other data-protection laws that apply to you, and don't use personal data for spam, harassment or any unlawful purpose. If you process personal data of EU residents, make sure you have a legal basis to do so. When in doubt, consult a lawyer. See also Apify's blog post Is web scraping legal?