Threads Scraper - Profiles, Posts & Keyword Search, No Login avatar

Threads Scraper - Profiles, Posts & Keyword Search, No Login

Pricing

$1.49 / 1,000 profile or posts

Go to Apify Store
Threads Scraper - Profiles, Posts & Keyword Search, No Login

Threads Scraper - Profiles, Posts & Keyword Search, No Login

Get public Threads data by username, post URL or keyword: profile name, bio, exact follower count and verified badge, plus post text, publish time, likes, replies, reposts, quotes and media URLs. No login or cookies. Deduplicated; incomplete inputs are marked partial, never shown as empty.

Pricing

$1.49 / 1,000 profile or posts

Rating

0.0

(0)

Developer

Lantern Lab

Lantern Lab

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Threads Scraper - Profiles, Posts & Keyword Search

Give it Threads usernames, post URLs or keywords and get the public data back: for a profile its name, bio, follower count and verified badge; for every post its text, publish time, likes, replies, reposts, quotes, media URLs and post ID. No Threads or Instagram login, no cookies, no account of your own. $1.49 per 1,000 rows, no start fee. See Pricing.

Input:

{
"usernames": ["zuck", "https://www.threads.com/@natgeo"],
"postUrls": ["https://www.threads.com/@zuck/post/DeZtp-TkQHh"],
"searchQueries": ["apify"],
"maxPostsPerProfile": 15
}

Output - one row per post (recordType: "post") and one per profile (recordType: "profile"); per-input status rows and the run summary are free. Sample from a real run:

{
"recordType": "post",
"postId": "4006434140014576097",
"postCode": "DeZtp-TkQHh",
"url": "https://www.threads.com/@zuck/post/DeZtp-TkQHh",
"text": "Introducing Muse Wonder, our new family of frontier models…",
"publishedAt": "2026-10-12T16:56:29.000Z",
"likeCount": 2112,
"replyCount": 527,
"repostCount": 168,
"quoteCount": 60,
"mediaUrls": ["https://scontent-kul2-2.cdninstagram.com/v/t51.82787-15/844965867…"],
"authorUsername": "zuck",
"authorUserId": "63055343223",
"threadRootId": "4006434140014576097",
"parentPostId": null,
"isThreadRoot": true,
"inputKind": "profile",
"inputValue": "zuck",
"rank": 1,
"partial": false,
"partialReason": null,
"collectedAt": "2026-10-24T03:21:44.108Z"
}
{
"recordType": "profile",
"userId": "63055343223",
"username": "zuck",
"fullName": "Mark Zuckerberg",
"bio": "Mostly superintelligence and MMA takes",
"followerCount": 5753638,
"isVerified": true,
"isPrivate": false,
"profileUrl": "https://www.threads.com/@zuck",
"postsCollected": 33,
"partial": false,
"collectedAt": "2026-10-24T03:21:44.108Z"
}

What you can and cannot get

Profilesusername, fullName, bio, followerCount, isVerified, isPrivate, profilePicUrl, profileUrl, userId
PostspostId, postCode, url, text, publishedAt, likeCount, replyCount, repostCount, quoteCount, mediaUrls, authorUsername, authorUserId
Thread structurethreadRootId and parentPostId on every post, so an author's own multi-post thread stays readable in order. parentPostId is null on the post that starts a thread.
Not collectedReplies written by other accounts under a post. Followers and following lists. Anything behind a login, a private account or an age restriction. Email addresses, phone numbers and other personal contact details are not read even when a page carries them.

Limits, stated up front

  • About 15 threads per profile and per keyword. Threads renders a fixed window of the newest threads into a public profile or search page and offers no next page there without an account. One profile page measured 2026-10-24 listed 15 threads and 33 posts counting the author's own continuations of them. Ask for more with maxPostsPerProfile and the run writes everything the page carried and marks that profile partial with partialReason: "profile_page_limit" - a short list is never passed off as a short profile.
  • No view count. Threads does not put it on the public page, so the field is not invented; likes, replies, reposts and quotes are all there.
  • No reply collection. Replies under a post are out of scope for this Actor.
  • Follower counts are exact, not the rounded "5.8M" the page shows.

Rows that cost nothing

Every input - each username, post URL and keyword - also gets one free input_status row saying what it returned and whether that is all there was, and the run ends with a free RUN_SUMMARY row. Only profile and post rows are charged, and a post that matched several of your inputs is written and charged once.

That is what keeps an incomplete run honest:

partialReasonWhat happened
nullThe input returned everything its public page carried. postsReturned: 0 with no reason is a real empty result - a keyword that matched nothing renders an empty result list, which is how it is told apart from a page that carried no data.
no_data_in_pageThreads answered with its logged-out page, which carries no data. The same answer comes back for a name that does not exist, a private account and a screened request, so this is never reported as zero posts.
profile_page_limitMore posts were asked for than the public profile page lists. Everything on the page was collected.
post_not_on_pageThe page for a post URL did not carry that post. A deleted post, an author who went private and a post Threads withheld all answer the same way, so it is not reported as a post with no content.
blockedThreads refused the request (rate limit or challenge page). Nothing was collected for that input; it does not mean there are no posts.
upstream_request_capThe run reached maxUpstreamRequests.
charge_limit_reachedThe maximum charge set for the run was reached.
upstream_errorA request failed in a way retrying inside the run would not fix.
not_collectedThe run stopped earlier and never reached this input.
unexpected_page_shapeThe page was read but did not carry the data in the shape this Actor knows.

A run that collected nothing because every page was refused or withheld fails; a run that legitimately found nothing succeeds with zero charged rows.

Pricing

Pay per result: $1.49 per 1,000 rows, no start fee, no monthly fee. A row is one profile or one post. Status rows, the run summary, duplicates and anything an input could not return are free, so a blocked or empty input costs nothing.

Input reference

FieldDefaultNotes
usernames—zuck, @zuck or a profile URL. Up to 500.
postUrls—/@user/post/<code> or /t/<code>, on threads.com or threads.net. Up to 500.
searchQueries—One keyword or phrase per entry. Up to 500.
maxPostsPerProfile15Upper bound on post rows per profile. Max 200, but see the limit above.
maxUpstreamRequestsderivedHard ceiling on requests to Threads: one per profile, post URL and keyword. Derived from your input when left empty, so a run is never unbounded.
proxyConfigurationApify ProxyDatacenter is what this Actor is measured on. Switch to residential if rows come back blocked.

At least one of usernames, postUrls or searchQueries is required. Entries that are not a Threads username, post URL or keyword are reported in the run summary as unusableInputs and skipped; they do not fail the run. Repeated entries are collapsed before the first request.

How it works

One HTTP GET per input against the public page, with no account, token or cookie: threads.com server-renders its public profile, post and search pages for indexing, and that rendering carries the page's own data as JSON inside the HTML. The Actor reads that JSON and writes the fields above; a field Threads did not send is null, never guessed.