Skip to content

Threads Scraper — Posts, Profiles & Search, No Login

Try for free

Threads scraper: scrape Meta Threads posts, replies, reposts, profiles, and keyword or hashtag search without a login. Threads data arrives as flat rows with engagement, media and links. Export it, run via API, schedule runs, or call it from an AI agent.

Threads Scraper turns Meta's Threads into clean rows without a login: keyword and hashtag search with language, engagement and date filters, an account's posts, replies and reposts as far back as you want, whole threads with their replies, profiles with follower count, bio links and contacts, and account discovery by keyword. Every post carries text, time, author, views, likes, replies, reposts, quotes, shares, media URLs, links, mentions, hashtags, the quoted or reposted post and the reply context. One post is billed once, error rows are free, there is no start fee — $2 per 1,000 posts, and the number of rows you asked for is the number you get.

One run of Threads Scraper: an account's posts with text, engagement and dates, no login.

Watch the demo: 633 Threads posts scraped in 55 seconds, no login

One run, start to finish: three accounts in, 633 rows out in 55 seconds for $1.27. Watch the 47-second demo.

Paste usernames, keywords or URLs, click Start, and download JSON, CSV or Excel — or pull the rows through the scrape.ly API into Google Sheets, n8n, Make, Zapier, a database or an AI agent.

Who this is not for

Said up front so you do not pay to find out:

  • Private accounts. They return a free error row, not data. Only what Threads shows a logged-out visitor is available.
  • Followers and following lists. Threads does not make them public, so we do not offer them — and do not guess them.
  • Posting, replying, liking or messaging. This reads Threads; it never writes to it and never touches your account.
  • Anything behind a login. No cookies, no account, no session of yours is used. That is why a run can never get your account restricted — and also why logged-in-only data is out of reach.

If what you need is a public account's posts or a public search, with engagement counts and dates — that is exactly what this is.

What is Threads Scraper?

Threads has an official API only for your own account. It reads the public pages Threads serves to any visitor, so it works for any public account and any public post, needs no account, no cookies and no proxy of your own, and can never get an account of yours blocked.

Seven modes, one row shape:

ModeYou giveYou get
Searchkeywords, #hashtagspublic posts from the top, recent and tag result pages, expanded across wordings and deduplicated, then filtered by keyword, language, likes, replies, views and date
Postsusernamesthe account's own posts, paged through the whole profile (hundreds or thousands), optionally within a date window
Repliesusernamesreplies the account wrote, each with the post it answered
Repostsusernamesposts the account reposted
Threadpost URLsthe post with its self-thread and its replies, each reply linked to the parent
Profileusernamesfollowers, full name, bio, bio links, e-mails and phones found in the bio, verification, latest post
Accountskeywordspeople and brands matching a keyword, optionally with full profile details

What data does Threads Scraper extract?

Post rows

FieldExample
id, code, url3977518562965884838 · Dcy_A8pGo-m · https://www.threads.net/@zuck/post/Dcy_A8pGo-m
text, language, languageGuess"Muse Spark 1.3 is rolling out today…" · en · en
createdAt, timestamp2026-09-02T19:26:23.000Z · 1788377183
username, userId, fullName, isVerified, profilePicUrl, profileUrlzuck · 63055343223 · Mark Zuckerberg · true · …
likeCount, replyCount, repostCount, quoteCount, shareCount, viewCount1453 · 196 · 148 · 28 · 78 · 160646
mediaType, imageUrl, videoUrl, images[], videos[], hasAudio, accessibilityCaptioncarousel · … · [{url,width,height,alt}] · [{url,thumbnail,hasAudio}]
hashtags, mentions, urls, linkPreview["ai"] · ["natgeo"] · ["https://…"] · {url, displayUrl, title, imageUrl, faviconUrl}
isReply, replyToUsername, replyToUserId, rootPostUsername, replyControltrue · zuck · 63055343223 · everyone
isQuote, quotedPost, isRepost, repostedPost, repostedBy{code, username, url, text, likeCount}
isPinned, isEdited, isPaidPartnership, isSpoiler, likesHidden, locationbooleans · place name
threadId, positionInThread, threadLengtha multi-post thread keeps its order
containsKeyword, searchVariant, query, sourcetrue · #aiagents · AI agents · search-top / search-recent / search-tag / posts / thread / reply / replies / reply-context / reposts
sourceUsername, parentPostId, parentPostUrlwhich input produced the row; the post a reply answers

Profile and account rows

username, userId, fullName, biography, bioLinks, websiteUrl, emails, phones (extracted from the bio), followerCount, isVerified, isPrivate, profilePicUrl (HD), profileUrl, instagramUrl, latestPostAt, latestPostUrl, latestPostText (Profile mode), query (Accounts mode).

Every row has type (post, profile, user or error) and scrapedAt. An account or post that cannot be read arrives as an error row with the reason — profile not found, post not found or unavailable, rate limit — never as a silently missing item, and never on the bill.

Every field Threads Scraper returns for a post: text, author, timestamps, likes, replies, reposts, quotes, shares, media type and URLs

How much does it cost to scrape Threads?

Pricing on scrape.ly: the event prices below are what this Actor charges. Platform usage (compute, proxy, browser) is billed on top at your plan rates.

Pay per row, no subscription, no start fee, no charge for errors:

RowPriceFor
Post$0.002 — 1,000 posts for $2every post row in every mode, replies included
Profile$0.004Profile mode, includeProfile, Accounts mode with details
Account match$0.002Accounts mode without details

There is no browser in this Actor, so platform usage is close to zero: an account's last 1,000 posts cost $2 and about 40 requests; 359 filtered search posts cost $0.72 and 55 seconds. Paid scrape.ly plans get 10–30 % off the row price.

Set Maximum items and a run can never cost more than that number × $0.002.

Bulk export: what 50,000 posts actually cost

This Actor is built for bulk jobs — put hundreds of inputs into one run, or call it from the API on a schedule. There is no fee per run and no fee per page: you pay for the rows you keep, and error rows are free. That is what decides the bill once you pull a whole market rather than a single account.

How to scrape Threads with Threads Scraper

  1. Pick a mode — Search for keywords and hashtags; Posts, Replies, Reposts or Profile for accounts; Thread for a post URL; Accounts to find people.
  2. Paste inputs — usernames (zuck, @natgeo or the profile URL), keywords (AI agents, #nba), or post URLs. Any Threads URL also works in Start URLs and is routed to the right mode.
  3. Set the cap — maxPosts per username or keyword, maxItems for the whole run. Both are exact.
  4. Add filters if you need them — languages, minimum likes / replies / views, a date window, strictKeywordMatch for search.
  5. Start. Rows appear in the dataset as they are collected; download them as JSON, CSV, Excel or HTML, or read them through the API.

Threads Scraper input form: mode, usernames, keywords, post URLs, filters and caps.

⬇️ Input

The last 200 posts of two accounts, with their profiles:

{
    "mode": "posts",
    "usernames": ["zuck", "natgeo"],
    "maxPosts": 200,
    "includeProfile": true
}

Brand monitoring done properly — English posts that actually mention the brand and have at least one like, several pages per keyword:

{
    "mode": "search",
    "keywords": ["Notion", "Obsidian app"],
    "maxPosts": 300,
    "strictKeywordMatch": true,
    "languages": ["en"],
    "minLikes": 1,
    "expandQueries": true
}

The same watch on a daily schedule, returning only what is new since the last run:

{
    "mode": "search",
    "keywords": ["AI agents"],
    "maxPosts": 300,
    "languages": ["en"],
    "strictKeywordMatch": true,
    "monitoringStoreName": "ai-agents-watch"
}

A post with its replies:

{
    "mode": "thread",
    "postUrls": ["https://www.threads.net/@zuck/post/Dcy_A8pGo-m"],
    "maxRepliesPerPost": 100
}

Posts from a quarter, about one topic:

{
    "mode": "posts",
    "usernames": ["zuck"],
    "postedAfter": "2026-06-01",
    "postedBefore": "2026-08-31",
    "filterKeywords": ["AI", "Llama"]
}

Find accounts and their contacts:

{
    "mode": "users",
    "keywords": ["coffee roaster brooklyn"],
    "maxUsersPerKeyword": 30,
    "includeProfileDetails": true
}

Every input field

FieldTypeWhat it does
modeposts · replies · reposts · profile · search · thread · usersWhich job to run
usernameslistAccounts for Posts, Replies, Reposts and Profile — bare name, with @, or profile URL
keywordslistWords or #hashtags for Search and Accounts
postUrlslistPost URLs for Thread mode (/post/…, /post/…/media and share links threads.com/share/… all work)
startUrlslistAny Threads URLs — profile, post, search or tag — routed automatically
maxPostsnumberCap per username or keyword
maxRepliesPerPostnumberThread mode: replies per post
searchTypestop · recent · tagsWhich result pages to combine
expandQueriesbooleanAlso search singular/plural, with and without the hash, and the joined hashtag form (default on)
postedAfter, postedBeforeYYYY-MM-DDDate window; Posts mode stops paging once it passes the older bound
filterKeywordslistKeep a post only when it contains any of these words
strictKeywordMatchbooleanSearch: keep only posts that contain the keyword (or every word of it)
languageslistISO codes: en, es, ja, zh, ko, ru… Threads' own label, else a guess from the script of the text
minLikes, minReplies, minViewsnumberEngagement floors
includeViewsbooleanView count on every post, read from the post's own page (default on; off = fastest bulk runs)
includeProfilebooleanPosts / Replies / Reposts: also save the account's profile row
includeProfileDetailsbooleanAccounts: open each profile for followers, bio links and contacts
maxUsersPerKeywordnumberAccounts mode cap
maxItemsnumberHard cap on rows for the whole run — your cost cap
monitoringStoreNametextName a watch; later runs with the same name return only posts never delivered before
concurrencynumberAccounts or keywords processed at once
proxyConfigurationproxyscrape.ly datacenter proxy by default; switch to Residential if you ever see rate-limit error rows

⬆️ Output

{
    "type": "post",
    "id": "3977518562965884838",
    "code": "Dcy_A8pGo-m",
    "url": "https://www.threads.net/@zuck/post/Dcy_A8pGo-m",
    "text": "Muse Spark 1.3 is rolling out today with frontier performance almost too cheap to meter…",
    "createdAt": "2026-09-02T19:26:23.000Z",
    "timestamp": 1788377183,
    "username": "zuck",
    "userId": "63055343223",
    "fullName": "Mark Zuckerberg",
    "isVerified": true,
    "likeCount": 1453,
    "replyCount": 196,
    "repostCount": 148,
    "quoteCount": 28,
    "shareCount": 78,
    "viewCount": 160646,
    "mediaType": "image",
    "imageUrl": "https://instagram.fdps8-1.fna.fbcdn.net/v/t51.82787-15/….webp",
    "images": [{ "url": "…", "width": 1080, "height": 970, "alt": null }],
    "videos": [],
    "hashtags": [],
    "mentions": [],
    "urls": [],
    "linkPreview": null,
    "language": "en",
    "languageGuess": "en",
    "isReply": false,
    "isQuote": false,
    "isRepost": false,
    "isPinned": false,
    "threadId": "3977518562965884838",
    "positionInThread": 0,
    "threadLength": 1,
    "source": "posts",
    "sourceUsername": "zuck",
    "scrapedAt": "2026-09-14T02:48:12.000Z"
}

A search row adds query ("AI agents"), searchVariant ("#aiagents"), containsKeyword (true) and source ("search-recent"). A reply from Thread mode adds parentPostId and parentPostUrl. A profile row:

{
    "type": "profile",
    "userId": "63055343223",
    "username": "zuck",
    "fullName": "Mark Zuckerberg",
    "biography": "…",
    "bioLinks": ["https://www.meta.com"],
    "emails": [],
    "phones": [],
    "followerCount": 7010000,
    "isVerified": true,
    "isPrivate": false,
    "profileUrl": "https://www.threads.net/@zuck",
    "instagramUrl": "https://www.instagram.com/zuck/",
    "latestPostAt": "2026-09-13T18:02:10.000Z",
    "latestPostUrl": "https://www.threads.net/@zuck/post/…"
}

Posts mode output: six posts from @zuck with like, reply, repost, quote and share counts, media type and post URL

The same posts as raw JSON — the exact shape an API client or AI agent receives

Search on Threads: what a visitor can see, and how the Actor gets more

Threads shows a logged-out visitor exactly one page of 20–25 posts per query and result type — no cursor, no "load more", no date operators (since:, until: and lang: return nothing; checked 14 September 2026). Scrapers that promise thousands of search results either log in with an account — which is how accounts get blocked — or quietly return the same page again.

What Threads does allow is asking in more ways: "AI agents", "AI agent", "aiagents" and "#aiagents" return almost disjoint sets. With Expand each keyword on, every keyword is searched as singular and plural, with and without the hash and as a joined hashtag, across the top, recent and tag pages, and the results are deduplicated by post id. Measured on 14 September 2026: two keywords went from 106 posts (one page each) to 359 unique posts. searchVariant tells you which wording found each post.

Phrases of several words. For most multi-word phrases — "web marketing jobs", "マーケ 転職", "кофе москва" — Threads shows a logged-out visitor an empty page, while each word alone fills one (checked 4 October 2026). When a phrase comes back empty, the Actor searches each of its words on its own and keeps only the posts that contain every word, so you get the posts that match the phrase instead of an empty run. searchVariant then shows the word that found the post. Fewer rows are possible this way than for a single word — shorter phrases or single keywords give more.

What it still cannot do: reach a specific week of last year for a keyword. For that, use Posts mode on the accounts that matter with a date window, or run a Monitoring watch from now on.

Search mode: eight posts for the keyword “ai agents” with engagement counts, media and the query that found them

Media view of a search run: image and video URLs extracted from Threads posts, ready to download

Monitoring mode: a clean feed of new posts

Name a watch in monitoringStoreName and schedule the run. The first run delivers everything it finds; every later run with the same name returns only posts never delivered before — the ids are remembered in a named key-value store on your account. In a test, a second run five minutes after the first returned 3 new posts and skipped 30 already delivered. Nothing is repeated, nothing is billed twice, and a daily run becomes a change feed you can push into Slack, a sheet or a CRM.

Replies mode: what an account answered, with the post it replied to

Reposts mode: what an account boosted, kept separate from its own posts

Use cases for Threads data

Brand and competitor monitoring

Each run is the list of new, relevant, engaged mentions — ready for a sentiment pass or a Slack digest.

Creator and influencer research

Posts mode on a list of creators gives their whole back catalogue with engagement per post; Profile mode adds follower counts and bio links. Sort by likeCount / followerCount to find the accounts whose audience actually reacts.

Lead generation

Accounts mode finds people and businesses by keyword; with includeProfileDetails each row carries bio links, e-mails and phones found in the bio, and the Instagram profile URL. Feed the domains into a contact scraper for the rest.

Trend and sentiment analysis

Hashtag search with expansion, languages for the market you care about, and the text, hashtags, likeCount and replyCount columns give a dataset an LLM can summarise; linkPreview shows which articles the network is sharing.

Reply and conversation analysis

Thread mode returns a post's replies with parentPostId, replyToUsername and positionInThread, so a conversation tree is one join away. Replies mode shows how an account talks to others.

AI agents and RAG

Every row is flat and carries url, userId and summary-ready text, and the Actor is available through the scrape.ly MCP server, so an agent can search a topic, read the posts and follow up on the authors in one conversation.

Profile mode: follower counts, verified badge, biography, website, contacts and latest post date for @zuck and @mosseri

Accounts mode: profiles found by the keyword “coffee roaster”, with followers, bio and contacts for influencer discovery

Integrations and Threads API

  • API — POST with the input JSON returns the rows directly; for longer runs start the run, wait for SUCCEEDED, then read datasets/{id}/items?format=csv`.
  • Python / JavaScript — scrapely-client: client.actor("freshowl21/threads-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().
  • Google Sheets — the scrape.ly Google Sheets integration or the CSV export link; the rows are flat, and the few nested fields (images, videos, quotedPost, linkPreview) arrive as JSON text.
  • n8n, Make, Zapier — use the scrape.ly node or app, pick this Actor, paste an input JSON from above, map the dataset items downstream. Set maxItems so a big watch never overflows a scenario.
  • Webhooks and schedules — an ACTOR.RUN.SUCCEEDED webhook posts the dataset link to Slack or your endpoint; scrape.ly Schedules run the same input hourly or daily, and with Monitoring mode every run is only the new posts.
  • MCP — connect the scrape.ly MCP server to Claude, Cursor or any MCP client and ask for Threads data in plain language; the input fields are described for agents.

🤖 For AI agents and LLM apps

The Actor is tool-friendly on purpose: every mode takes plain strings, every row is flat with a stable id and url, error rows say why, and caps are exact so an agent can budget. Typical agent calls:

  • "What has @zuck posted about AI in the last month?" → mode: posts, usernames: ["zuck"], postedAfter, filterKeywords: ["AI"].
  • "What are people saying about Notion this week, English only, ignore junk?" → mode: search, strictKeywordMatch, languages: ["en"], minLikes: 1.
  • "Who are the coffee roasters in Brooklyn on Threads and how do I reach them?" → mode: users, includeProfileDetails: true.
  • "Summarise the replies to this post." → mode: thread, postUrls.

Limitations, stated plainly

  • View counts are read from each post's own page — one extra request per post, but only the first ~20% of that page is downloaded (the part that holds the count), so it adds roughly a second per batch of posts rather than a full page each. Turn includeViews off for the fastest bulk runs. A post only seconds old has no view count yet; then viewCount is null, never a guess.
  • Search depth. One page per query and result type is what Threads serves a visitor; expansion multiplies it 3–4×, not 100×. See the Search section.
  • Replies per post. A post page shows the first ~25 replies to a visitor; maxRepliesPerPost above that returns what Threads shows.
  • Private accounts return an error row. Followers and following lists are not public and are not offered.
  • Rate limits. Threads throttles addresses that hammer it; the Actor rotates proxy sessions and retries, and a request that is still refused gets one more try through a residential proxy (DataImpulse, or the scrape.ly residential proxy billed at your plan rates when DataImpulse is unavailable). If Threads keeps refusing most of a run, the Actor pauses once, then stops instead of grinding: the targets it did not get to are listed in the NOT_ATTEMPTED record and in the status message (not charged — run them again later). Refused targets are free error rows, never pretended data.
  • An empty run explains itself. If nothing comes back, the status message says why: which of your filters removed the posts Threads returned (with counts), that a monitoring run found nothing new, or that Threads shows no posts for that account or search to a logged-out visitor. Empty runs cost nothing.

Data sent outside scrape.ly

To collect the data, this Actor sends requests through a residential proxy provider (DataImpulse) and, as a last resort, a backup unblocking proxy service, which receive the Threads page addresses being requested. Only what is needed for the request is sent; no scrape.ly credentials, account data or results are shared.

❓ FAQ

Do I need a Threads account, cookies or a login?

No. Nothing to paste, nothing to log into, and no account of yours can be blocked because none is used. Actors that ask for threadsCookies or run "our accounts" are the ones behind the "let my Threads account be blocked" reviews.

Does every post contain my keyword?

Threads pads keyword search with loosely related posts. This Actor marks every search row with containsKeyword, and strictKeywordMatch: true drops the rest before you pay for them.

Does search support Threads' Top and Recent sort?

Yes — searchTypes picks top, recent and tag pages; the source column says which page a post came from.

Can I get only English (or Japanese, Spanish…) posts?

languages: ["en"]. Threads labels only some posts with a language; for the rest the Actor reads the script of the text, and Latin-script posts count as en. languageGuess shows the value used.

Why did I get fewer search results than maxPosts?

Because Threads shows a visitor one page per query wording and result type. Turn on expandQueries (default), add related keywords (a phrase of several words usually yields fewer posts than its words searched separately — see the Search section), and use Monitoring mode on a schedule to accumulate over time.

Are results deduplicated? Will I be billed twice for one post?

Inside a run every post id is delivered once. Across runs, Monitoring mode remembers what was delivered and skips it. One post, one charge.

Can I filter by date?

postedAfter and postedBefore on every mode.

How many posts can I get from one account?

As many as the profile holds — Posts mode pages through the whole history, about 25 posts per request. If Threads rotates its pagination query, the Actor re-discovers it from the site's bundles automatically.

Are replyCount, repostCount and isReply real?

Yes — read from the same data the Threads page renders. replyToUserId, parentPostId and positionInThread let you rebuild a thread.

What happens with a username that doesn't exist?

A free error row: account not found. No charge for error rows.

Is it legal to scrape Threads?

The Actor reads only what Threads shows to any visitor without logging in — public posts and public profiles — and stores no private data. Scraping public data is generally lawful, but how you use it is your responsibility: respect Meta's terms where they apply to you, privacy law in your jurisdiction, and people's expectations; consult a lawyer for commercial use.

Can I use it with the scrape.ly API, Python, n8n or Make? Through an MCP server?

Yes to all — see Integrations. It follows the standard run → dataset flow, and it is listed for the scrape.ly MCP server and agentic payments.

//From the blog\\

Latest articles

All articles

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes.

No credit card. No setup calls.