Threads Search Post Scraper avatar

Threads Search Post Scraper

Pricing

$2.35 / 1,000 posts

Go to Apify Store
Threads Search Post Scraper

Threads Search Post Scraper

Search public Threads posts by keyword or hashtag, or look up posts by URL or numeric ID. Get normalized text, author, publication time, engagement, media, links, conversation data, and public replies from targeted posts in an Apify dataset.

Pricing

$2.35 / 1,000 posts

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

11

Total users

3

Monthly active users

5 days ago

Last modified

Share

🧵 Search public Threads posts with focused filters

Researchers, marketers, and developers can search public Threads posts by keyword or hashtag, or look up known posts by URL or numeric ID. The Actor saves normalized rows with post text, public author details, publication time, available engagement counts, media, source links, and conversation data, so you can review Threads search results in an Apify dataset.

📊 Structured Threads post data

What you get

The default output is one normalized row for each saved public post. It includes the post text, author, publication time, available engagement counts, media, mentions, hashtags, outbound links, quote or repost links, conversation links, and public replies when Threads embeds them on a targeted post page.

Fields that Threads does not show are omitted. The Actor handles public posts only. It does not promise a historical archive or a complete reply tree when replies are not present on the public post page.

▶️ Run a public Threads search or lookup

How it works

  1. Choose Keyword, Hashtag, or Post URL or ID.
  2. Enter one or more keywords, hashtags, public post URLs, or numeric post IDs in the matching field.
  3. For keyword and hashtag searches, choose Recent first or Relevance or top. You can also set a UTC date range, a recent-days window, or a public author.
  4. Set Maximum posts when you want a smaller run. Leave it empty to return all available results until the source is exhausted.

Focused runs

Keyword and hashtag lists use one shared sort, date, author, and post limit setting. Use separate runs when searches need independent settings. A direct post lookup accepts public URLs or numeric IDs and ignores search sorting, date, and author filters. You do not need to provide a source credential for public data, but private content is not covered.

Where results go

The Actor saves successful public post rows to the standard Apify dataset and exposes that dataset through the run output and API. A post ID and source URL help you trace each row back to its public Threads post.

⚙️ Input

Input fields

FieldTypeWhat it does
findPostsBystringSelect keyword, hashtag, or post to choose the target field.
keywordsarray of stringsFor keyword, enter one or more words or phrases. The same sort and post limit apply to every submitted keyword.
hashtagsarray of stringsFor hashtag, enter one or more hashtags with or without #. The same sort and post limit apply to every submitted hashtag.
postTargetsarray of stringsFor post, enter one or more public Threads post URLs or numeric post IDs. The same post limit and output setting apply to every submitted post.
sortOrderstringFor keyword and hashtag searches, choose recent or top. Direct post lookups ignore this field.
publicationDateobjectFor keyword and hashtag searches, use a UTC date range or a recent-days window. Direct post lookups ignore this field.
publicationDate.fromDateUTC date stringFirst publication date to include in a date range.
publicationDate.toDateUTC date stringLast publication date to include in a date range.
publicationDate.recentDayspositive integerInclude posts published in this many days before the run.
authorstringFor keyword and hashtag searches, enter a public Threads username with or without @. Direct post lookups ignore this field.
maxItemspositive integerOptional run limit. Leave it empty to return all available results until the source is exhausted.

Example input

The following small input is the public input from a successful default keyword run with recent ordering and a one-post limit.

{
"findPostsBy": "keyword",
"keywords": [
"AI"
],
"sortOrder": "recent",
"maxItems": 1
}

🧾 Output

Run output

FieldTypeWhat it does
datasetURL stringLinks to the dataset containing successful public Threads post rows.

The dataset contains normalized public post rows. Optional fields appear only when Threads provides them.

Normalized public post row

The table below is complete for a normalized row. Optional fields appear only when Threads provides them.

FieldTypeWhat it does
postIdstringStable public ID of the Threads post.
postUrlstring (URI)Public Threads URL for the post.
textstring, optionalText shown in the post. Omitted when the post has no text.
authorobjectPublic author details.
author.idstringStable public ID of the author.
author.usernamestringPublic Threads username of the author.
author.displayNamestring, optionalPublic display name when shown.
author.isVerifiedboolean, optionalWhether Threads marks the author as verified.
publishedAtdate-time stringTime when Threads published the post.
engagementobject, optionalPublic engagement counts shown for the post.
engagement.likeCountinteger, optionalPublic number of likes.
engagement.replyCountinteger, optionalPublic number of replies.
engagement.repostCountinteger, optionalPublic number of reposts.
engagement.quoteCountinteger, optionalPublic number of quote posts.
engagement.viewCountinteger, optionalPublic number of views when Threads shows it.
mediaarray of objects, optionalImage or video attachments shown in the post. Each carousel attachment is listed once in source order.
media[].typestringMedia type, either image or video.
media[].urlstring (URI), optionalDirect source URL when Threads exposes one that users can open.
media[].altTextstring, optionalAlternative text for the media item when available.
media[].widthinteger, optionalMedia width in pixels when available.
media[].heightinteger, optionalMedia height in pixels when available.
media[].durationSecondsnumber, optionalVideo duration in seconds when available.
mentionsarray of objects, optionalAccounts mentioned in the post text.
mentions[].usernamestringMentioned public username.
mentions[].idstring, optionalMentioned public account ID when available.
hashtagsarray of strings, optionalHashtags found in the post text.
outboundLinksarray of strings, optionalLinks to other sites found in the post text.
quotedPostobject, optionalPublic post quoted by this post when Threads provides the link.
quotedPost.postIdstringStable ID of the quoted post.
quotedPost.postUrlstring (URI)Public URL of the quoted post.
repostedPostobject, optionalPublic post reposted by this post when Threads provides the link.
repostedPost.postIdstringStable ID of the reposted post.
repostedPost.postUrlstring (URI)Public URL of the reposted post.
conversationobject, optionalSource and parent links when this row is a reply.
conversation.rootPostIdstringStable ID of the first post in the conversation.
conversation.rootPostUrlstring (URI)Public URL of the first post in the conversation.
conversation.parentPostIdstringStable ID of the post this reply directly answers.
conversation.parentPostUrlstring (URI)Public URL of the post this reply directly answers.
repliesarray of objects, optionalPublic replies embedded on a targeted post page.
replies[].postIdstringStable public ID of the reply.
replies[].postUrlstring (URI)Public URL for the reply.
replies[].textstring, optionalText shown in the reply. Omitted when the reply has no text.
replies[].authorobjectPublic author details for the reply.
replies[].author.idstringStable public ID of the reply author.
replies[].author.usernamestringPublic Threads username of the reply author.
replies[].author.displayNamestring, optionalPublic display name when shown.
replies[].author.isVerifiedboolean, optionalWhether Threads marks the reply author as verified.
replies[].publishedAtdate-time stringTime when Threads published the reply.
replies[].engagementobject, optionalPublic engagement counts shown for the reply.
replies[].engagement.likeCountinteger, optionalPublic number of likes on the reply.
replies[].engagement.replyCountinteger, optionalPublic number of replies to the reply.
replies[].engagement.repostCountinteger, optionalPublic number of reposts of the reply.
replies[].engagement.quoteCountinteger, optionalPublic number of quote posts for the reply.
replies[].engagement.viewCountinteger, optionalPublic number of views for the reply when Threads shows it.
replies[].mediaarray of objects, optionalImage or video attachments shown in the reply.
replies[].media[].typestringReply media type, either image or video.
replies[].media[].urlstring (URI), optionalDirect reply media URL when Threads exposes one that users can open.
replies[].media[].altTextstring, optionalAlternative text for the reply media when available.
replies[].media[].widthinteger, optionalReply media width in pixels when available.
replies[].media[].heightinteger, optionalReply media height in pixels when available.
replies[].media[].durationSecondsnumber, optionalReply video duration in seconds when available.
replies[].mentionsarray of objects, optionalAccounts mentioned in the reply text.
replies[].mentions[].usernamestringMentioned username in the reply.
replies[].mentions[].idstring, optionalMentioned public account ID when available.
replies[].hashtagsarray of strings, optionalHashtags found in the reply text.
replies[].outboundLinksarray of strings, optionalLinks to other sites found in the reply text.
replies[].conversationobjectSource and parent links for the reply.
replies[].conversation.rootPostIdstringStable ID of the first post in the reply conversation.
replies[].conversation.rootPostUrlstring (URI)Public URL of the first post in the reply conversation.
replies[].conversation.parentPostIdstringStable ID of the post this reply directly answers.
replies[].conversation.parentPostUrlstring (URI)Public URL of the post this reply directly answers.
replies[].quotedPostobject, optionalPublic post quoted by the reply when Threads provides the link.
replies[].quotedPost.postIdstringStable ID of the post quoted by the reply.
replies[].quotedPost.postUrlstring (URI)Public URL of the post quoted by the reply.
replies[].repostedPostobject, optionalPublic post reposted by the reply when Threads provides the link.
replies[].repostedPost.postIdstringStable ID of the post reposted by the reply.
replies[].repostedPost.postUrlstring (URI)Public URL of the post reposted by the reply.

Genuine row from the current beta build

This genuine normalized row comes from a successful current-beta run. It shows five media attachments in source order.

{
"postId": "3987964419053431429_66183940337",
"postUrl": "https://www.threads.com/@fly5466/post/DdYGIKOk6qF",
"author": {
"id": "66183940337",
"username": "fly5466",
"displayName": "Ray Lee",
"isVerified": false
},
"publishedAt": "2026-09-17T05:20:26.000Z",
"text": "【台中的大家打擾了,我們在健行路上開了一間個人日式壽喜燒🍲】\n\n籌備了好幾個月,這兩天我們終於在健行路上悄悄試營運了!\n之前每次自己想吃壽喜燒,總覺得大部分店家都要找一堆人共鍋、吃得很有負擔,所以決定開一間「一個人也能自在慢享、認真涮肉」的日式壽喜燒專賣店。\n\n壽喜燒醬汁是我們反覆調整試煮出來的正統日本風味,肉品現點現切,每一鍋都會附上產銷履歷生食級雞蛋、嚴選米飯與新鮮野菜盤。一個人來不用覺得尷尬,安安靜靜享受一頓溫暖的熱鍋。\n\n下班不知道吃什麼,或是晚上想吃點精緻宵夜的朋友,歡迎推門進來坐坐!\n\n📍 駒澤屋壽喜燒\n 地址:台中市北區健行路 837 號\n 營業時間:18:00 – 00:30",
"engagement": {
"likeCount": 1254,
"replyCount": 116,
"repostCount": 46,
"quoteCount": 0
},
"media": [
{
"type": "image",
"url": "https://scontent-sjc6-1.cdninstagram.com/v/t51.82787-15/813623836_17961710655204338_8730779638694876724_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=104&ig_cache_key=Mzk4Nzk2NDM4MzUxNDgzMDYzMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkNBUk9VU0VMX0lURU0ueHBpZHMuMTAyOS5zZHIucmVndWxhcl9waG90by5DMyJ9&_nc_ohc=9iyZFN3DcGsQ7kNvwF3zmYM&_nc_oc=AdrN9BJ0oVjrRHbAZCqVra9IOTJDFccMr8yl5kHUFps04jT9z9rELCPPRok_112lXNY&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-sjc6-1.cdninstagram.com&_nc_gid=Xy9otXlXKPAZrIP-2U3ZJw&_nc_ss=7a22e&oh=00_AQJwHtyGxDvmRB-Y0cQQ5sJEmijhi36eBNd96e_-GKLGNQ&oe=6AB502FD",
"width": 1029,
"height": 1286
},
{
"type": "image",
"url": "https://scontent-sjc6-1.cdninstagram.com/v/t51.82787-15/813837101_17961710658204338_8380217244733884086_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=101&ig_cache_key=Mzk4Nzk2NDM4NDk4MjY1NDQwMw%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkNBUk9VU0VMX0lURU0ueHBpZHMuMzAyNC5zZHIucmVndWxhcl9waG90by5DMyJ9&_nc_ohc=6ibJZpgb6ugQ7kNvwFKUZYl&_nc_oc=AdpFQvTYE-5qYAnOe1bAk0aaDzpszewt4oRD393XNogU4KDQ7jL6gYfKMVBWeCfuXaA&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-sjc6-1.cdninstagram.com&_nc_gid=Xy9otXlXKPAZrIP-2U3ZJw&_nc_ss=7a22e&oh=00_AQLvnLS7BCiK-6Mbu50KwIvfLn8zg3x2z55v2wHTmlY52A&oe=6AB505D1",
"width": 3024,
"height": 4032
},
{
"type": "image",
"url": "https://scontent-sjc3-1.cdninstagram.com/v/t51.82787-15/800482579_17961710685204338_3131689629277043608_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=106&ig_cache_key=Mzk4Nzk2NDM4NjU3NjUzOTk2NA%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkNBUk9VU0VMX0lURU0ueHBpZHMuMTEyNS5zZHIucmVndWxhcl9waG90by5DMyJ9&_nc_ohc=JuyHruHazHEQ7kNvwEdv7EU&_nc_oc=Ado6Q9fvZnSHDBnkKc_0Z1PxLFVGJ-CalOl5V-ExDkFa5nc2d14isnquQ1rMjFwC1lM&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-sjc3-1.cdninstagram.com&_nc_gid=Xy9otXlXKPAZrIP-2U3ZJw&_nc_ss=7a22e&oh=00_AQLHQEsbi_XFKTaUd5tVsQialtnTf_PfNO3DguC5AIfsMA&oe=6AB50590",
"width": 1125,
"height": 1500
},
{
"type": "image",
"url": "https://scontent-sjc3-1.cdninstagram.com/v/t51.82787-15/813692215_17961710670204338_4835622439120717417_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=103&ig_cache_key=Mzk4Nzk2NDM4NjgxOTgxNzkxMA%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkNBUk9VU0VMX0lURU0ueHBpZHMuMTA4MC5zZHIucmVndWxhcl9waG90by5DMyJ9&_nc_ohc=6AAxZo2sIkIQ7kNvwH00Xuu&_nc_oc=Adrxgq7G6jmSpTIEUIf60vucBsUVlyjE2AS--hoarh04q155V1t1qsy46hvruUWKOzI&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-sjc3-1.cdninstagram.com&_nc_gid=Xy9otXlXKPAZrIP-2U3ZJw&_nc_ss=7a22e&oh=00_AQI-qn2AlEf45zkACRB77oOQZTYzY5BAi-eN56s7o7AAGw&oe=6AB4F727",
"width": 1080,
"height": 810
},
{
"type": "image",
"url": "https://scontent-sjc6-1.cdninstagram.com/v/t51.82787-15/812875114_17961710661204338_9217804103085283690_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=107&ig_cache_key=Mzk4Nzk2NDM4NjUyNjI3OTk5Nw%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkNBUk9VU0VMX0lURU0ueHBpZHMuMTA2MS5zZHIucmVndWxhcl9waG90by5DMyJ9&_nc_ohc=ENyL4O-MWf0Q7kNvwHW0ZZU&_nc_oc=AdoAvI0o2O1fY7ktzkhPFIOva_KE_ygMPSdySpRKnF5PNIR7qnIBcsg-WbU3PVaxRso&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-sjc6-1.cdninstagram.com&_nc_gid=Xy9otXlXKPAZrIP-2U3ZJw&_nc_ss=7a22e&oh=00_AQJ1mh1eU-wYLu_8_IWhMkkt71Aqp8pyT7oSFlSMKTzN6w&oe=6AB51114",
"width": 1061,
"height": 1500
}
]
}

💳 Pricing

Charged event

Post charges for one public Threads post saved to the dataset. The event applies to a successful post returned by the Actor.

How charging works

The Actor charges once for each public post it returns. A run that returns no post does not trigger this post event. Set Maximum posts to keep a run and its charge count focused, or leave it empty to collect all available results until the source is exhausted.

🔌 Integrations

Dataset and API

Read the results through the standard Apify dataset and API output. You can export the saved rows or connect them to a workflow from the run output.

❓ FAQ

What happens when I submit several keywords or hashtags?

The Actor searches every submitted value with one shared sort, date, author, and maximum-post setting. Use separate runs when each search needs different filters or limits.

Can I look up a post by URL or numeric ID?

Yes. Choose Post URL or ID and enter one or more public Threads URLs or numeric post IDs. Search sorting, date, and author filters do not apply to direct lookups.

Can I search private Threads posts?

No. The Actor covers the public search and public post-page surface only. It does not require a buyer-supplied Threads credential for that public data.

Will it collect every reply in a conversation?

It can include public replies embedded on a targeted post page. It does not promise a full reply tree or nested replies that the public page does not show.

What if Threads does not show a field?

That field is omitted from the row when it is optional and unavailable. For example, post text, media details, view counts, and engagement counts depend on what Threads exposes.

How can I keep a run smaller?

Set Maximum posts to a positive number. For keyword and hashtag searches, you can also use a date range, a recent-days window, or an author filter. Leaving the limit empty returns all available results until the source is exhausted.

📝 Changelog

v1.0 (12-09-2026)

  • Empty keyword searches keep the dataset empty and show a warning with the keyword and selected filters while processing continues.
  • Search results keep only posts that contain the submitted keyword and match the selected filters.
  • Results use normalized public post fields and public replies, without the former detailed source-data option.

v0.0

  • Initial release.

🆘 Support

For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡

Made with ❤️ by Maxime Dupré