Threads Search Post Scraper avatar

Threads Search Post Scraper

Pricing

$2.65 / 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 structured text, author, date, engagement, links, conversation data, and optional detailed source fields in an Apify dataset.

Pricing

$2.65 / 1,000 posts

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

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 structured rows with post text, public author details, publication time, available engagement counts, source links, and related public 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. Turn on detailed source data to add selected source-level fields from Threads to the same row.

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.
  5. Turn on Include detailed source data when you need the selected source-level fields alongside normalized data.

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.
includeSourceDatabooleanAdd selected detailed source-level fields alongside the normalized post data.

Example input

The following small input uses a keyword search, recent ordering, one-post limit, and normalized output.

{
"findPostsBy": "keyword",
"keywords": [
"OpenAI"
],
"sortOrder": "recent",
"maxItems": 1,
"includeSourceData": false
}

🧾 Output

Run output

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

The dataset contains normalized post rows by default. When includeSourceData is true, the same normalized fields remain and a source object is added.

Normalized public post row

The table below is complete for a row without detailed source data. 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. A carousel uses multiple media items.
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.

Example normalized row

This is a genuine row from a successful run with detailed source data turned off.

{
"postId": "3966878386803679869_63477724337",
"postUrl": "https://www.threads.com/@legalmiga/post/DcNLuAYm6J9",
"author": {
"id": "63477724337",
"username": "legalmiga",
"displayName": "Taylor M. Tieman, Esq. | Business + Trademark Lawyer",
"isVerified": true
},
"publishedAt": "2026-08-19T03:06:15.000Z",
"text": "today, @openai launched a teen mode for chatGPT\n\non this episode of \"what could go wrong?!\"\n\n...",
"engagement": {
"likeCount": 123,
"replyCount": 13,
"repostCount": 7,
"quoteCount": 0
},
"mentions": [
{
"username": "openai",
"id": "63299409527"
}
]
}

Detailed public post row

When includeSourceData is true, the row keeps every normalized field above and adds the source branch below. The table repeats the shared fields so this shape is complete.

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.
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.
sourceobjectSelected public fields returned by Threads when detailed source data is requested.
source.idstringSource identifier for the post.
source.codestring, optionalShort code Threads uses for the post when available.
source.canonicalUrlstring (URI), optionalCanonical post URL supplied by Threads when available.
source.captionstring, optionalPost text supplied by Threads when available.
source.takenAtnumberPublication time as a Unix timestamp in seconds.
source.userobjectAuthor object supplied by Threads.
source.user.idstringSource identifier for the author.
source.user.usernamestringSource username for the author.
source.user.fullNamestring, optionalFull name supplied by Threads when shown.
source.user.isVerifiedboolean, optionalWhether Threads marks the source author as verified.
source.likeCountinteger, optionalPublic like count supplied by Threads when available.
source.replyCountinteger, optionalPublic reply count supplied by Threads when available.
source.repostCountinteger, optionalPublic repost count supplied by Threads when available.
source.quoteCountinteger, optionalPublic quote count supplied by Threads when available.
source.viewCountinteger, optionalPublic view count supplied by Threads when available.
source.mediaarray of objects, optionalSelected media fields supplied by Threads for the post.
source.media[].typestringSource media type, either image or video.
source.media[].urlstring (URI), optionalDirect source media URL when available.
source.media[].altTextstring, optionalAlternative text supplied by Threads when available.
source.media[].widthinteger, optionalSource media width in pixels when available.
source.media[].heightinteger, optionalSource media height in pixels when available.
source.media[].durationSecondsnumber, optionalSource video duration in seconds when available.

Example detailed row

This is a genuine row from a successful run with detailed source data turned on.

{
"postId": "3954859909900432925_40976579231",
"postUrl": "https://www.threads.com/@anilbhawsar2963/post/DbifCJiDHYd",
"author": {
"id": "40976579231",
"username": "anilbhawsar2963",
"displayName": "Anil Bhawsar Jirafe",
"isVerified": false
},
"publishedAt": "2026-08-02T13:07:41.000Z",
"engagement": {
"likeCount": 0,
"replyCount": 0,
"repostCount": 0,
"quoteCount": 0
},
"media": [
{
"type": "video",
"url": "https://media4.giphy.com/media/v1.Y2lkPWFlZWNjYzExdm8zcjFodzJrOWYyNjg0Y3M0bTNhNWlmNWNmanI2MTFnNHVmMTQ5NiZlcD12MV9naWZzX2dpZklkJmN0PWc/9nUtl7JLuXeg/200.gif",
"altText": "Lady GIF",
"width": 266,
"height": 200
}
],
"conversation": {
"rootPostId": "3932980370346228618_39283617667",
"rootPostUrl": "https://www.threads.com/@snjuuu_p79/post/DaUwM8bEjuK",
"parentPostId": "3932980370346228618_39283617667",
"parentPostUrl": "https://www.threads.com/@snjuuu_p79/post/DaUwM8bEjuK"
},
"source": {
"id": "3954859909900432925_40976579231",
"takenAt": 1785676061,
"user": {
"id": "40976579231",
"username": "anilbhawsar2963",
"fullName": "Anil Bhawsar Jirafe",
"isVerified": false
},
"code": "DbifCJiDHYd",
"canonicalUrl": "https://www.threads.com/@anilbhawsar2963/post/DbifCJiDHYd",
"likeCount": 0,
"replyCount": 0,
"repostCount": 0,
"quoteCount": 0,
"media": [
{
"type": "video",
"url": "https://media4.giphy.com/media/v1.Y2lkPWFlZWNjYzExdm8zcjFodzJrOWYyNjg0Y3M0bTNhNWlmNWNmanI2MTFnNHVmMTQ5NiZlcD12MV9naWZzX2dpZklkJmN0PWc/9nUtl7JLuXeg/200.gif",
"altText": "Lady GIF",
"width": 266,
"height": 200
}
]
}
}

💳 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.

What does detailed source data add?

Set includeSourceData to true to add selected source-level fields such as the source ID, short code, canonical URL, caption, Unix publication time, source author, counts, and media data alongside the normalized fields.

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

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é