Threads Scraper
Pricing
$2.00 / 1,000 results
Threads Scraper
Scrape Meta Threads profiles, posts, search results, and replies in one actor. HTTP-only, no login. $2 per 1,000 results.
Pricing
$2.00 / 1,000 results
Rating
0.0
(0)
Developer
Sourabh Kumar
Maintained by CommunityActor stats
0
Bookmarked
27
Total users
10
Monthly active users
21 days ago
Last modified
Categories
Share
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.
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.
| Concern | Meta's official API | Most Apify Threads scrapers | This actor |
|---|---|---|---|
| App registration / OAuth | Required | None | None |
| Search query cap | 500 per 7 days | None | None |
| Modes you get | Publishing + own analytics | One per actor (profile or posts or search) | All four — profile, posts, search, replies |
| Replies extraction | Only on your own posts | Often missing | Yes, on any public post |
| Per-run start fee | n/a | Common ($0.005 to $0.02) | None |
| Per 1,000 results | Free, 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) | 🎵 Audio / video flag | 📌 Pinned status | ✏️ Edited flag |
| #️⃣ Hashtags array | @️⃣ Mentions array | 🌐 URLs array | 🤝 Paid-partnership flag |
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 first ~15 to 27 server-rendered posts nested inside posts[]. 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. Lean by design — postCode, text, likeCount, postUrl, username, query. If you need rich engagement on search results, run search first, then pipe the post URLs into replies mode.
Replies mode
One record for the parent post (with viewCount populated for video posts) plus one record per server-rendered reply. Reply records are lean: text, likeCount, username, postedAt, postUrl. Threads serves only the first 5 to 15 replies anonymously.
How to scrape Threads: step by step
- Create a free Apify account. Takes 30 seconds, no card needed.
- Open Threads Scraper in the Apify Console.
- Paste any combination of
@usernames, profile URLs, post URLs, or search keywords into the URLs field. - Click Start. A profile or search run usually finishes in 5 to 10 seconds. A 50-result batch takes under a minute.
- 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 — 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/DV_RsjcEdYz","AI startups","#threads"],"maxResults": 50}
| Field | Type | Default | Notes |
|---|---|---|---|
urls | string[] | ["https://www.threads.com/@zuck"] | Mix of URLs, @usernames, post URLs, or search keywords. Mode is auto-detected per entry. |
mode | enum | (auto) | Override auto-detection. Values: profile, posts, search, replies. |
maxResults | integer | 50 | Total result cap across all entries. 0 = unlimited. |
Auto-detection rules
https://threads.com/@zuck→ profile@zuckorzuck(single ASCII handle ≤30 chars) → profilehttps://threads.com/@zuck/post/<code>→ repliesAI startups(multi-word, or word-with-spaces) → search#ai(leading#) → search- Empty input → defaults to
@zuckso 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 first ~15 to 27 server-rendered posts.
Pull engagement on a specific Threads post
{ "urls": ["https://www.threads.com/@nike/post/DV_RsjcEdYz"] }
Returns the parent post with viewCount, likeCount, share/repost/quote counts, plus the visible reply tree.
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 values pulled from a live run. Fields shown as null are genuinely null in that mode — they aren't omitted to save space.
Profile record (auto-detected from @username or profile URL)
{"type": "profile","username": "nike","fullName": "Nike","bio": "Just Do It.","followerCount": 14942853,"isVerified": true,"profilePicUrl": "https://instagram.fpat2-2.fna.fbcdn.net/v/...","posts": [{"postCode": "DW6egjCEZ2N","text": "8 Cities. 8 Stories.\n\nDrawn from deep-rooted history...","likeCount": 102,"repostCount": 10,"quoteCount": 1,"replyCount": 8,"shareCount": null,"viewCount": null,"postedAt": "2026-04-09T14:07:54.000Z","imageUrls": ["https://instagram.fpat2-2.fna.fbcdn.net/v/..."],"postUrl": "https://www.threads.com/@nike/post/DW6egjCEZ2N","hashtags": [],"mentions": [],"urls": ["http://Nike.com"],"isPaidPartnership": false,"isEdited": false,"isPinned": true,"hasAudio": false,"accessibilityCaption": "May be an image of batting and text..."}],"scrapedAt": "2026-04-28T08:48:00.000Z","url": "https://www.threads.com/@nike"}
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","username": "richeychang","postCode": "DXqHL4EAc9A","text": "AI好好玩","likeCount": 7,"postUrl": "https://www.threads.com/@richeychang/post/DXqHL4EAc9A","scrapedAt": "2026-04-28T08:48:00.000Z"}
Search records are intentionally lean. To enrich a search result, feed its postUrl back through the actor — the auto-detector will route it to replies mode and return full engagement fields plus viewCount.
Reply record (auto-detected from /post/<code> URL)
{"type": "reply","parentPostCode": "DV_RsjcEdYz","parentUsername": "nike","isParent": true,"username": "nike","text": "Mute the gallery. Introducing Nike Powerbeats Pro 2...","likeCount": 169,"viewCount": 18047,"postedAt": "2026-03-17T10:00:00.000Z","postUrl": "https://www.threads.com/@nike/post/DV_RsjcEdYz","scrapedAt": "2026-04-28T08:48:00.000Z"}
The parent record (isParent: true) carries viewCount for video posts. Reply records (isParent: false) have viewCount: null because Threads only exposes view counts on the parent.
Field availability by mode
| Field | profile | posts | search | reply (parent) | reply (child) |
|---|---|---|---|---|---|
username | ✅ | ✅ | ✅ | ✅ | ✅ |
text | nested | ✅ | ✅ | ✅ | ✅ |
likeCount | nested | ✅ | ✅ | ✅ | ✅ |
repostCount / quoteCount / replyCount | nested | ✅ | — | — | — |
shareCount | nested | ✅ | — | — | — |
viewCount | — | — | — | ✅ | — |
hashtags / mentions / urls | nested | ✅ | — | — | — |
isPaidPartnership / isEdited / isPinned / hasAudio | nested | ✅ | — | — | — |
accessibilityCaption | nested | ✅ | — | — | — |
imageUrls | nested | ✅ | — | — | — |
followerCount / bio / profilePicUrl | ✅ | — | — | — | — |
"nested" means the field appears inside the profile record's posts[] array, not at the top level.
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.
Is it legal to scrape Threads?
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.