Threads Scraper: Profiles, Posts, Search, Replies avatar

Threads Scraper: Profiles, Posts, Search, Replies

Pricing

$2.00 / 1,000 results

Go to Apify Store
Threads Scraper: Profiles, Posts, Search, Replies

Threads Scraper: Profiles, Posts, Search, Replies

Scrape Meta Threads profiles, posts, keyword search results, and post replies in one actor. Paste a username, a profile URL, a post URL, or a keyword and the mode is detected for you. No login, no OAuth, no app review.

Pricing

$2.00 / 1,000 results

Rating

0.0

(0)

Developer

Sourabh Kumar

Sourabh Kumar

Maintained by Community

Actor stats

2

Bookmarked

197

Total users

62

Monthly active users

2 days ago

Last modified

Share

Meta Threads scraper: profiles, posts, keyword search and replies, no login

Scrape Meta Threads profiles, posts, search results, and replies, in one actor, with one input field, no login, no app review. Mode is auto-detected from whatever you paste.

$2 per 1,000 results. No per-run fee, no monthly minimum, no subscription.

Works for any public account on threads.com worldwide. Posts in any language come back unchanged: the actor doesn't translate or strip non-Latin scripts.

Replies go deep. A post page shows only a handful of replies; switch on Get all replies and the actor pages through the rest, over 1,300 on a busy post.

Why this scraper, vs. Meta's official API or other actors

Meta's Threads API is real and free. It is also capped at 500 keyword search queries per rolling 7-day window, requires OAuth + app review, and only exposes most analytics on the developer's own posts. That's enough for first-party publishing. It's not enough for monitoring competitors, scraping a competitor's profile, or backfilling historical posts.

The Apify alternatives split this into pieces. Profile here. Post-only there. Replies somewhere else. You stitch four scrapers together to do one job.

ConcernMeta's official APIMost Apify Threads scrapersThis actor
App registration / OAuthRequiredNoneNone
Search query cap500 per 7 daysNoneNone
Modes you getPublishing + own analyticsOne per actor (profile or posts or search)All four: profile, posts, search, replies
Replies extractionOnly on your own postsOften missingYes, on any public post
Reply depthn/aWhatever the page embedsWhatever the page embeds, or every reply with one checkbox
Per-run start feen/aCommon ($0.005 to $0.02)None
Per 1,000 resultsFree, but capped$2.50 to $20$2.00

What data can you extract?

πŸ‘€ Username, full name, bioβœ… Verified flag, follower countπŸ–ΌοΈ Profile picture (HD)πŸ”— Bio links
πŸ“ Post text + post code❀️ Like, repost, quote, reply count↗️ Share count (reshare_count)πŸ‘οΈ View count (replies mode)
πŸ“· Image URLs (single + carousel)🎬 Video URLs (direct MP4)πŸ“Œ Pinned status✏️ Edited flag
🏷️ Topic tag@️⃣ Mentions array🌐 URLs array🀝 Paid-partnership flag
πŸ”— Link preview card↩️ Reply linkage (who a post replies to)πŸ†” Stable user IDπŸ“ Media dimensions
🎞️ Inline Giphy stickers (replies)πŸ™‹ Reply author name, ID, verified flagπŸ–ΌοΈ Reply author avatarπŸ’¬ Every reply on a post, not just the first few

The actor extracts everything Threads serves to a logged-out browser. It does not extract likers lists, follower lists, or per-post analytics. Those live behind login.

Profile mode

A single record per username, with the user's most recent posts nested inside posts[] (measured 15 to 28 across accounts). Each nested post carries the full set of engagement fields plus hashtags, mentions, URLs, paid-partnership flag, and accessibility caption.

Posts mode

The same fetch as profile mode, but emits one flat record per post. Use this when you want a tabular dataset of posts without the profile wrapper.

Search mode

One record per matching post, with the same full field set as posts mode: engagement counts, media, link preview, hashtags, mentions and reply linkage. No second run needed to get engagement on search results.

Replies mode

One record for the parent post (the only place viewCount is populated) plus one record per reply, each carrying the full post field set.

A post page carries only a slice of its replies, sometimes none at all: a Nike post with 166 replies served 12, and a Zuckerberg post with 1,745 served 9. Turn on Get all replies to page through the rest. The same Zuckerberg post then returned 1,369 rows. Every reply is a charged result, so set Max Results to the number you actually want first.

How to scrape Threads: step by step

  1. Create a free Apify account. Takes 30 seconds, no card needed.
  2. Open Threads Scraper in the Apify Console.
  3. Paste any combination of @usernames, profile URLs, post URLs, or search keywords into the URLs field.
  4. Click Start. A profile or search run usually finishes in 5 to 10 seconds. A 50-result batch takes under a minute. Paging through every reply on a busy post takes longer: 1,369 replies took just under three minutes.
  5. Export as JSON, CSV, or Excel, or fetch via the Apify API.

How much does Threads Scraper cost?

Pay-per-result pricing.

  • Per 1,000 results: $2.00
  • Free-plan yield (Apify's $5/month credits): roughly 2,500 results.
  • Starter-plan yield ($29/month): about 14,500 results per month.
  • No per-run fee. No subscription lock-in.

Threads is HTTP-only, with no headless browser, so compute on top of the result fee is negligible.

Input

Paste anything. The actor figures out the mode.

{
"urls": [
"@zuck",
"https://www.threads.com/@nike",
"https://www.threads.com/@nike/post/DZK3sb4CTp4",
"AI startups",
"#threads"
],
"maxResults": 50
}
FieldTypeDefaultNotes
urlsstring[]["https://www.threads.com/@zuck"]Mix of profile URLs, @usernames, post URLs, profile /replies and /media tabs, or search keywords. Mode is auto-detected per entry.
modeenum(auto)Override auto-detection. Values: profile, posts, search, replies.
maxResultsinteger50Total result cap across all entries. 0 = unlimited.
fetchAllRepliesbooleanfalseReplies mode only. Page past the handful of replies the post page carries. Ignored by the other modes.

Auto-detection rules

  • https://threads.com/@zuck β†’ profile
  • @zuck (leading @ required, ASCII handle ≀30 chars) β†’ profile
  • https://threads.com/@zuck/replies or /media β†’ that tab's posts
  • https://threads.com/@zuck/post/<code> β†’ replies
  • AI startups (multi-word, or word-with-spaces) β†’ search
  • #ai (leading #) β†’ search
  • Empty input β†’ defaults to @zuck so the daily Apify health check passes

Share-link tracking parameters (?ref=share, ?fbclid=..., ?utm_source=...) and URL fragments (#section) are stripped before parsing, so social-media share links work as-is.

Recipes (ready-to-paste)

Get a Threads profile and its latest posts

{ "urls": ["@zuck"], "maxResults": 1 }

Returns one profile record with posts[] containing the user's most recent posts (15 to 28 in testing).

Pull engagement on a specific Threads post

{ "urls": ["https://www.threads.com/@nike/post/DZK3sb4CTp4"] }

Returns the parent post with viewCount, likeCount, share/repost/quote counts, plus the replies the post page carries.

Get every reply on a post, not just the first few

{
"urls": ["https://www.threads.com/@nike/post/DZK3sb4CTp4"],
"fetchAllReplies": true,
"maxResults": 500
}

Pages through the full reply list. Each reply is a charged result, so maxResults is what keeps the bill predictable.

Search Threads by hashtag or keyword

{ "urls": ["#ai", "AI startups", "Apify"], "maxResults": 100 }

Each entry runs as a separate search and contributes up to its share of maxResults.

Bulk-scrape multiple profiles in one run

{ "urls": ["@zuck", "@instagram", "@nike", "@apple"], "maxResults": 0 }

maxResults: 0 removes the cap. Apify's run-level memory limit still applies.

Force posts-only output (skip the profile wrapper)

{ "urls": ["@nike"], "mode": "posts", "maxResults": 20 }

Output

Real records copied verbatim from live runs, with every field the mode returns. Long CDN URLs are shortened at the ? and long captions trimmed, for readability. A null is genuinely null in that mode, never a field dropped to save space.

Profile record (auto-detected from @username or profile URL)

{
"type": "profile",
"username": "nike",
"fullName": "Nike",
"bio": "Just Do It.",
"followerCount": 15062042,
"isVerified": true,
"profilePicUrl": "https://scontent-iad3-1.cdninstagram.com/v/t51.2885-19/467733497_2299328197118830_1129133478722126916_n.jpg?...",
"posts": [
{
"postCode": "DZK3sb4CTp4",
"text": "It was all going to plan until instincts took over…\n\nRip The Script",
"likeCount": 5056,
"repostCount": 759,
"quoteCount": 155,
"replyCount": 166,
"shareCount": 857,
"viewCount": null,
"postedAt": "2026-06-04T16:01:05.000Z",
"imageUrls": [
"https://scontent-iad3-2.cdninstagram.com/v/t51.71878-15/714829427_1335946211969604_1567779204079698726_n.jpg?..."
],
"postUrl": "https://www.threads.com/@nike/post/DZK3sb4CTp4",
"hashtags": [],
"mentions": [],
"urls": [],
"isPaidPartnership": false,
"isEdited": false,
"isPinned": true,
"hasAudio": true,
"accessibilityCaption": null,
"videoUrls": [
"https://scontent-iad6-1.cdninstagram.com/o1/v/t16/f2/m84/AQNcfV9lDUqaZZYl7p4voBUDHRzAF5pEbFa8YPDe153PPZvd43jHtok0VCiTLAv0eHW_vJDMhxHwp83Pm9_iBVLFhNQPqhM3m0W6FD4.mp4?..."
],
"linkPreview": null,
"isReply": false,
"replyToUsername": null,
"rootPostUsername": null,
"topicTag": null,
"mediaWidth": 1916,
"mediaHeight": 1080
}
],
"scrapedAt": "2026-09-17T22:03:23.288Z",
"url": "https://www.threads.com/@nike",
"userId": "63454848350",
"isPrivate": false,
"bioLinks": [
{
"url": "https://empli.fi/nike/",
"title": null
}
],
"profileTags": []
}

Post record (mode: "posts")

Same shape as a single entry inside profile.posts[], plus type: "post", username, and scrapedAt at the top level.

Search record (mode: "search" or auto-detected)

{
"type": "search",
"query": "AI startups",
"username": "yujjin_solo",
"postCode": "DbS_fXBDRRu",
"text": "Building an AI startup and currently looking for a technical co-founde",
"likeCount": 60,
"postUrl": "https://www.threads.com/@yujjin_solo/post/DbS_fXBDRRu",
"scrapedAt": "2026-08-18T10:23:06.170Z",
"repostCount": 0,
"quoteCount": 0,
"replyCount": 41,
"shareCount": 2,
"viewCount": null,
"postedAt": "2026-07-27T12:43:27.000Z",
"imageUrls": [],
"hashtags": [],
"mentions": [],
"urls": [],
"isPaidPartnership": false,
"isEdited": false,
"isPinned": false,
"hasAudio": false,
"accessibilityCaption": null,
"videoUrls": [],
"linkPreview": null,
"isReply": false,
"replyToUsername": null,
"rootPostUsername": null,
"topicTag": "startup",
"mediaWidth": 612,
"mediaHeight": 612
}

Search records carry the same field set as posts mode, so there is no need to re-run a result to get its engagement. viewCount is the one exception: it is only available when you scrape a post URL directly.

Reply record (auto-detected from /post/<code> URL)

One reply row, copied verbatim from a live run. Long CDN URLs are shortened at the ? for readability; everything else is exactly as returned.

{
"type": "reply",
"parentPostCode": "DZK3sb4CTp4",
"parentUsername": "nike",
"isParent": false,
"username": "shahrulimran",
"text": "It's probably inspired by mmbape performance in last world cup final",
"likeCount": 9,
"viewCount": null,
"postedAt": "2026-06-04T16:06:51.000Z",
"postUrl": "https://www.threads.com/@shahrulimran/post/DZK4osRktnS",
"scrapedAt": "2026-09-17T22:04:41.386Z",
"postCode": "DZK4osRktnS",
"repostCount": 0,
"quoteCount": 0,
"replyCount": 0,
"shareCount": null,
"imageUrls": [],
"hashtags": [],
"mentions": [],
"urls": [],
"isPaidPartnership": false,
"isEdited": false,
"isPinned": false,
"hasAudio": false,
"accessibilityCaption": null,
"videoUrls": [],
"linkPreview": null,
"isReply": true,
"replyToUsername": "nike",
"rootPostUsername": "nike",
"topicTag": null,
"mediaWidth": 612,
"mediaHeight": 612,
"authorId": "63409532793",
"authorFullName": "Shahrul Imran",
"authorIsVerified": false,
"authorProfilePicUrl": "https://scontent-iad6-1.cdninstagram.com/v/t51.2885-19/358171575_722333822996960_3782904781944252552_n.jpg?...",
"stickerUrls": []
}

The parent record (isParent: true) is the only row that carries viewCount, on text and video posts alike. Reply rows have viewCount: null, because Threads publishes a view count on the post you requested and not on each reply beneath it.

stickerUrls holds inline Giphy stickers, which Threads attaches as part of the text rather than as post media, so they appear in no other field. Most replies have none.

Field availability by mode

Fieldprofilepostssearchreply (parent)reply (child)
usernameβœ…βœ…βœ…βœ…βœ…
textnestedβœ…βœ…βœ…βœ…
likeCountnestedβœ…βœ…βœ…βœ…
repostCount / quoteCount / replyCountnestedβœ…βœ…βœ…βœ…
shareCountnestedβœ…βœ…βœ…βœ…
viewCount---βœ…-
hashtags / mentions / urlsnestedβœ…βœ…βœ…βœ…
linkPreviewnestedβœ…βœ…βœ…βœ…
topicTagnestedβœ…βœ…βœ…βœ…
isReply / replyToUsername / rootPostUsernamenestedβœ…βœ…βœ…βœ…
isPaidPartnership / isEdited / isPinned / hasAudionestedβœ…βœ…βœ…βœ…
accessibilityCaptionnestedβœ…βœ…βœ…βœ…
imageUrls / videoUrlsnestedβœ…βœ…βœ…βœ…
mediaWidth / mediaHeightnestedβœ…βœ…βœ…βœ…
authorId / authorFullName / authorIsVerified / authorProfilePicUrl---βœ…βœ…
stickerUrls---βœ…βœ…
followerCount / bio / profilePicUrlβœ…----
userId / isPrivate / bioLinks / profileTagsβœ…----

"nested" means the field appears inside the profile record's posts[] array, not at the top level.

A note on hashtags. Threads has largely moved away from inline #hashtags. Across 1,369 replies on one post, 3 captions contained a #. Threads groups posts under a single topic tag instead, which is what topicTag gives you. An empty hashtags array is almost always the truth about the post, not a gap in the data.

FAQ

How much does Threads Scraper cost?

Threads Scraper uses pay-per-result pricing. You pay $2 for 1,000 results. The Apify Free plan gives you $5 in usage credits a month, enough for around 2,500 results. If you run regularly, the $29/month Starter plan covers about 14,500 results.

No subscription lock-in. Pause whenever.

Scraping public data is generally allowed in the US and most of the EU, as long as you don't collect personal data covered by GDPR or CCPA without a lawful basis. This actor only touches publicly accessible pages: anything you'd see in a browser without logging in. How you use the output is on you.

Apify's full breakdown: Is web scraping legal?.

Can I integrate Threads Scraper with other tools?

Push results into Make, Zapier, Slack, Airbyte, GitHub, Google Sheets, Google Drive, and more. Apify treats every actor as a webhook source, so anything that consumes webhooks or pulls from an API works.

Full list: Apify integrations.

Can I use Threads Scraper with the Apify API?

Yes. Every run is available via the Apify REST API:

curl -X POST "https://api.apify.com/v2/acts/sourabhbgp~threads-scraper/runs?token=APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"urls": ["@zuck"], "maxResults": 1}'

Docs: Apify API reference.

Can I use Threads Scraper through an MCP Server?

Yes. Apify ships an MCP server that exposes every actor as a tool, so Claude Desktop, Cursor, and any other MCP-capable client can call Threads Scraper directly. Setup: Apify MCP docs.

Your feedback

Bug, missing field, or odd behavior? Drop a note in the Issues tab. Reports go to a human and fixes usually ship the same week.