Threads Scraper — Posts, Replies & Profiles, No Login avatar

Threads Scraper — Posts, Replies & Profiles, No Login

Pricing

from $4.00 / 1,000 post scrapeds

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

Threads Scraper — Posts, Replies & Profiles, No Login

Threads Scraper — extract posts, replies and profiles from threads.com with no login or cookies. Paste usernames or post URLs and get flat rows: text, like/reply/repost/quote counts, media, timestamps and author. Bulk-ready. JSON, CSV or Excel.

Pricing

from $4.00 / 1,000 post scrapeds

Rating

5.0

(1)

Developer

Muhamed Didovic

Muhamed Didovic

Maintained by Community

Actor stats

0

Bookmarked

38

Total users

15

Monthly active users

5 hours ago

Last modified

Share

Threads Scraper

Threads Scraper

Scrape Threads (threads.com) — profiles, user posts, replies, single post threads, keyword searches and hashtag feeds — without a login, cookies, or an account. Give it usernames, post URLs, keywords or hashtags and get back clean, flat rows: post text, like and reply counts, media, timestamps and author info. JSON, CSV or Excel.

Why use this scraper

  • No login, no cookies. Pure HTTP against Threads' public endpoints — nothing to configure, no session to babysit.
  • Whole-account in one run. Point it at any set of usernames and pull their posts or replies together.
  • Find posts without knowing the author. Search any keyword or hashtag and get matching posts from across Threads — brand monitoring and social listening, not just known handles.
  • Structured output. One row per post with a stable schema — ready for analysis, monitoring, or feeding an AI agent.
  • Post-level detail. Paste a Threads post URL to pull the post and its whole reply thread.
  • Filter by date. Set a publication window and posts outside it are dropped before they reach your dataset, so you are never charged for rows you asked not to receive.
  • It tells you when it fails. See below — this is the part that actually costs people money.

You are not billed for empty runs

A Threads endpoint does not break loudly. When Meta gates one, it answers with a well-formed, completely empty payload — so a scraper built on it keeps reporting success while returning nothing, and keeps charging for it. That is not hypothetical: it is the single most common complaint on competing Threads actors, up to and including public requests for refunds after a hundred-plus consecutive billed runs produced no data.

This actor treats that as a failure:

  • Every target returning nothing fails the run. You get a FAILED status and a message naming the cause, instead of a green run with an empty dataset.
  • Partial failures are reported. If 3 of 10 targets come back empty, the run still succeeds — you keep the rows you got — but the status message says 7/10 targets so a slowly rotting endpoint is visible long before it dies completely.
  • Date-filtered rows are never charged. Filtering happens before billing, and the run tells you how many posts the window excluded.
  • Your cost cap is honoured cleanly. At maxTotalChargeUsd the run stops and finishes normally with the rows you paid for, rather than overrunning into a killed run.
  • No padding. Threads' post pages embed a "more like this" carousel of unrelated posts. Those are excluded by design — they would inflate your dataset and your bill. Rows are also deduplicated by post ID.

Coming from another Threads scraper?

These are the things users most often ask for on other Threads actors. This actor already returns all of them:

What people ask for elsewhereField hereNotes
A stable numeric user IDuserIdPopulated on every row, not just some
Real reply / repost / quote countsreplyCount, repostCount, quoteCountActual values, not zeros
Reshare countsreshareCountWhere Threads exposes it
A working "is this a reply" flagisReplyVerified against Threads' own flag across live posts
A direct link to each posturlBuilt on every row
Top vs Recent search rankingsearchSortTypeBoth supported
Date / datetime filteringpostedAfter, postedBeforeApplied before billing
Sortable timestampspublishedAt, takenAtTimestampISO 8601 and epoch seconds

View counts are not available. Threads does not expose them to logged-out requests — the field simply is not in the response. Any actor that promises view counts without a logged-in session cannot be reading them from Threads. We would rather tell you that than ship a column of nulls.

What it does

InputModeYou get
UsernamesPostsEach user's Threads posts
UsernamesRepliesEach user's replies
UsernamesProfile infoFull name, follower count, bio, verification, profile picture
Post URLs(automatic)The post, plus its full reply thread unless you turn replies off
Search keywords(automatic)Posts mentioning each term, from any author
Hashtags(automatic)Posts under each tag

How it works

How the Threads Scraper works

You give it Threads usernames, post URLs, keywords or hashtags. For a user's posts and replies, the actor bootstraps a public guest token from Threads' own web app (no account, no cookies) and calls Threads' public GraphQL API over plain HTTP — the same endpoint the website uses. For post URLs, keyword searches and hashtag feeds it reads the server-rendered page directly, which needs no API token at all. Each target is normalized to a flat schema and streamed to your dataset. No browser, no third-party unblock service.

Input

FieldTypeDescription
usernamesarrayThreads handles, @handles, or profile URLs. Each is scraped per mode.
modeselectposts (default), replies, or profile. Applies to usernames only.
postUrlsarrayThreads post URLs (https://www.threads.com/@user/post/CODE). threads.net links work too.
includeRepliesbooleanFor post URLs: true (default) returns the post plus every reply in its conversation; false returns just the post you asked for. See the note below.
searchQueriesarrayKeywords or phrases to search for — returns matching posts from any author.
hashtagsarrayHashtag feeds to pull, with or without the leading #.
searchSortTypeselectFor keyword searches: top (default) or recent. Hashtag feeds are unaffected.
postedAfterstringKeep only posts published on or after this date. YYYY-MM-DD or a full ISO timestamp.
postedBeforestringKeep only posts published on or before this date. A bare YYYY-MM-DD includes the whole day.
maxItemsintegerMax total rows across all targets.
proxyobjectDatacenter (default) works and is fast; switch to Residential for very high volume.

How many rows will a post URL return? With includeReplies on (the default), one post URL returns the whole conversation — typically 5–30 rows, since active threads have many replies. If you only want the posts you pasted, set includeReplies to false and you'll get exactly one row per URL. Use maxItems as a hard ceiling either way.

Date filtering works on every input type — search, hashtags, profiles and post URLs alike. Posts Threads returns without a timestamp are kept rather than silently dropped, so a filtered run never quietly loses rows you can't account for. The run's status message reports how many posts the window excluded.

Example input

{
"usernames": ["zuck", "mosseri"],
"mode": "posts",
"maxItems": 100
}

Keyword and hashtag discovery, no handle needed:

{
"searchQueries": ["climate change"],
"hashtags": ["coffee"],
"searchSortType": "recent",
"maxItems": 200
}

Just the posts you pasted, one row each:

{
"postUrls": ["https://www.threads.com/@zuck/post/DakyAavlKLZ"],
"includeReplies": false
}

Output

Each post row includes:

FieldDescription
postId, code, urlPost identifiers + canonical Threads URL
username, userId, userFullName, userIsVerifiedAuthor
textPost text
publishedAt, takenAtTimestampISO timestamp + unix
likeCount, replyCount, repostCount, quoteCountEngagement — real counts, not placeholder zeros
reshareCountReshares. Threads populates this on some posts only, so expect nulls
isReply, replyToAuthorReply context
mediaCount, mediaUrlsAttached images/videos
linkPreviewUrlLink preview target, if any
hasAudioWhether attached video carries audio
scrapedFromModeWhich input produced the row: posts, replies, thread, search or hashtag
searchQueryThe keyword or #hashtag that matched — on discovery rows only

Rows from mode: "profile" are account records rather than posts, and carry username, userId, fullName, isVerified, followerCount, biography, profilePicUrl and profileUrl.

Sample output

{
"postId": "3937491905269768921",
"code": "DakyAavlKLZ",
"url": "https://www.threads.com/@zuck/post/DakyAavlKLZ",
"username": "zuck",
"userIsVerified": true,
"text": "Today we're releasing Muse Spark 1.1 ...",
"publishedAt": "2026-07-09T14:00:34.000Z",
"likeCount": 2767,
"replyCount": 412,
"repostCount": 88,
"quoteCount": 19,
"reshareCount": 7,
"isReply": false,
"mediaCount": 0,
"scrapedFromMode": "posts"
}

Posts published in a given window only:

{
"searchQueries": ["product launch"],
"postedAfter": "2026-08-01",
"postedBefore": "2026-08-14",
"maxItems": 500
}

Pricing

Pay-per-result — you only pay for what you get. See the Pricing tab on the actor page for current rates.

EventWhen you're charged
Actor startOnce per run (platform floor)
Post scrapedPer row returned in the output

FAQ

Do I need a Threads or Instagram account? No. It only reads what Threads serves publicly to logged-out visitors — no login, no cookies.

Can I scrape a single post and its replies? Yes — put its URL in postUrls. By default you get the post and every reply in its thread; set includeReplies to false for just the post itself.

Why did 20 post URLs return 200+ rows? Because each URL brings back its whole conversation. Threads posts often have dozens of replies. Set includeReplies to false for one row per URL, or cap the run with maxItems.

Can I find posts without knowing who wrote them? Yes — use searchQueries for keywords or hashtags for tag feeds. Neither needs a handle.

A post URL returned nothing. Why? The post was deleted, made private, or its author's account was removed. The run's status message reports how many targets came back empty. Threads also serves a gated version of some post pages to certain IPs, so the actor retries on a fresh address before concluding a post is gone.

Can I get view counts? No, and neither can any logged-out scraper. Threads does not include a view count in the data it serves to guests — the field is absent from the response, not zeroed. Every other engagement metric (likes, replies, reposts, quotes, reshares) is returned.

Can I filter by date? Yes — postedAfter and postedBefore accept YYYY-MM-DD or a full ISO timestamp, and work with every input type. Posts outside the window are dropped before billing, so they cost nothing.

I set a date range and got zero rows. Is it broken? Almost certainly not. The status message tells you how many posts were excluded by the window; if that number is large, widen the range. A genuinely broken endpoint fails the run instead of returning an empty dataset.

Which pricing model? Pay per result — you only pay for rows returned. See the Pricing tab.

Support

Found a bug or want a new field/mode? Open an issue on the actor's Issues tab.

🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the Apify MCP server or the Apify API (actor: memo23/threads-scraper).

Purpose: Scrape Threads (threads.com) — user posts, replies, profiles, single post threads, keyword searches, and hashtag feeds — with no login or cookies, returning flat post rows.

Minimal input:

{
"usernames": ["zuck"],
"mode": "posts",
"maxItems": 20
}

For keyword/hashtag discovery with no handle: { "searchQueries": ["climate change"], "hashtags": ["coffee"], "searchSortType": "recent", "maxItems": 20 }.

Output: one row per post with postId, code, url, username, userId, userFullName, userIsVerified, text, publishedAt, takenAtTimestamp, likeCount, replyCount, repostCount, quoteCount, reshareCount, isReply, replyToAuthor, mediaCount, mediaUrls[], linkPreviewUrl, hasAudio, scrapedFromMode, searchQuery. mode: "profile" rows are account records (username, userId, fullName, isVerified, followerCount, biography, profilePicUrl, profileUrl).

Behaviors an agent should know:

  • Always set maxItems. A post URL with includeReplies on (default) returns the whole conversation (typically 5–30 rows per URL); set includeReplies: false for one row per URL.
  • usernames are scraped per mode (posts/replies/profile); searchQueries and hashtags need no handle. searchSortType is top or recent.
  • Every target that returns nothing fails the run (guards against empty-but-billed runs); partial emptiness is reported in the status message.
  • postedAfter/postedBefore (YYYY-MM-DD or ISO) filter before billing, so excluded posts cost nothing.
  • View counts are not available to logged-out requests and are never returned.
  • Pay-per-result: charged once per run at actor start, then per post row returned; date-filtered and empty results are not charged.

⚠️ Disclaimer

This scraper only collects data that is publicly available on Threads without logging in. Use it in compliance with Threads' terms and applicable law (including data-protection rules such as GDPR). You are responsible for how you use the data.

SEO Keywords

threads scraper, scrape threads, threads.com scraper, threads.net scraper, threads api, scrape threads posts, threads post scraper, threads profile scraper, threads replies scraper, threads hashtag scraper, threads keyword search, threads social listening, brand monitoring threads, social media scraper, threads data export, threads content analysis, no-login threads scraper, Apify threads, threads json csv