Threads Scraper (profiles, posts, replies, search) · Apify
Threads Scraper — Posts, Profiles, Replies & Search, No Login avatar

Threads Scraper — Posts, Profiles, Replies & Search, No Login

Pricing

from $0.80 / 1,000 result items

Go to Apify Store
Threads Scraper — Posts, Profiles, Replies & Search, No Login

Threads Scraper — Posts, Profiles, Replies & Search, No Login

Search Threads by keyword, or pull any public profile's posts, a post's replies, and related posts — no login, no cookies. Flat rows with text, likes, replies, reposts, media and follower counts. Monitor mode alerts on new or changed posts per keyword or profile.

Pricing

from $0.80 / 1,000 result items

Rating

0.0

(0)

Developer

Viktor Dubnytskiy

Viktor Dubnytskiy

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

5 days ago

Last modified

Categories

Features

Limited permissions

Share

Threads Scraper: Posts, Profiles, Replies & Search, No Login

Search Threads by keyword or #hashtag, or scrape a public brand or creator profile's posts, a post with its replies, and related posts, as flat rows without logging in. No account, no cookies, no session: only what Threads serves to logged-out visitors.

Try it: the prefilled example returns 6 rows in about 6 seconds. Results cost $1 per 1,000.

What you get

One row per post or profile. Real rows from the example dataset (profile @nasa, text truncated here):

typeusernametext / biolikes / replies / repoststakenAt
profilenasaMaking the seemingly impossible, possible. ✨ (followerCount 12,794,712)
postnasaDo you want to be an astronaut? Applications are now open to join...1,872 / 99 / 1542026-11-07T20:03:13+00:00
postnasaPOV: Scenes from Day 1 of MAX POWER, an aerospace technology expo and...453 / 8 / 172026-11-08T01:43:22+00:00
postnasaThe ‘A’ in NASA that people forget? Aeronautics. ✈️ This is a recent...4,782 / 148 / 1592026-11-06T18:38:05+00:00

A search query yields the same post shape with source: "search" and searchQuery set. includeProfile controls whether the type: profile row (bio and followers of the account you asked for) is emitted per profile.

Full post row: id, url, code, username, isVerified, text, takenAt (UTC), likeCount, replyCount, repostCount, quoteCount, reshareCount, mediaType (text/image/video/carousel), images[], videos[], linkUrl, linkTitle, replyToUsername, isReply, rootPostId, language, isPaidPartnership, source (profile/post/reply/related/search), searchQuery, scrapedAt.

Post rows carry the author's handle (it is part of the post URL) and no other profile data: no user id, display name, bio or follower count. replyToUsername is filled only when a post answers its own author (a thread); a reply to someone else has it empty. @mentions in post text and link titles are replaced with @user. Profile data (name, bio, followers) appears only in the type: profile row for the accounts you list under profiles; that row has no user id or avatar, and e-mail addresses and phone numbers are removed from the bio.

Use cases

  • Keyword and brand monitoring. Put keywords or #hashtags under searches, run them on a schedule, and get the posts that appeared since the last run.
  • Brand and competitor tracking. Watch what a brand or creator account posts, how it performs and how its follower count moves.
  • One-off reply reading. Pull a specific post's reply feed once to see what the audience said.

Try it

One-off keyword search: searches: ["climate tech", "#nasa"], maxPostsPerSearch: 20, maxItems: 40. Add postedAfter: "7" for the last 7 days only. Or use profiles: ["nasa"] or a postUrls permalink; the prefilled input (profiles: ["nasa"]) works with nothing to fill in.

Monitor mode: save the input as a task, set mode: "monitor" and a monitorStateId (e.g. "climate-tech-watch"), then schedule it (Apify, Schedules, e.g. every 3 hours). The first run stores a baseline and returns nothing. Each later run returns posts that were not seen before and were posted after the previous successful run started (minus 15 minutes), plus known posts whose like, reply or repost count changed (changeType: "changed"). Older posts that only now show up in the results are skipped and not charged: Threads reshuffles its search page on every visit, and without this rule old posts would come back as "new". Test 2026-11-09 on coffee, #espresso and nasa: the baseline stored the results; a run 3 minutes later returned 5 new posts (all posted after the baseline run started, minus 15 minutes) and 5 known posts with changed counts, and skipped 29 older posts that Threads had reshuffled into the results. In monitor mode maxPostsPerSearch is not applied: every post on the search page is compared, so none is missed. Alerts can go to webhookUrl or Telegram. Monitor-check is $0.005 per run and change is $0.001 per new or changed row.

How it works

  1. Searches. For each keyword the actor reads Threads' main search list (serp_type=default, serp_type=tags for #hashtags), which is mostly recent posts. On 2026-11-09 that list often failed on Threads' side (a server timeout inside a normal page, or HTTP 429). When it fails, the actor reads the same query's plain search page instead, which is Threads' static top list of older popular posts, and stays on it for the rest of the run. RUN_SUMMARY.searchSurfaces shows which list each query came from (default/tags or fallback). includeHashtagResults also reads the #hashtag results of one-word keywords and merges them.
  2. Profiles. The public profile page gives one type: profile row (bio, followers, verified) plus the posts Threads preloads on it.
  3. Post URLs. The post itself (source: post), the replies the public post page carries (source: reply, about the first 10) and, with includeRelated, the related-posts block.
  4. Residential proxy is required (Threads serves an empty shell to datacenter IPs). Every failed page is retried once. A run that returns nothing because of a failure ends as blocked, rate_limited or upstream_error in RUN_SUMMARY.emptyReason, never as "no results", and a run where only some sources failed lists them in RUN_SUMMARY.sourceFailures.

Input

FieldMeaningDefault
searchesKeywords or #hashtags to search Threads forempty
maxPostsPerSearchCap on rows taken per search query (scrape mode only)25
includeHashtagResultsOne-word keywords: also read the #hashtag resultsfalse
postedAfterDate (2026-11-01) or number of days (7)any date
profilesUsernames or profile URLs, e.g. nasaempty (prefilled with nasa)
postUrlsPost permalinks to open with their repliesempty
includeProfileEmit one type: profile row per profiletrue
includeRepliesFor postUrls: include the reply feedtrue
includeRelatedFor postUrls: include Threads' related postsfalse
maxItemsStop after this many rows overall20
modescrape, or monitor (new posts and count changes since the last run)scrape
monitorStateId, webhookUrl, telegramBotToken, telegramChatIdMonitor-mode state key and alert targetsempty

Pricing

EventPrice
result$0.001 per row ($1 per 1,000)
monitor-check$0.005 per monitor run
change$0.001 per new/changed row

You pay only for rows actually pushed. Apify platform usage (residential proxy, required) is billed on top and paid by you: about $0.002 per search query or profile page.

Found it useful? A short review on the Store page helps other people find this actor and tells us what to improve. If something is wrong, open an issue on the actor page; we answer issues within a day.

Why this actor

  • No login and no cookies to supply, so your Threads account is never involved.
  • Keyword and #hashtag search, profiles, and single posts with replies in one actor.
  • Monitor mode that skips reshuffled old posts, with webhook and Telegram alerts.
  • A run that returns nothing charges no result events, and a failure is reported as a failure, not as an empty dataset.

Limits

  • Search gives one page of about 20 posts per query (up to about 28 when replies match). Logged-out Threads has no further pages, so more posts need more queries.
  • The fresh main search list is unstable: on 2026-11-09 it failed on most tries, and the actor then returns Threads' top list for the query, which is mostly older posts. A date filter or a monitor on such a run finds fewer posts.
  • Profiles give what the public profile page preloads, usually the newest 5 to 15 posts; posts give the first ~10 replies. Deeper pagination needs a logged-in session, which this actor does not use.
  • Private profiles and age-gated content are not available. Counts are as Threads shows them at scrape time.
  • Monitor mode changed on 2026-11-09 (new-post rule above); tasks created before that start with a fresh baseline run.

FAQ

Does it need a Threads or Instagram login? No. There is no account or cookie field, which is also why pagination stops where the public page stops.

How many posts do I get per profile? Whatever Threads preloads on the public profile page, usually the newest 5–15. For more history, put the post URLs you already have into postUrls.

What happens when there are no results? No rows are pushed and no result events are charged. The RUN_SUMMARY record in the run's key-value store carries emptyReason, so an empty run is distinguishable from a block.

Changelog

  • 0.1 (2026-11-09, later the same day): breaking: post rows no longer have userId, profile rows no longer have userId or profilePicUrl, and replyToUsername is empty when a post replies to another account. profiles has no default any more, so an API run with only searches no longer adds NASA rows (the Console form is still prefilled). Replies on post pages work again (Threads moved them in its page data; 0 replies were returned since about 0.1.12). E-mails and phone numbers are removed from profile bios; @mentions are masked in link titles too.
  • 0.1 (2026-11-09): #hashtag search and includeHashtagResults; postedAfter date filter; fallback to the plain search page when Threads' main list fails (server timeout or 429); failed pages now end the run as blocked, rate_limited or upstream_error instead of "no results", and partial failures are listed in RUN_SUMMARY.sourceFailures; monitor counts a post as new only when it was posted after the previous run started; post rows no longer carry the author's user id, and @mentions in post text are masked.
  • 0.1 (2026-09-26): keyword search re-verified, maxPostsPerSearch added, a walled run blocks even for a single keyword or profile.
  • 0.1: initial release with profiles, posts with replies, search and monitor mode.