Threads Scraper avatar

Threads Scraper

Pricing

$2.00 / 1,000 results

Go to Apify Store
Threads Scraper

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

Sourabh Kumar

Maintained by Community

Actor stats

0

Bookmarked

27

Total users

10

Monthly active users

21 days ago

Last modified

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.

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
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)🎵 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

  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.
  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 — 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
}
FieldTypeDefaultNotes
urlsstring[]["https://www.threads.com/@zuck"]Mix of URLs, @usernames, post URLs, 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.

Auto-detection rules

  • https://threads.com/@zuck → profile
  • @zuck or zuck (single ASCII handle ≤30 chars) → profile
  • 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 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

Fieldprofilepostssearchreply (parent)reply (child)
username
textnested
likeCountnested
repostCount / quoteCount / replyCountnested
shareCountnested
viewCount
hashtags / mentions / urlsnested
isPaidPartnership / isEdited / isPinned / hasAudionested
accessibilityCaptionnested
imageUrlsnested
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.

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.