Threads Scraper — Posts, Profiles, Replies, No Login avatar

Threads Scraper — Posts, Profiles, Replies, No Login

Pricing

from $1.05 / 1,000 results

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

Threads Scraper — Posts, Profiles, Replies, No Login

Public Threads data without login or cookies: profiles, latest posts, single posts with replies, keyword or hashtag samples, and only-new-posts alerts. Clean JSON, CSV or Excel. $1.50 per 1,000 results.

Pricing

from $1.05 / 1,000 results

Rating

0.0

(0)

Developer

Dottti

Dottti

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Security

Limited permissions

Share

Threads Scraper: Posts, Profiles, Replies, No Login

Get public Threads data from threads.com and threads.net. You get profiles, their latest posts, single posts with their replies, and a quick keyword or hashtag sample. An alert mode delivers only the posts that are new since the last run.

The actor needs no Threads account, no cookies and no browser. It reads the same public data that Threads shows to a logged-out visitor.

  • Price: $1.50 per 1,000 results ($0.0015 each) on the Apify Free plan, less on paid plans (down to $1.05). A result is one profile row or one post row. Status rows are free. Platform usage is included.
  • First run: the form is prefilled with two profiles (nasa, zuck) and one post. Click Start and you get 2 profiles and 31 posts and replies in about 5 seconds, for $0.05 (tested 4 November 2026).

Who uses it

  • Social media managers who track their own accounts and competitors: likes, replies, reposts and quotes per post.
  • Brand monitoring teams who watch a list of accounts or posts on a schedule and want only the new posts and replies.
  • Researchers who collect public posts from news outlets, public figures or agencies for analysis.
  • AI pipelines and agents that need clean JSON: post text, author, time, counts, media links, mentions and hashtags.

What you get

Every row has a type field.

  • profile: username, full name, bio, follower count, verified flag, private flag, profile picture, bio links, profile topic tags.
  • post: id, code, link, author, text, time posted (ISO 8601, UTC), likes, replies, reposts, quotes, reshares, media type, media links (images, videos with thumbnail, carousels), hashtags, topic tag, mentions, links, the quoted or reposted post, and who it replies to.
  • status: one row for each input that returned nothing (missing account, deleted post, bad link, blocked). Status rows are free.

Post rows also say where they came from in sourceType:

  • profile: a post from a profile you listed.
  • post: the post link you listed.
  • author_thread: the author's own follow-up posts under that post.
  • parent: the posts above it, when your link is a reply.
  • reply: a reply to your post link. replyToPostCode names the post.
  • search: a result for a keyword. searchQuery names the keyword.

When an author writes a thread of several posts, each post is its own row. threadRootCode and threadPosition keep them in order.

Examples from real runs (21 October 2026)

Input:

{
"profiles": ["zuck", "nasa", "natgeo", "mosseri", "skynewsarabia"],
"postUrls": [
"https://www.threads.com/@zuck/post/Ddt7cL5EfUG",
"https://www.threads.com/@natgeo/post/DeujURDilYs"
]
}

Result: 132 rows (5 profiles, 127 posts and replies), 7 of 7 inputs ok, 16 requests, 8 seconds.

A profile row (image link shortened here):

{
"type": "profile",
"id": "63269174602",
"username": "natgeo",
"url": "https://www.threads.com/@natgeo",
"fullName": "National Geographic",
"bio": "Step into wonder and find your inner explorer with National Geographic 🌎",
"followerCount": 18394232,
"isVerified": true,
"isPrivate": false,
"profilePicUrl": "https://instagram.famm3-3.fna.fbcdn.net/v/t51.82787-19/684235167_17961...",
"bioLinks": [{ "url": "https://on.natgeo.com/instagram", "title": "" }],
"profileTags": [],
"input": "natgeo",
"scrapedAt": "2026-10-21T14:27:12.162Z"
}

A post row (text and media links shortened here):

{
"type": "post",
"id": "4012299642364122668",
"code": "DeujURDilYs",
"url": "https://www.threads.com/@natgeo/post/DeujURDilYs",
"username": "natgeo",
"userFullName": "National Geographic",
"userId": "63269174602",
"userVerified": true,
"text": "Presented by @Rolex. Pangolins face intense pressure from illegal wildlife trafficking across Africa. ...",
"createdAt": "2026-10-20T19:10:49.000Z",
"likeCount": 440,
"replyCount": 6,
"repostCount": 24,
"quoteCount": 2,
"reshareCount": 2,
"mediaType": "video",
"media": [
{
"type": "video",
"url": "https://instagram.famm3-1.fna.fbcdn.net/o1/v/t16/f2/m84/AQMclVMGauL-h2...",
"width": 720,
"height": 1280,
"thumbnailUrl": "https://instagram.famm3-3.fna.fbcdn.net/v/t51.71878-15/858606769_11287..."
}
],
"hashtags": [],
"topicTag": null,
"mentions": ["rolex"],
"links": [],
"isReply": false,
"replyToUsername": null,
"quotedPost": null,
"repostedPost": null,
"isPinned": false,
"isPaidPartnership": false,
"isEdited": false,
"language": null,
"threadRootCode": "DeujURDilYs",
"threadPosition": 1,
"sourceType": "profile",
"sourceInput": "natgeo",
"scrapedAt": "2026-10-21T14:27:13.887Z"
}

A reply row has the same fields. These fields show the link to the post it answers:

{
"isReply": true,
"replyToUsername": "zuck",
"sourceType": "reply",
"sourceInput": "https://www.threads.com/@zuck/post/Ddt7cL5EfUG",
"replyToPostCode": "Ddt7cL5EfUG"
}

A status row for an account that does not exist:

{
"type": "status",
"input": "thisuserdoesnotexist_zz9q",
"kind": "profile",
"status": "not_found",
"error": "Threads shows its login page for this account: it does not exist, is private, or was removed.",
"charged": false
}

Input examples

Latest 50 posts from three accounts, without the profile row:

{ "profiles": ["nasa", "@natgeo", "https://www.threads.net/@mosseri"], "maxPostsPerProfile": 50, "includeProfileDetails": false }

One post and up to 200 replies:

{ "postUrls": ["https://www.threads.com/@zuck/post/Ddt7cL5EfUG"], "maxReplies": 200 }

Posts from the last 7 days only:

{ "profiles": ["skynewsarabia"], "maxPostsPerProfile": 200, "postedAfter": "7 days" }

A quick sample for a keyword and a hashtag:

{ "searchQueries": ["climate", "#nasa"] }

Accepted inputs: nasa, @nasa, https://www.threads.com/@nasa, https://www.threads.net/@nasa, post links like https://www.threads.com/@nasa/post/CODE, and short links like https://www.threads.com/t/CODE. Tracking parameters such as ?xmt= are ignored.

Alerts: only new posts

  1. Turn on Only new posts (alert mode).
  2. Give the watchlist a name in Alert state name, for example competitors.
  3. Schedule the actor, for example every hour.

The first run delivers everything and saves a baseline. Each later run delivers only posts and replies that were not there before. You pay only for the new rows. Profile rows still arrive on every run, so you can track follower counts. Turn off Include profile details row to skip them.

The saved state lives in the key-value store threads-scraper-state, under STATE-<name>. Use a different name for each schedule.

Pricing

Pay per result: $1.50 per 1,000 results ($0.0015 per row) on the Free plan, $1.35 on Bronze, $1.20 on Silver and $1.05 on Gold. A result is one profile row or one post row. Status rows are free. Platform usage is included in the price.

You set the spending limit for each run. The actor checks it before every push. When the limit is reached, it stops and marks the remaining inputs as skipped_cost_limit.

What a run uses, measured on 21 October 2026:

RunResultsRequestsData
5 profiles × 20 posts, 2 post links × 20 replies132161.6 MB
1 profile × 193 posts, 1 post link × 300 replies495261.3 MB

That is 2.6 to 12 MB and 50 to 120 requests per 1,000 results. Short profiles cost more per result, because each profile page is about 160 KB. Runs take 2 to 8 seconds for typical inputs on 256 MB of memory.

How it works

Threads sends logged-out visitors a page with the first posts as JSON inside the HTML. The same page names the query that loads more. The actor reads that JSON, then asks the same public endpoint for the next pages, 15 threads at a time. Pages are fetched compressed. No browser runs, so memory stays at 256 MB.

Proxy: by default the actor first connects with no proxy. If Threads blocks it, it moves to Apify datacenter proxy, then to residential proxy. You can turn off the residential step, or set your own proxy.

Limits

These limits come from what Threads shows logged-out visitors:

  • Profiles: about the latest 150 threads per profile. In tests this was 190 to 230 posts. Older posts need a login, which this actor does not use.
  • Replies: Threads shows its top replies first. Some replies stay hidden from logged-out visitors. For example, a post with 6 replies showed 4.
  • Search: only the first page of Top results, about 15 posts per keyword. The Recent tab needs a login. Use search for quick samples. For full coverage, list the accounts you care about.
  • Reposts: the profile tab returns the account's own posts. Posts the account reposted are not in that tab.
  • View counts: Threads does not show them to logged-out visitors, so they are not in the output.
  • Private, missing or removed accounts all lead to the Threads login page. The status row says not_found and explains this.
  • Media links are signed links from the Threads CDN. They expire after some days. Download the files soon if you need them.

This actor collects public data only. It does not log in, does not collect follower or following lists, and does not read private accounts or messages. You are responsible for using the data in line with the Threads terms and the privacy laws that apply to you.

Run summary

Each run saves RUN_SUMMARY in the default key-value store. It holds the status of every input, rows by type, requests, bytes, retries and the proxy tier used.

Input statuses: ok, not_found, invalid_input, no_results, blocked, api_error, cut_by_cost_limit, skipped_cost_limit.

Input reference

FieldDefaultWhat it does
profilesemptyUsernames or profile links.
postUrlsemptyPost links. Each gives the post, the author's follow-ups, parents and replies.
searchQueriesemptyKeywords or hashtags. First page of Top results only.
maxPostsPerProfile20Posts per profile. 0 = profile row only.
includeProfileDetailstrueAdds the profile row.
maxReplies20Replies per post link. 0 = none.
includeParentPoststrueAdds the posts above a reply.
maxPostsPerSearch15Cap per keyword.
postedAfteremptyDate or relative time, such as 2026-10-01 or 24 hours.
onlyNewfalseAlert mode. Delivers only new posts and replies.
stateNamedefaultName of the saved alert state.
maxConcurrency3Inputs fetched at once (1 to 6).
proxyConfigurationemptyForce a proxy. Empty = automatic ladder.
autoProxyFallbacktrueMove to a proxy when blocked.
allowResidentialFallbacktrueAllow residential proxy as the last step.
maxRetries4Retries per request.

With an empty input, the actor runs a small demo on the public nasa profile.