3 Ways to Scrape Threads Posts by Keyword: the Official API's Real Limits, Rolling Your Own Scraper, or an Apify Actor
In one line: Threads does have an official keyword search API, but it comes with three real hurdles — Meta App Review, a 2,200-query rolling 24-hour cap, and response fields that carry zero engagement data. Rolling your own scraper gives you the most control but the most upkeep. A ready-made Apify actor skips login and tokens entirely, costs $0.005 per result, and ships full like/repost counts. Here’s how the three routes actually compare.
“Threads has no search API” is outdated — but the real hurdles are real
Threads crossed 400 million monthly active users in August 2025 (per Instagram head Adam Mosseri, reported by TechCrunch). At that scale, anyone doing brand monitoring, competitor tracking, or influencer research runs into the same question: how do I pull Threads posts by keyword?
A lot of write-ups still claim Threads has no public search API and that scraping is your only option. That’s out of date: the official Threads API ships a keyword_search endpoint that searches public posts by keyword. But it comes with limits spelled out in the docs — you need App Review approval before it returns anything beyond your own posts, every user token is capped at 2,200 queries per rolling 24 hours, and the response fields don’t include likes, reposts, or view counts.
So whether the official API works for you depends entirely on what you’re trying to do with the data. In practice there are three routes — here’s the comparison table first.
The three routes, side by side
| Route 1: Official Threads API | Route 2: Roll your own scraper | Route 3: Ready-made Apify actor | |
|---|---|---|---|
| Getting started | Meta developer account + app + pass App Review for threads_keyword_search | Engineering time (client-rendered pages, undocumented endpoints, anti-bot) | Sign up for Apify, paste a JSON input, done in minutes |
| Query volume | 2,200 queries per rolling 24 hours per user token; 25 results by default, 100 max per call (official docs) | You control it, but rate limits and blocks are on you | Up to 100 keywords per run, up to 500 posts per keyword |
| Engagement data (likes/reposts/views) | ❌ Not in the response fields | Depends how deep you scrape and how well you maintain it | ✅ Likes, replies, reposts, shares, views, quotes all included |
| Cost | No published API fee; the cost is the App Review process and dev time | Engineer hours + proxy bills | $0.005 per result (50 posts ≈ $0.25; pricing on the store page) |
| Maintenance | Meta maintains it; stable | Every Threads front-end change is on you | Maintained by the actor’s author |
| Best for | Product teams already running a Meta developer pipeline | Teams with engineering resources who want full control | Marketing/listening/research teams who need speed and engagement data |
Here’s each route in more detail.
Route 1: the official Threads API’s keyword_search
The official path (full docs here):
- Create an app in Meta for Developers and connect the Threads API.
- Get the
threads_basicandthreads_keyword_searchpermissions.threads_keyword_searchneeds to pass App Review before it can search public posts — until it does, the endpoint only returns posts from your own account. - With a user access token in hand, call:
curl -s -X GET \
-F "q=your search term" \
-F "search_type=RECENT" \
-F "fields=id,text,media_type,permalink,timestamp,username" \
-F "access_token=<THREADS_ACCESS_TOKEN>" \
"https://graph.threads.net/v1.0/keyword_search"
The documented limits:
- A maximum of 2,200 queries per user in a rolling 24-hour window. Repeat searches for the same keyword still count; queries that return no results don’t.
- Each call returns 25 posts by default, up to 100 max.
search_typeisTOP(default, popular) orRECENT(newest);since/untilfilter by date (Unix timestamp). - The documented response fields include things like
id,text,media_type,permalink,timestamp,username,has_replies,is_quote_post,is_reply(full list in the Media object docs) — but the entire Media object carries no engagement metrics like likes, reposts, or views. Those live in the separate Insights API, and only for your own posts.
That last point is the deciding factor: if what you actually need is sentiment ranking (which post has the most reach), influencer performance (which post blew up), or competitor content analysis (which format gets the most engagement), search results with zero engagement data can’t get you there. The official API fits an alerting use case — “just tell me who’s talking about what” — for a team that’s already comfortable with Meta’s developer approval process.
Route 2: roll your own scraper
The most flexible route, and the one with the highest hidden cost. From the experience of maintaining a Threads scraper myself:
- The Threads web app is client-side rendered — post content isn’t in the initial HTML, so you either reverse-engineer its internal data endpoints or run a real browser and wait for the page to render.
- The internal endpoints are undocumented and change without notice. Code that works today can silently break the next time Threads ships a front-end update — and you usually only find out once your data stops coming in.
- Anti-bot defenses and rate limiting are entirely on you — proxies, backoff-and-retry, block detection, all your operational burden.
Building this once as a learning project is fine. But if this pipeline needs to feed a report or a customer every day, the real cost isn’t the first version of the code — it’s chasing every subsequent site change. Budget for that honestly before committing to this route.
Route 3: a ready-made Apify actor, running in five minutes
The third route is using a scraper someone else already maintains. Take threads-feed-scraper — the actor I publish and run myself (118 users, 4.89★ as of writing, both figures live on the store page) — its “search” mode is built for exactly this: no login, no API token, no App Review, just paste this input in the Apify Console and run it:
{
"mode": "search",
"keywords": ["your-brand", "your-competitor"],
"searchSort": "recent",
"dateFrom": "7 days",
"maxPosts": 100
}
A few practical notes (field definitions follow the actor’s own input schema):
keywordsis an array — up to 100 keywords per run, up to 500 posts per keyword (maxPosts, default 50).- One concept per keyword. Threads search matches a whole string as a single phrase, so a compound term can return zero results — split it into separate keywords instead.
searchSortistop(popular) orrecent(newest); for daily monitoring,recentpaired with a relative date likedateFrom: "7 days"is the simplest setup.- Output includes
likeCount,replyCount,repostCount,shareCount,viewCount,quoteCount, and ISO 8601 timestamps — the engagement data the official API doesn’t give you, fully present here, ready for sentiment ranking or reach analysis without any extra API calls.
Cost is $0.005 per result, billed on what actually gets returned (pricing on the store page): 50 posts is $0.25, a full 500-post pull is $2.50. Once the data’s in hand, wiring it into an automated alert pipeline is a separate step — our n8n walkthrough covers exactly that, end to end.
Pick a route and start
From least effort to most freedom
FAQ
Does Threads actually have an official search API? Yes. The keyword_search endpoint lets you search public posts by keyword, but you need Meta App Review approval for the threads_keyword_search permission (without it, the endpoint only returns your own posts), you’re capped at 2,200 queries per rolling 24 hours, and the response fields don’t include likes, reposts, or any other engagement metric.
Is the official API’s 2,200-query cap enough? Depends on the use case. For simple alerting — checking a handful of keywords every hour — it’s plenty. But each call returns at most 100 posts and no engagement data, so it doesn’t work for ranking posts by reach or backfilling history.
Why does a multi-word keyword return zero results? Threads search matches the whole string as one phrase. A compound term often returns nothing until you split it into separate single-concept keywords and query them individually. That’s an observed behavior on the actor’s side (see its input schema notes); Meta hasn’t documented how keyword_search itself matches terms, so the same behavior is a reasonable assumption (same underlying search backend) but not officially confirmed.
Does the actor’s data include likes and view counts? Yes. Output includes likeCount, replyCount, repostCount, shareCount, viewCount, and quoteCount — that’s the biggest practical difference versus the official keyword_search endpoint.
Do I need a Threads account or API token to use the actor? No. It reads public page content, so there’s no login, no Meta developer account, and no access token required.
Is scraping like this legal? We only scrape public content, never anything behind a login, and we don’t store personal data beyond what a public page already shows. Before using any of these three methods, check that your use case complies with your local laws and the platform’s terms.
Further reading
- Build a no-code forum sentiment pipeline with Apify + n8n + GPT: once you’ve got Threads posts by keyword, this walks through turning them into a scheduled sentiment-scoring and Slack-alert pipeline — no code required.
- Using an LLM to Spot Coordinated Word-of-Mouth Posts: if the engagement data on your Threads results looks suspiciously uniform, this covers how to add an LLM pass on top of scraped posts to flag coordinated campaigns.
Chad runs 40+ published Apify actors, including threads-feed-scraper used above (118 users, 4.89★ as of writing, both figures live on the store page). Every limit number for the official API links to Meta’s own docs; nothing here is written without a source to check it against.