Threads Keyword & Hashtag Search Scraper — Posts + Metrics avatar

Threads Keyword & Hashtag Search Scraper — Posts + Metrics

Pricing

$1.00 / 1,000 per post returneds

Go to Apify Store
Threads Keyword & Hashtag Search Scraper — Posts + Metrics

Threads Keyword & Hashtag Search Scraper — Posts + Metrics

Search public Threads (threads.com) by keyword or hashtag and get every post on the results page: text, author, likes, replies, reposts, quotes, media, links and exact timestamp. Bulk keyword lists, date and engagement filters, no login. $1 per 1,000 posts, no per-run fee.

Pricing

$1.00 / 1,000 per post returneds

Rating

0.0

(0)

Developer

Scrapers Delight

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

🔎 Threads Keyword & Hashtag Search Scraper — Posts + Engagement Metrics

Search Threads — Meta's text network — by keyword or hashtag and get back one row per public post: the full text, the author, exact timestamp, likes, replies, reposts and quotes, media URLs, outbound links, mentions and hashtags.

Feed it a list of terms and it searches all of them.

No login. No cookies. No Instagram account. No CAPTCHA solving. No browser.

$0.001 per post returned — $1.00 per 1,000 posts, and no actor-start fee.

{
"keywords": ["coffee", "#marketing", "ai agents", "small business"],
"searchType": "both",
"passesPerSurface": 2,
"postedWithinDays": 30
}

Click Try for free and hit Start. A run with the shipped input returns real rows and costs about five cents.


⚠️ Read this first: how many posts you actually get

Threads' logged-out search page is not paginated. This Actor reads what the search page itself renders, and every number below was measured on real threads.com bytes on 2026-09-02, through Apify datacenter proxies — not on a home connection, and not estimated.

WhatMeasured
Posts on one search request18–25 (mean 21.0, n = 12 real search pages, 252 rows)
Unique posts per keyword, searchType: "both", 1 pass (2 requests)25–43 (mean 32.7 over 6 keywords)
Unique posts per keyword, 3 passes × both surfaces (6 requests)52 (coffee) and 54 (marketing)
Practical ceiling per keyword~50–70 unique posts

Why there is a ceiling. Two things were tested and are reported honestly rather than papered over:

  1. The search page's own payload declares page_info: {end_cursor: null, has_next_page: false} — Threads hands a logged-out client no cursor.
  2. Re-issuing the search query against POST /api/graphql with the page's own freshly minted LSD token — the technique that does work for Threads profile feeds — is refused with invalid_variable_type. Fourteen different variable shapes were tried (with and without the relay-provider variables, recent as 0/1/true/false/null/omitted, with first, with after, dropping each base variable in turn). All fourteen failed. See SIGNOFF.md.

What does add depth is that the two search surfaces disagree with each other and that the results rotate between requests. So passesPerSurface is the depth knob — and because you are billed per delivered post, a repeat pass that returns nothing new costs you nothing.

If you need a specific creator's whole post history instead, that is a different surface — use Threads Profile Scraper.


🧰 What you can do with it

  • 👂 Social listening — track your brand, your competitors and your category on Threads, daily.
  • 📈 Trend + content research — sort a keyword's results by engagementTotal and see what actually lands in that niche before you write anything.
  • 🎯 Creator discoveryauthorIsVerified, engagementTotal and authorProfileUrl on every row; pull 30 category keywords and you have a ranked shortlist of accounts in your space.
  • 🔗 Lead generation — switch on onlyWithLinks and keep only the posts pushing an outbound URL. externalLinkDomain tells you which product each one is promoting.
  • 🗞️ Newsroom / PR monitoringpostedWithinDays: 1 plus a keyword list is a morning brief.
  • 🧪 Dataset buildingtext, language, mediaType and engagement counts, ready for sentiment or classification work.

📤 Output — one row per post

Fill rates below are measured, across 252 rows from 12 real search pages (coffee, ai agents, marketing, nike, crypto, small business × Top + Hashtag surfaces), 2026-09-02.

Search context

FieldTypeFillNotes
searchKeywordstring100%the term this row was found under
searchSurfacestring100%top or tags
searchUrlstring100%the exact URL the row came from

The post

FieldTypeFillNotes
postIdstring100%stable Threads post id (pk)
postCodestring100%short code used in the permalink
postUrlstring100%https://www.threads.com/@user/post/<code>
textstring100%full post text, newlines and emoji preserved
textLengthinteger100%characters
postedAtISO 8601100%exact publish time, UTC
likeCountinteger100%median 38, max 16,845 in the sample
replyCountinteger100%
repostCountinteger100%
quoteCountinteger100%
reshareCountinteger47.2%only present on some posts
engagementTotalinteger100%likes + replies + reposts + quotes, pre-computed to sort on
countsHiddenboolean100%true when the author hid their counts
isReplyboolean100%11.9% of sampled results were replies
replyToAuthorstring11.9%who the reply is to
isPaidPartnershipboolean100%
languagestring5.6%only where Threads has detected one

Media

FieldTypeFillNotes
mediaTypestring100%measured mix: text 139, image 50, carousel 46, video 17
imageUrlstring44.8%highest-resolution candidate
videoUrlstring6.7%direct MP4
carouselCountinteger18.3%items in a multi-image post
hasAudioboolean6.7%video posts only
FieldTypeFillNotes
hashtagsstring[]2.8%hashtags really are rare on Threads — only 7 of 252 posts used one
mentionsstring[]3.2%@-mentioned usernames
externalLinksstring[]2.4%outbound URLs, from the body and the link-preview card
externalLinkDomainstring2.4%the first link's domain, ready to group by
linkPreviewTitlestring1.6%link-card title where Threads rendered one

The author

FieldTypeFillNotes
authorUsernamestring100%
authorFullNamestring94.4%display name
authorIdstring100%stable Threads user id
authorProfileUrlstring100%
authorIsVerifiedboolean100%15.5% of sampled results were from verified accounts
authorIsPrivateboolean100%
authorProfilePicUrlstring100%
scrapedAtISO 8601100%

Follower count is deliberately not here. The search page does not carry it, and this Actor does not invent columns. Pipe authorUsername into Threads Profile Scraper when you need it.


⚙️ Input

FieldDefaultWhat it does
keywords(sample)One term per line. coffee, #marketing, or a pasted Threads search URL.
searchTypebothtop = the main results page, tags = the hashtag surface, both = the union.
passesPerSurface11–5. Re-request each surface to pick up rotating results.
maxPostsPerKeyword100Per-term cap. 0 = no cap.
maxItems1000Whole-run cap. 0 = no limit.
minLikes0Drop the long tail.
postedWithinDays0Search mixes fresh posts with older high-performers — set 7 or 30 for monitoring.
excludeRepliesfalseStandalone posts only.
onlyWithLinksfalseOnly posts carrying an outbound URL. Strict: 2.4% of results.
requestConcurrency3Keywords searched in parallel.
proxyConfigurationApify datacenterSee below.

Leave keywords empty and the Actor runs a documented sample instead of failing, so {} from an API, MCP or agent caller always comes back with real rows.


💵 Pricing

Per post returned$0.001
Actor start fee$0.00
1,000 posts$1.00
30 keywords, 2 passes, both surfaces (~1,300 posts)~$1.30

You are billed as each post is written, so a run that hits your charge cap stops cleanly — you never pay for rows you did not receive. Duplicate posts across surfaces and passes are de-duplicated before billing and charged once. A keyword threads.com refuses to serve is not billed at all.

For comparison, checked on the live Apify Store on 2026-09-02: the Threads-search incumbent charges $0.02/item, the next-biggest $0.008/item, and one competitor charges $0.04 per run before a single row.


🌐 Proxies and reliability — the honest version

threads.com sometimes answers a logged-out request with its "log in" interstitial (a ~265 KB shell with no data in it) instead of the search page. It is transient and per-request: a retry on a fresh proxy session clears it. This Actor retries up to 4 times per search page, on a new session each time.

Measured over 12 consecutive search pages through Apify datacenter proxy: 12 of 12 readable — 9 on the first attempt, 3 on the second.

A term that never yields a search page after all 4 attempts is named in the log and in the run's status message, and is not billed. A blocked keyword is never silently reported as "no results" — those are different facts and you are told which one happened.

Datacenter proxy is the default because a search page is ~1 MB and residential bandwidth would cost more than the posts on the page are priced at. If you do see blocked terms, switch proxyConfiguration to RESIDENTIAL and re-run.


❓ FAQ

Do I need a Threads or Instagram login? No. Everything this Actor reads is what threads.com serves to a logged-out visitor.

How many posts will I get per keyword? 18–25 from a single request; 25–43 with searchType: "both"; 52–54 measured with 3 passes over both surfaces. Roughly 50–70 is the ceiling. See the table at the top.

Can you add pagination / "load more"? Not from the logged-out search surface. The page reports no cursor, and the GraphQL search query is refused with invalid_variable_type on every variable shape tested (14 of them). If that changes, this page changes with it.

Are the results sorted by date? No — Threads' own ranking mixes recent posts with older high-performers. The 252-row sample spanned 2023 to the day it was taken. Use postedWithinDays to force recency, and sort on postedAt.

What's the difference between the top and tags surfaces? They are two different Threads result pages for the same term. Measured overlap per keyword was only 6–11 shared posts out of ~21 each, so both is the default.

Do I have to write the #? No. marketing and #marketing both work, on both surfaces.

Does it get follower counts? No — the search page does not carry them. Feed authorUsername into Threads Profile Scraper.

Does it get comments/replies to a post? Only replies that themselves matched your keyword (isReply: true, 11.9% of results). A post's full reply thread is a different surface.

Can I monitor a keyword daily? Yes — schedule it. Set postedWithinDays: 1, and de-duplicate on postId across runs.

What happens on an empty input? It runs a documented sample and returns rows. It never fails.

Will a blocked page look like "no results"? No. Blocked terms are counted, named in the log, and named in the run status message.

What does a zero-row run cost? Nothing beyond compute. There is no actor-start fee and nothing is charged unless a post is written.

Can I export to CSV / Google Sheets? Yes — every Apify dataset exports to CSV, JSON, XLSX, XML and HTML, and the API serves it directly.


This Actor reads only public, logged-out Threads search pages — the same pages any visitor sees without an account. It does not log in, does not use or store credentials, does not touch private or follower-only accounts, and does not attempt to bypass a login wall.

https://www.threads.com/robots.txt contains, verbatim:

# Notice: Collection of data on Threads through automated means is
# prohibited unless you have express written permission from Threads
# and may only be conducted for the limited purpose contained in said
# permission.
...
User-agent: *
Disallow: /

That is stated here plainly rather than hidden. A robots.txt directive is a request to automated crawlers rather than a law, but Meta's Terms of Service separately prohibit automated collection, and the legal position around scraping public pages differs by jurisdiction and is still being litigated.

You are responsible for your own use. Respect GDPR/CCPA where personal data is involved, honour deletion requests, do not re-publish scraped content as your own, and take your own legal advice before commercial use. Run at a reasonable rate — the defaults here are deliberately gentle.


Built by ScrapersDelight. Sibling Actors: Threads Profile Scraper (followers, bio links, recent posts).