Threads Scraper avatar

Threads Scraper

Pricing

$1.99 / 1,000 post scrapeds

Go to Apify Store
Threads Scraper

Threads Scraper

Threads scraper with no login. Search any keyword or extract a profile's posts, replies, reposts and media. Returns text, author, engagement counts, timestamps and media URLs. Export JSON, CSV or Excel. Only-new mode for scheduled monitoring. $1.99 per 1,000 posts.

Pricing

$1.99 / 1,000 post scrapeds

Rating

0.0

(0)

Developer

Quiet Harvest

Quiet Harvest

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Share

Threads Scraper — Keyword Monitor & Profile History | $1.99 / 1K posts | No Login

Scrape Meta Threads (threads.com) without logging in. No cookies, no account pool, no session to get banned — this Actor reads only public pages.

$1.99 per 1,000 posts returned. Platform usage included — no second bill for compute or proxy.


What you can do with it

Six modes, one Actor:

#ModeWhat you get
1Keyword / hashtag searchThe freshest public posts for each keyword, on a schedule, with only-new filtering
2Profile historyAn account's posts paginated back through time, months deep
3RepliesThe replies that account wrote
4RepostsWhat that account reposted
5MediaThat account's posts that carry an image or video
6Find accountsWho is talking about your keyword, ranked by matching posts and engagement

Mix any of them in a single run. Every item is tagged so you can split them downstream.

  • Brand and mention monitoring — catch posts about your product minutes after they go live
  • Social listening and PR — spot a complaint or a viral thread early
  • Competitor analysis — pull a rival's full post history with engagement numbers
  • Lead and creator discovery — collect authors who post about your niche
  • AI agents and RAG — clean, structured, timestamped text ready to embed
  • Trend research — gather a topic or hashtag over weeks and analyse it downstream

Why this one

Most Threads scrapers need a logged-in session or a pool of burner accounts. That is where they break: accounts get flagged, sessions expire, and your scheduled run fails at 3am.

This ActorTypical Threads scraper
Login requiredNoYes — session or account pool
Ban / rate-limit riskNone — no credential existsAccounts get flagged
Only-new mode for schedulesBuilt inUsually dedupe it yourself
Keyword monitoringYes, recent sortOften relevance only
Full profile historyYes, months backOften first page only
Platform usage costIncluded in the priceSometimes billed on top

Choose your workflow

Mode 1 — Monitor keywords, hashtags and brand names

Fill in keywords. Each keyword is searched in each mode you list under modes.

{
"keywords": ["your brand", "competitor brand"],
"modes": ["recent"],
"onlyNew": true
}

recent returns the newest public posts, which is what you want for monitoring — posts show up seconds after they are published. Put this on a schedule and every run hands you only what appeared since last time.

Mode 2 — Scrape the full public history of a profile

Fill in usernames. The Actor pages backwards through the profile until it hits your cap.

{
"usernames": ["nike", "adidas"],
"maxPostsPerProfile": 300,
"onlyNew": false
}

Set onlyNew to false for a one-off history pull, otherwise a second run will look empty — that is the dedupe doing its job.

Mode 3, 4, 5 — Replies, reposts and media

Add profileTabs alongside usernames to pull an account's other tabs.

{
"usernames": ["nike"],
"profileTabs": ["replies", "reposts", "media"]
}

Each item is tagged with _mode = replies, reposts or media.

Two things worth knowing up front:

  • These tabs return one page (typically 5 to 20 items). That is a Threads limit for anonymous access — those tabs hand out no pagination cursor at all. The main posts tab is unaffected and still goes back months.
  • An empty tab is normal, not an error. Plenty of brand accounts never repost, and many never reply publicly. The Actor reports what is actually there rather than inventing results.

Mode 6 — Find the accounts talking about your keyword

Turn on findAccounts with your keywords.

{
"keywords": ["korean skincare"],
"modes": ["recent", "top"],
"findAccounts": true
}

You get account records (_source = account) alongside the posts, ranked by how many matching posts each author has and their total engagement — a ready-made shortlist of creators and prospects in your niche.

These account records are not charged separately. They are aggregated from posts you already paid for.

Everything in one run

{
"keywords": ["running shoes"],
"usernames": ["nike"],
"profileTabs": ["replies", "media"],
"modes": ["recent", "top"],
"findAccounts": true,
"maxPostsPerProfile": 100
}

Every item carries _source (search, profile or account) and _mode so you can split them downstream.


Ready-made examples

Brand monitoring, every 15 minutes

{
"keywords": ["acme corp", "acmecorp", "#acme"],
"modes": ["recent"],
"onlyNew": true,
"maxAgeHours": 24
}

Competitor back-catalogue, one-off

{
"usernames": ["competitor_handle"],
"maxPostsPerProfile": 1000,
"onlyNew": false
}

Hashtag campaign tracking

{
"keywords": ["#summersale2026"],
"modes": ["tags", "recent"],
"onlyNew": true
}

Topic research, widest net

{
"keywords": ["electric vehicle", "EV charging"],
"modes": ["recent", "top", "tags"],
"onlyNew": false
}

Creator discovery in a niche

{
"keywords": ["skincare routine", "korean skincare"],
"modes": ["top"],
"onlyNew": true
}

Feed an AI agent fresh posts on demand

{
"keywords": ["the topic your agent is asking about"],
"modes": ["recent"],
"onlyNew": false,
"maxAgeHours": 6
}


Working in more than one language

Most keywords are used by people writing in several languages at once, and Threads mixes them together. Two controls handle that.

On the way in — searchLanguage. Pick the language your results should lean towards. Threads decides this from the request's language preference, so this is a genuine bias on the result set, not a post-hoc filter:

{
"keywords": ["skincare"],
"searchLanguage": "ko",
"modes": ["recent"]
}

Nineteen options: English, Traditional and Simplified Chinese, Japanese, Korean, Thai, Vietnamese, Indonesian, Malay, Filipino, Spanish, Portuguese, French, German, Italian, Arabic, Russian, Turkish, Hindi. It is a preference — a keyword only one language uses will return that language whichever option you pick.

On the way out — language. Every post carries the language its text was written in, so you can route, filter or alert per language downstream:

korean = [p for p in items if p["language"] == "ko"]

How the detection works, and where it stops. Scripts that are unambiguous — Hangul, kana, Thai, Arabic, Hebrew, Cyrillic, Devanagari, Greek — are read directly from the characters, which makes them reliable. Vietnamese is identified by its diacritics. The remaining Latin-script languages (English, Spanish, Portuguese, French, German, Italian, Indonesian, Malay, Filipino, Turkish) are scored on common function words.

Two honest limits:

  • A post with too little text returns null. One word, a bare URL or only emoji cannot be classified, and a guess would be worse than a blank.
  • Malay and Indonesian share most of their function words. When a post uses only words common to both, it is reported as id. Posts carrying a marker specific to one of them (tak, boleh, sis for Malay; gak, banget, bisa for Indonesian) are separated correctly.
  • Japanese written entirely in kanji, with no kana, is reported as zh. Those characters are genuinely shared between the two languages; nothing in the text distinguishes them.

Input reference

FieldTypeDefaultWhat it does
keywordsarrayKeywords or hashtags to search. Each returns up to about 20 posts per mode.
usernamesarrayAccounts to scrape in full, with or without the @ sign.
profileTabsarray[]Extra tabs to pull for each account: replies, reposts, media.
findAccountsbooleanfalseAlso return the accounts talking about your keywords. Not charged separately.
modesarray["recent"]recent = newest first, best for monitoring. top = relevance. tags = hashtag search.
searchLanguagestringenWhich language results should lean towards. 17 options. A preference, not a hard filter.
maxPostsPerProfileinteger100Cap per profile in username mode.
onlyNewbooleantrueReturn only posts not seen in previous runs with the same keywords. 7-day memory.
maxAgeHoursinteger0Drop posts older than this many hours. 0 means no limit.
proxyConfigurationobjectApify residentialResidential recommended. Pages are tiny so proxy cost is minimal.
concurrencyinteger4Parallel requests. Raise carefully.

Output

One dataset item per post. Export as JSON, CSV, Excel or XML, or pull it from the Apify API.

FieldTypeNotes
idstringThreads internal post id
codestringShort code used in the post URL
urlstringDirect link to the post
textstringPost body
languagestring or nullDetected language of the post text, ISO 639-1. null when it cannot be determined — see below.
hashtagsarrayHashtags in the post text, without the #.
mentionsarrayAccounts mentioned, read from Threads' own text fragments where available and parsed from the text otherwise.
urlsarrayLinks in the post text.
topic_tagstring or nullThe topic Threads filed the post under, e.g. Food Threads.
published_atstringISO 8601 UTC timestamp
published_tsintegerThe same moment as a Unix timestamp
media_typestringtext, image, video or carousel
mediaarrayMedia URLs with width and height
like_countinteger
reply_countinteger
repost_countinteger
quote_countinteger
is_replybooleanWhether the post is itself a reply
userobjectusername, full_name, is_verified, profile_pic_url
_sourcestringsearch, profile or account
_querystringWhich keyword or username produced this item
_modestringrecent, top, tags, profile, replies, reposts or media

Account record (when findAccounts is on)

Items with _source = account have this shape instead:

FieldTypeNotes
usernamestring
full_namestring
is_verifiedboolean
profile_urlstringLink to the profile
profile_pic_urlstring
posts_foundintegerHow many matching posts this account had in this run
total_likesintegerSummed across those posts
total_repliesintegerSummed across those posts
sample_post_urlstringOne of their matching posts
_querystringThe keyword they matched

Sample record

{
"id": "3988758633525726084",
"code": "Dda6tgGEsuE",
"url": "https://www.threads.com/@example/post/Dda6tgGEsuE",
"text": "...",
"language": "ko",
"published_at": "2026-09-18T07:38:24+00:00",
"media_type": "carousel",
"media": [{ "type": "image", "url": "https://...", "width": 1080, "height": 1350 }],
"like_count": 13,
"reply_count": 19,
"repost_count": 0,
"quote_count": 0,
"is_reply": false,
"user": {
"username": "example",
"full_name": "...",
"is_verified": false,
"profile_pic_url": "https://..."
},
"_source": "search",
"_query": "keyword",
"_mode": "recent"
}

Turn it into a live monitor

  1. Run the Actor once with your keywords and check the output.
  2. Save it as a Task.
  3. Add a Schedule — every 5 or 15 minutes works well.
  4. Keep onlyNew on, so each run emits only posts you have not seen.
  5. Connect the dataset to Slack, a webhook, Google Sheets, Make or Zapier.

You now have a Threads mentions feed that never repeats itself.

Use it from an AI agent

The Actor is callable from the Apify API and over MCP, so an agent can ask for fresh Threads posts on any topic and get structured JSON back — no browser, no login flow, no captcha handling. Set onlyNew to false for agent calls, so each question gets a full answer rather than a delta.


What to expect

Keyword search depth. Threads shows roughly the first 20 public posts per keyword, per sort mode, to anonymous visitors. That is a platform limit, not a bug in this Actor. The design answer is time: run it on a schedule with onlyNew and you accumulate continuously. For bulk history, use usernames mode, which does paginate.

Profile depth. Anonymous pagination walks a profile back through time. On a large, active account this has reached over a year of history in testing. Small accounts simply have less to return.

Why a run can return few or zero items. In order of likelihood:

  1. onlyNew is on and nothing new has appeared since the last run. This is correct behaviour, not a failure.
  2. maxAgeHours is set and everything found is older than the cutoff.
  3. The keyword is genuinely quiet on Threads.
  4. The profile is private, deleted, or has no public posts.

Freshness. With recent, posts appear seconds after publication.

Public only. Private and restricted posts are not accessible. This Actor does not attempt to reach them.


FAQ

Do I need a Threads or Instagram account? No. The Actor reads public pages only. There is no login step and no credential to store.

Can my account get banned? There is no account involved, so there is nothing to ban. That is the main reason to use this one.

Do I need to supply cookies or a session token? No. Nothing to paste, nothing to refresh, nothing to expire.

How many posts does a keyword search return? Roughly the first 20 public posts per keyword, per sort mode. See What to expect above for why, and what to do about it.

How far back can it go on a profile? Months, and over a year on large accounts in testing. Use maxPostsPerProfile to control how deep.

How fresh are the results? With recent sort, posts show up seconds after they are published.

What does it cost? $1.99 per 1,000 posts returned. Platform usage is included, so you are not billed separately for compute or proxy.

Am I charged for duplicate posts? No. With onlyNew on, posts you already received are filtered before they reach the dataset, so they are never charged.

My second run returned almost nothing. Is it broken? Almost certainly not — that is onlyNew working. Set it to false if you want the full set every time.

Can I scrape private accounts? No. Public content only.

Which proxy should I use? Residential is recommended and is the default. Pages are about 2.4 KB per post over the wire, so proxy consumption is small.

Can I use my own proxies? Yes, through proxyConfiguration.

Can I filter by date? Use maxAgeHours to drop anything older than N hours. In profile mode, maxPostsPerProfile bounds how far back you go.

Does it get replies and reposts? Posts carry reply_count, repost_count and quote_count, and is_reply tells you whether an item is itself a reply.

A reposts or replies tab came back empty. Is that a bug? No. Many accounts simply never repost, and plenty never reply publicly. The Actor reports what is actually on the tab rather than inventing results.

How deep do the replies / reposts / media tabs go? One page, typically 5 to 20 items. This is a Threads limit, not an Actor limit: those tabs report has_next_page: false with no cursor to anonymous visitors, so there is no second page to fetch. The main posts tab is different — it does paginate, and maxPostsPerProfile takes it back months.

Are the account records charged? No. They are aggregated from posts that were already charged in the same run, so you are not billed twice for the same data.

Can I run it on a schedule? Yes — that is what it is built for. See Turn it into a live monitor.

Does it work with AI agents and MCP? Yes. See Use it from an AI agent.


Changelog

  • 0.2.1 — Lower default memory (runs cost less and you can run more of them in parallel). Clearer warning when profile tabs are selected without any usernames.
  • 0.2.0 — Four new modes: profile replies, reposts and media tabs, plus find accounts (who is talking about your keyword). Keyword and profile fetches now rotate the proxy and retry when a page comes back empty, instead of silently returning nothing.
  • 0.1.9 — Added Actor output schema. No change to scraping behaviour or output fields.
  • 0.1.6 — Expanded documentation.
  • 0.1.2 — Fixed template resolution when running in the cloud container.
  • 0.1.1 — First public build: keyword monitoring, profile history, cross-run dedupe.

Notes and limits

  • Reads public content only. Private or restricted posts are not accessible.
  • Keyword search returns the first page of about 20 posts per sort. Built for monitoring fresh posts over time, not one-shot bulk keyword history. For bulk, use username mode.
  • Results reflect what Threads shows publicly at the time of the run.
  • Threads changes its public pages from time to time. This Actor is maintained against those changes. Run a small sample first, check the output, then scale up.

Our other Actors

  • YouTube Monitor — watch keywords and channels for new videos only. Shorts included, exact publish times, like counts, and dedupe across runs so you are never charged twice for the same video.
  • YouTube Transcript Scraper — the spoken transcript of any video, by URL, channel or keyword. Falls back to any available language instead of failing.

Disclaimer

This Actor collects only publicly available data. You are responsible for how you use the data you collect, including compliance with the Threads terms of service, applicable data protection law such as GDPR, and any restrictions that apply in your jurisdiction. If you are unsure, take legal advice before scraping personal data at scale.


Keywords: threads scraper, threads.com scraper, Meta Threads API, Threads keyword search, Threads hashtag scraper, Threads profile scraper, Threads post history, Threads monitoring, social listening, brand monitoring, no login scraper, Threads data extraction.