Threads Scraper - Profiles & Posts, No Login avatar

Threads Scraper - Profiles & Posts, No Login

Pricing

from $0.40 / 1,000 threads profile or posts

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

Threads Scraper - Profiles & Posts, No Login

Threads answers on threads.com now; threads.net redirects across, so either URL or a bare handle works. Public profiles and recent posts, no login: bio, followers, text, likes, exact times, images, video and reply flags. $0.40/1,000 rows plus $0.001 a run. Blocked look-ups free.

Pricing

from $0.40 / 1,000 threads profile or posts

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

2 days ago

Last modified

Share

Threads Profiles & Recent Posts Scraper

Threads answers on threads.com now, and threads.net still 301s across to it, so either URL form resolves and so does a bare handle. A list of them returns a profile row for each, plus their recent public posts one row at a time: the text, the like count, the exact publish time, any image URLs, and flags for video and replies.

No Threads login. It resolves the profile from the crawler-facing metadata Threads publishes, then reads the public profile-posts query for the recent posts. HTTP only — no browser.

What it returns

Every row carries a recordType, so you can split the dataset in one pass.

profile rows (recordType: "profile"):

FieldWhat it holds
username, displayNamethe handle and the public display name
biopublic bio text
followerCountfollower count as Threads publishes it — see the note below
profilePicUrl, profileUrlavatar image and the canonical public profile URL
isVerifiedfrequently null; Threads doesn't put it in the public metadata for every account
id, sourcestable row id and which path the data came from

post rows (recordType: "post"):

FieldWhat it holds
postId, postCode, postUrlids and the canonical threads.com/@user/post/... link
usernamethe author handle
textthe public post text
likeCountlikes, or null when Threads doesn't expose a count
publishedAtISO timestamp
imageUrlsup to five public image URLs
hasVideo, isReplybooleans for media type and whether the post is a reply

A real pair of rows:

{
"recordType": "profile",
"username": "zuck",
"displayName": "Mark Zuckerberg",
"bio": "Mostly superintelligence and MMA takes.",
"followerCount": 5700000,
"profileUrl": "https://www.threads.com/@zuck",
"source": "threads_public_ssr"
}
{
"recordType": "post",
"postId": "3960563624733395242",
"username": "zuck",
"text": "I believe everyone should have access to superintelligence, and I wrote a long piece about Meta's philosophy and values for building a positive future for everyone.",
"likeCount": 2127,
"publishedAt": "2026-08-10T09:59:57.000Z",
"postUrl": "https://www.threads.com/@zuck/post/Db2v6H6kUkq",
"imageUrls": [],
"hasVideo": false,
"isReply": false,
"source": "threads_public_graphql"
}

diagnostic rows (recordType: "diagnostic") carry a codeBLOCKED, RATE_LIMITED, NOT_FOUND, NETWORK, TARGET_ERROR, NO_POSTS or NO_RESULTS — for bad input, blocking, rate limits, target errors or an empty result. They're free.

Only validated public profile and post rows are charged. Samples and diagnostics never are.

Input

{
"profiles": ["zuck", "https://www.threads.com/@instagram"],
"maxPostsPerProfile": 10,
"includeProfile": true,
"query": "AI",
"fallbackToResidential": false
}
FieldDefaultNotes
profiles["zuck"] prefilledpublic handles or full threads.com/@handle URLs; both forms work
maxPostsPerProfile101–30 public posts per profile
includeProfiletrueset false to skip profile rows and pay only for posts
querycase-insensitive text filter applied to the posts from the profiles you supplied
fallbackToResidentialfalseallow one proxy retry after a block or a transient failure
proxyConfigurationproxy offonly used by that one retry

query is account-scoped on purpose. Threads doesn't give an anonymous global search path that holds up, so this Actor doesn't claim one — the filter narrows the posts from the handles you listed and nothing else.

Turning includeProfile off is the cheapest way to run a posts-only monitor here: each skipped profile row is one row you aren't billed for.

Leave profiles empty and you get one labelled, uncharged sample profile row.

Proxy behaviour

Direct HTTP first, always. When fallbackToResidential is on and a direct request comes back blocked, rate-limited or with a transient network failure, the Actor makes one retry through the proxy configuration you supplied. It doesn't retry successful requests and doesn't use a proxy for media.

Pricing

$0.40 per 1,000 rows ($0.0004 each), plus $0.001 each time a run starts. Charged only on rows actually returned, at the same rate on any plan.

A row is a genuine profile or post row. Samples, diagnostics, duplicates, blocked look-ups and no-result runs never incur the per-row fee, so a run that returns nothing costs the $0.001 start fee and no more. Direct HTTP is the default path, so no residential bandwidth is billed unless you switch on fallbackToResidential yourself.

Limits

  • Public profiles and public posts only.
  • maxPostsPerProfile is capped at 30, which keeps both the cost and the load on Threads bounded.
  • followerCount is approximate when Threads abbreviates it in the public metadata — it publishes "5.7M" for some accounts and an exact integer for others, and this returns whichever it gets, parsed to a number.
  • isVerified is often null. It isn't in the public metadata for every account, and a guess would be worse than a blank.
  • No global keyword search, no hashtag feed, no follower lists, no reply threads. Profiles and their recent posts is the whole scope.
  • Threads can change its anonymous endpoints. A diagnostic row means no result was charged.

Use public data in accordance with applicable law and Threads' terms.