Threads Scraper — Posts, Profiles, Replies & Hashtags avatar

Threads Scraper — Posts, Profiles, Replies & Hashtags

Pricing

$2.50 / 1,000 post scrapeds

Go to Apify Store
Threads Scraper — Posts, Profiles, Replies & Hashtags

Threads Scraper — Posts, Profiles, Replies & Hashtags

Scrape Threads posts, profiles, reply threads, search results and hashtags. Browserless, no login, and you only pay for rows actually delivered.

Pricing

$2.50 / 1,000 post scrapeds

Rating

0.0

(0)

Developer

Ace

Ace

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

Scrape Threads (threads.com) without a browser and without logging in.

Give it a keyword, a #hashtag, an @username, or any Threads URL. Get back flat rows ready for a spreadsheet, a dashboard, or an LLM pipeline.


Why this one

Threads scrapers break in two boring ways: they don't recognise the URL you gave them, and they die the moment Meta reshuffles the page. This one is built against both.

This actorTypical Threads scraper
How it finds dataWalks the page's own JSON for any thread_items nodeHard-coded path into a Relay wrapper Meta reshuffles at will
URL shapes understoodprofile, /replies, /media, /@user/post/CODE, /t/CODE, threads.net, ?si= tracking linksOften just the plain profile URL
Stable numeric author IDauthorId on every rowUsually username only — which breaks when someone renames
One bad targetSkipped, with the reason; the rest still runWhole run fails
What you pay forOnly rows actually deliveredOften a start fee regardless of output

If a run returns nothing, it costs you nothing. There is no actor-start charge.


What you get

Real, unedited rows from this input:

{ "queries": ["@zuck", "#buildinpublic"], "profileTabs": ["posts", "replies", "media"], "maxItems": 25 }

25 rows in one run: 1 profile + 24 unique posts, zero duplicates across the three tabs.

A post

{
"recordType": "post",
"code": "DVrwsE5EdSz",
"url": "https://www.threads.com/@zuck/post/DVrwsE5EdSz",
"text": "Meanwhile at Meta HQ",
"authorUsername": "zuck",
"authorId": "63055343223",
"authorFullName": "Mark Zuckerberg",
"authorIsVerified": true,
"publishedAt": "2026-03-10T00:26:46.000Z",
"likeCount": 7581,
"replyCount": 1192,
"repostCount": 232,
"quoteCount": 56,
"isReply": false,
"mediaType": "image",
"mediaCount": 1,
"media": [{ "type": "image", "url": "https://instagram.fcdg4-1.fna.fbcdn.net/v/t51.82787-15/...", "width": 1080, "height": 1350 }],
"hashtags": [],
"sourceType": "profile",
"sourceUrl": "https://www.threads.com/@zuck"
}

authorId is the account's stable numeric ID. Usernames get changed; this doesn't. Use it as your join key.

A profile row

{
"recordType": "profile",
"authorUsername": "zuck",
"authorId": "63055343223",
"authorFullName": "Mark Zuckerberg",
"authorIsVerified": true,
"followerCount": 5721349,
"biography": "Mostly superintelligence and MMA takes",
"bioLinks": [],
"url": "https://www.threads.com/@zuck"
}

Input

FieldTypeNotes
queriesarrayRequired. Keywords, #hashtags, @usernames, or Threads URLs — mixed freely.
profileTabsarrayWhich profile tabs to pull: posts, replies, media. More tabs = more posts.
expandThreadsbooleanAlso open every post that has replies and scrape the conversation. Highest yield, highest cost.
maxItemsintegerHard cap on delivered rows — your spend ceiling. 0 = no limit.
minLikes / minRepliesintegerDrop low-engagement posts. Filtered posts are not billed.
onlyVerifiedbooleanVerified authors only.
excludeRepliesbooleanTop-level posts only.
mustHaveMediabooleanOnly posts carrying an image or video.
postedAfter / postedBeforestringYYYY-MM-DD date window.
includeProfileInfobooleanEmit the extra profile row shown above.
proxyConfigurationobjectResidential strongly recommended.

Every URL shape works

@zuck https://www.threads.net/@zuck
https://www.threads.com/@zuck https://www.threads.com/@zuck/replies
https://www.threads.com/@zuck/media https://www.threads.com/@zuck/post/CODE
https://www.threads.com/t/CODE https://www.threads.com/@zuck/post/CODE?si=xyz
#buildinpublic ai agents

How much data you actually get — read this

Threads shows a limited number of posts to logged-out visitors, and this actor does not log in. Measured yield per page fetch:

InputPosts per fetch
A post URL (post + its reply thread)~31
Keyword search~20
Hashtag~18
Profile /replies tab~8
Profile /media tab~6
Profile main tab~4

So a profile returns its most recent posts, not its full history. Scraping all three profile tabs is the way to widen that — measured ~18 unique posts for @zuck across three tabs versus 4 from the main tab alone — and expandThreads multiplies it further by pulling each post's replies.

If you need a complete profile archive going back months, this actor will not give you that, and no amount of retrying will change it. That is a Threads limit, not a bug, and it is stated here rather than discovered after you have paid.


Cost

You are billed per delivered row, so the row count is the price. Rows removed by your filters, duplicates, and failed pages are all free.

JobRowsCost
One profile, all three tabs~18~$0.05
One keyword search~20~$0.06
One post + full reply thread~31~$0.09
10 hashtags~180~$0.54

Set maxItems to cap any run. It is a hard ceiling.


Honest limitations

  • No full profile history. See the table above. Deeper paging sits behind Threads' internal API and is deliberately not attempted.
  • language is almost always empty. Threads does not populate detected_language for logged-out requests, so there is deliberately no language filter in the input — a filter that silently keeps everything is worse than no filter at all.
  • Private and non-existent accounts return nothing. You get an explicit does not exist or has no public content message, and you are not charged.
  • Threads rate-limits. Each retry rotates to a fresh proxy session and re-establishes cookies, which is what actually clears a block — a fresh IP alone gets challenged again. If everything is blocked the run fails and bills nothing.
  • A post with no replies yields one row. expandThreads only helps where conversation exists.

Use it for

  • Brand & competitor monitoring — watch a hashtag or keyword on a schedule.
  • Creator research — recent posts, engagement counts, and verified status per account.
  • Conversation mining — pull a viral post's full reply thread for sentiment or support signals.
  • LLM pipelines — flat rows, no HTML, stable numeric IDs to join on.

Scheduling

Point the Apify Scheduler at this actor with a handful of keywords and postedAfter set to yesterday to build your own Threads history over time. Because you only pay per delivered row and duplicates are removed within each run, a daily watch stays cheap.