Threads Search Scraper API
Pricing
from $4.00 / 1,000 results
Threads Search Scraper API
Search Threads posts by keyword and export post text, author, engagement counts, hashtags, topics, image descriptions, music and media links, with timestamps when available. Runs with your own Threads access key, so results reach past the signed-out view.
Pricing
from $4.00 / 1,000 results
Rating
5.0
(1)
Developer
Rush
Maintained by CommunityActor stats
2
Bookmarked
42
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
Enter one or more search terms and get back the matching Threads posts as a dataset. Each row has columns for the author, the engagement counts, the media, hashtags, mentions, links and timestamps, filled in wherever Threads provides them. Common uses are social listening, market research and competitor tracking. It runs with your own Threads access key, and the setup steps are below.
What you can collect
- Post content: text, post URL, shortcode, hashtags, mentions, links, detected language, and the topic the post is filed under
- Image descriptions: Threads' own description of each image, when it has one. For screenshots and graphics it can include the text shown in the image, and for some photos it only names the author and the date
- Music: the artist, title and track ID of the song a post was published with, when it has one
- Conversation: whether a row is a reply, and the username it replies to
- Author: username, account ID, display name, profile URL, profile picture, and verification status
- Engagement: likes, replies, reposts, quotes, and shares when available
- Media: media type, a preview image, every image in a carousel, and every video the post carries
- Run metadata: keyword, the sort that produced the row, result index, post timestamp, and scrape timestamp
Input
{"keywords": ["coffee", "AI startups"],"sessionId": "your-private-access-key","maxResults": 50,"searchType": "top"}
| Field | Type | Description |
|---|---|---|
keywords | array | Search terms to look up on Threads. You can enter up to 20 keywords per run. |
sessionId | string | Private access key for this run. It is a secret input. Use a secondary account when possible. |
maxResults | number | Maximum posts to save per keyword, between 10 and 2000. A higher limit means a longer run. Actual results can be lower when Threads has fewer matches. |
searchType | string | top for the posts Threads ranks as most popular or relevant, or recent for the newest matching posts first. |
Private access
This Actor searches as your own account, which is why it needs a private access value from Threads. Searching signed out is possible, but Threads serves signed-out visitors a shallower set of results. Searching as an account is what lets a run keep going past that point. Apify stores the value as a secret input, and it never appears in the logs or in your exported data.
How to get your private access key
- Open threads.com in your browser and sign in to the account you want to use.
- Open your browser's developer tools (
F12, orCmd+Option+Ion a Mac). - Go to the storage panel (Application → Cookies in Chrome and Edge, or Storage → Cookies in Firefox) and select
https://www.threads.com. - Find the row named
sessionidand copy its value in full. Pasting the wholesessionid=...pair also works. - Paste it into the Private Access Key field.
Threads decides how long the value keeps working, and signing out of that browser ends it immediately. If a run reports an access problem, repeat these steps to get a fresh value.
Use a secondary account where you can. Treat this value like a password: anyone who has it can act as your account, so do not share it or paste it into anything you do not control. Signing out of the browser you copied it from ends the value everywhere.
Output example
The example below shows the output format. Values vary by the posts returned for your keywords.
{"keyword": "coffee","searchType": "top","postId": "1234567890123456789","postCode": "ABC123Example","postUrl": "https://www.threads.com/@example.creator/post/ABC123Example","text": "Morning coffee ritual. What's your favorite brew method? #coffee","imageAltText": "Photo by Example Creator on February 25, 2026. May be an image of a pour-over coffee set.","imageAltTexts": ["Photo by Example Creator on February 25, 2026. May be an image of a pour-over coffee set.","Photo by Example Creator on February 25, 2026. May be a graphic of text that says 'Brew guide'."],"hashtags": ["#coffee"],"mentions": [],"urls": [],"username": "example.creator","authorId": "12345678901","displayName": "Example Creator","profileUrl": "https://www.threads.com/@example.creator","profilePicUrl": "https://scontent.cdninstagram.com/...","isVerified": false,"timestamp": "2026-02-25T08:00:00.000Z","language": null,"topicTag": "coffee","musicArtist": null,"musicTitle": null,"musicSongId": null,"isReply": false,"replyToUsername": null,"likeCount": 796,"replyCount": 11,"repostCount": 21,"quoteCount": 0,"shareCount": 81,"mediaType": "carousel","imageUrl": "https://scontent.cdninstagram.com/...","imageUrls": ["https://scontent.cdninstagram.com/...", "https://scontent.cdninstagram.com/..."],"videoUrl": null,"videoUrls": [],"index": 1,"scrapedAt": "2026-06-12T12:00:00.000Z"}
Search tips
- A focused keyword returns fewer off-topic posts than a broad one.
- Use
topto see what a keyword is known for, andrecentto watch what is being said right now. The two return different sets of posts. - Very niche terms may return fewer results than your requested limit.
- Use words rather than emoji. A keyword made only of emoji comes back mostly with posts published moments earlier that do not contain it, and on
topthose are left out, so such a search can return fewer results than you asked for. - Threads also returns posts filed under a topic that names your keyword, even when the post's own words do not. For the strictest match, filter the exported
textfield; to also keep those posts, keep rows whosetopicTagnames the keyword. A translation of the keyword, or one word of a multi-word phrase, passes neither. - Start with a small
maxResultson a new keyword. You will see the kind of posts it returns before committing to a longer run.
Common questions
Why do some rows look like replies rather than posts?
Threads answers a keyword with whole conversations, so a match inside a reply brings that reply
back too. Every row says which it is: isReply marks a reply and replyToUsername names the
account it answers. Filter on isReply to keep opening posts only. This is more common with
recent than with top.
Why is private access required?
So the Actor can search as your own account rather than as a signed-out visitor, which is what Threads limits more tightly. The value is marked as secret, stays out of the logs, and is not exported in dataset rows.
Can I search multiple keywords?
Yes. Each result carries the keyword it came from and the searchType that produced it, so you can filter, group, or compare after export. That includes rows from separate top and recent runs collected into the same sheet.
Is top always more relevant than recent?
They answer different questions, and Threads controls both. top returns the posts Threads ranks as most popular or relevant for your keyword, which skews toward posts that have had time to gather engagement. Threads also mixes into its top list a few posts published moments before the search that do not mention the keyword. This Actor leaves those out on top, together with the rest of their conversation when nothing in it mentions the keyword, and keeps collecting from the next results toward the number you asked for. The check looks for the keyword itself in the post, its topic, its image descriptions and the title of a shared link, so a just-published post that only uses a translation of the keyword is left out too. recent returns the newest matching posts. For monitoring, run both and compare.
What does the run summary tell me?
A run that finished everything says so and gives the totals. A run that was cut short says that instead, gives the posts it saved, and names every keyword that did not finish along with the reason, so you can re-run just those rather than the whole list. A run that cannot start at all, for example when the private access value is rejected up front, reports that instead.
Why did a run finish with fewer posts than I asked for?
The summary says which of two things happened.
If the keyword is reported as fully searched, Threads had no more matches to give. Niche phrases, fresh topics and terms with little public activity all return fewer. That is a complete answer at a smaller number for the moment the run searched. Threads adds new posts as they are published, so a later run can return more for a topic that is still active.
If the keyword appears in the summary's not-finished list, collection stopped before Threads said it was finished, and the reason is named beside it. When the reason is the run's time limit, allow the run more time in its run settings, or search fewer keywords at once. Those results are still yours and still exported. A new run for that keyword starts from the beginning rather than resuming, so it collects the same opening results again, which is worth knowing before you re-run one.
What do the media type values mean?
text for a post with no attached media, photo, video or carousel for posts that carry media, and gif for an animated image. imageUrl holds a single preview image and imageUrls holds every image in the post, so a carousel is exported in full. videoUrl and videoUrls do the same for video: one playable file for readers that want a single link, and the full list for a post that carries more than one clip. A video also contributes its preview frame to imageUrls, and a gif post its animated image, so check mediaType and videoUrls before counting photographs. If Threads does not say what kind of post it is, or says it in a way this Actor does not recognise yet, mediaType is left empty rather than guessed. An empty value there means the kind is unknown, not that the post has no media.
The image, video and profile picture links are temporary. Video links usually stop working a day or two after the run, and image and profile picture links a few days after it, so download the files you want to keep soon after the run finishes. The post and profile links do not expire.
Which fields can be empty?
Most fields are filled only when Threads provides them. Some are blank by nature: replyToUsername on every post that is not a reply, topicTag when the author did not file the post under a topic, imageAltText when the post has no image or Threads has no description for it, the music fields when the post has no track, and imageUrl and videoUrl when the post carries no such media. language is also often blank, and English posts usually come back without it. Beyond those, any post detail can be blank, including the author's display name, the post text itself, and any engagement count. An empty value means Threads did not provide it. A blank engagement count is a different thing from a count of 0, with one exception: Threads does not send a share count of 0 and leaves shareCount blank instead, so treat a blank shareCount as no recorded shares when you total or average them.
The list fields (hashtags, mentions, urls, imageAltTexts, imageUrls and videoUrls) are always present, and are empty when the post contains none of them.
Integrations
Use Apify integrations to export results to Google Sheets, Make, Zapier, Slack, databases, dashboards, or automation tools.
Other Threads scrapers
- Threads Scraper - Posts, Profiles & Search: collect public posts, search keywords, discover profiles, and export account data.
- Threads Replies Scraper: collect public replies and comments for conversation analysis.
Disclaimer and responsible use
Use this Actor responsibly and make sure your usage complies with applicable laws, platform terms, and your own data governance requirements. Avoid using your primary personal account for automated workflows.
Search results can include posts written by identifiable people. If you keep, publish, or process that content, you are the one responsible for having a lawful basis for it and for honouring requests about it, including under regimes such as the GDPR and the CCPA. Collect only what your use case needs, and keep it no longer than you need it.
This Actor is an independent tool. It is not affiliated with, endorsed by, or sponsored by Meta Platforms, Inc., and Threads is a trademark of its respective owner. Results come from Threads and reflect whatever Threads returns at the time of the run.
Threads search scraper, Threads Search Scraper API, Threads keyword search, Threads posts scraper, Threads data extraction, Threads analytics, Threads monitoring, social media monitoring, social listening, content research, competitor research, influencer research, Apify Actor, OpenClaw, Claude Code, Gemini, Codex, Antigravity, ChatGPT