Threads Scraper - Profiles & Posts, No Login avatar

Threads Scraper - Profiles & Posts, No Login

Pricing

from $0.38 / 1,000 threads profile or posts

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

Threads Scraper - Profiles & Posts, No Login

Scrape public Threads profiles and their recent posts, no login. threads.com and threads.net links both work, and so does a bare handle. Profile rows have the bio and followers; post rows have the text, likes, exact time, images, and video and reply flags. 30 posts per profile. $0.40 per 1,000 rows.

Pricing

from $0.38 / 1,000 threads profile or posts

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

11

Total users

6

Monthly active users

4 days ago

Last modified

Share

Give it Threads handles and get a row for each profile plus their recent public posts: bio, follower count, post text, likes, the exact publish time, image links, and flags for video and replies. Nothing to log into.

You have to know whose posts you want. There is no anonymous global search on Threads that holds up, so this reads the handles you list and nothing wider. The query field filters those posts, it does not search Threads, and 30 recent posts per profile is the most it reads.

InputThreads handles or profile URLs
OutputOne row per profile (bio, followers) and one per post (text, likes, publish time, images, video and reply flags)
Ceiling30 posts per profile
Account neededNone
Price$0.40 per 1,000 rows on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 12,500

🔍 What Threads Scraper does

Threads lives on threads.com now. A threads.net link redirects across, so both forms work, and so does a bare handle like zuck. Duplicates in your list are collapsed before anything is fetched, whatever the capitalisation.

For each handle it reads the public profile, then the public feed of that account's recent posts. You get one profile row and up to 30 post rows per handle, and you can turn the profile rows off if all you want is the posts.

query is an optional case-insensitive text filter over the posts it collected, so you can run ten accounts and keep only the ones that said "pricing". It narrows what you already asked for. It does not reach any post from an account you did not list.

📋 What data you get from each Threads profile and post

What you getField
Profile: handle, display name, id and linkusername, displayName, id, profileUrl
Profile: bio, follower count and picturebio, followerCount, profilePicUrl
Profile: verified badge (always empty, see below)isVerified
Post: id, short code and linkpostId, postCode, postUrl
Post: text and like counttext, likeCount
Post: exact publish timepublishedAt
Post: image links, and whether it has a video or is a replyimageUrls, hasVideo, isReply
What the row isrecordType

▶️ How to scrape Threads posts

  1. Open Threads Scraper and click Try for free.
  2. Put your handles into Threads profiles, one per line.
  3. Set Maximum recent posts per profile. Ten is plenty for a first look.
  4. Click Start.
  5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.

Leave Threads profiles empty and you get a single labelled sample row, so you can see the shape before committing a list. It is not charged.

💰 How much does it cost to scrape Threads posts?

$0.40 per 1,000 rows on the Free plan. Paid plans pay a little less: $0.395 on Starter, $0.39 on Scale and $0.385 on Business. On the free plan, the $5 Apify gives you each month covers about 12,500 rows.

A profile row and a post row cost the same. Turning Include profile rows off is the cheapest way to run a posts-only monitor, because a skipped profile row is a row you are not billed for. The sample row is not charged, diagnostic rows are not charged, and a handle you listed twice only produces one set of rows.

📥 What you give it

{
"profiles": ["zuck", "https://www.threads.com/@instagram"],
"maxPostsPerProfile": 10,
"includeProfile": true,
"query": "AI"
}
FieldDefaultWhat it is
profilesnoneHandles or full profile URLs. zuck, @zuck and the full link all resolve the same. The box starts with zuck in it, which is a suggestion and not a default.
maxPostsPerProfile10Recent public posts to keep per handle, 1 to 30.
includeProfiletrueKeep one profile row per handle. Turn it off for a posts-only run.
querynoneCase-insensitive text filter over the posts collected from your handles. Not a Threads search.
fallbackToResidentialfalseOff. When on, a request that fails is tried once more with the settings below. It does nothing unless you fill those in.
proxyConfiguration{"useApifyProxy": false}Optional and off. Your own servers are used exactly as given.

📤 What you get back

Every row carries a recordType, so one pass over the dataset splits it. A real profile row and a real post row, with the avatar URL and the post text cut short:

{
"ok": true,
"recordType": "profile",
"id": "63055343223",
"username": "zuck",
"displayName": "Mark Zuckerberg",
"bio": "Mostly superintelligence and MMA takes. See the latest conversations with @zuck.",
"followerCount": 5700000,
"isVerified": null,
"profilePicUrl": "https://scontent-iad3-1.cdninstagram.com/v/t51.82787-19/550174606_...",
"profileUrl": "https://www.threads.com/@zuck"
}
{
"ok": true,
"recordType": "post",
"id": "3981852126213720917",
"postId": "3981852126213720917",
"username": "zuck",
"text": "Introducing @Muse, the personal agent that understands your goals and works 24/7 to get things done for you...",
"likeCount": 3007,
"publishedAt": "2026-09-08T18:56:24.000Z",
"postCode": "DdCYWl7GktV",
"postUrl": "https://www.threads.com/@zuck/post/DdCYWl7GktV",
"imageUrls": [],
"hasVideo": false,
"isReply": false
}
FieldHow to read it
followerCountA number, but only as precise as Threads prints it. It publishes 5.7M for large accounts, so you get 5700000 and not the exact figure.
isVerifiedComes back null. Threads does not put the badge in the public profile data, and a guess would be worse than a blank.
postId, postCodepostCode is the short code in the URL. Either one works as a dedupe key across runs.
likeCountnull when Threads does not publish a count for that post.
textThe post text. Long posts are kept whole; the example above is cut short for this page only.
imageUrlsUp to five public image links. Empty for a text post.
hasVideo, isReplyBooleans. There is no video file, just the flag.

🧾 Reading the output

RowHow to spot itCharged
A profilerecordType: "profile"yes
A postrecordType: "post"yes
The sample row_sample: trueno
A diagnostic_diagnostic: true, recordType: "diagnostic" and a codeno

The sample row also carries recordType: "profile", so filter on _sample and _diagnostic being absent rather than on recordType alone. A diagnostic row names the handle it belongs to:

codeWhat it means
NOT_FOUNDNo public Threads profile for that handle. Check the spelling.
NO_POSTSThe profile resolved but no posts came back, or none matched your query.
NO_RESULTSNothing at all was saved for that handle.
NOT_SERVEDThis request was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED.
RATE_LIMITEDToo many requests too quickly. Give it a few minutes.
NETWORKThreads was unreachable or answered badly. Re-run it.
TARGET_ERRORThreads answered with something the actor could not read, usually a page without the public profile data on it.
TIME_LIMITThe run got close to its time limit and stopped on its own. The profiles and posts delivered before that are complete and charged. Give the run more time, or list fewer profiles, to get the rest.

If the time limit stopped the run before any profile or post came back, the run ends as failed, with a TIME_LIMIT row saying so. When anything was delivered, it ends as succeeded.

💡 What people use it for

  • Watching what a set of accounts posted this week, on a schedule, with postCode as the dedupe key.
  • Pulling the text of an account's recent posts into a summary without opening the app.
  • Tracking like counts on a competitor's posts over time, by running the same handles daily and joining on postId.
  • Filtering a list of industry accounts down to the posts that mention one word, using query, so a 30-account sweep lands as a handful of rows.

The same accounts on Instagram, in three steps:

  1. Run this on your handles with includeProfile on.
  2. Copy the username column (most Threads accounts use their Instagram handle).
  3. Paste it into Instagram Profile Scraper for exact follower counts and categories.

🚧 What it does not do

  • No global search. You cannot ask for every post mentioning a word. You give it handles.
  • No hashtags, no follower lists, no following lists, no reply threads and no comments under a post.
  • A bad handle can end the run. One entry that is not a usable handle stops the batch before the good handles are written, and you get a single TARGET_ERROR row instead of your data. Check the list before a long run.
  • isVerified is always null.
  • followerCount is rounded whenever Threads abbreviates it.
  • 30 posts per profile is the hard ceiling, and recent posts only. There is no way back through an account's history.
  • Public accounts only. A profile that does not resolve publicly comes back as a diagnostic row.
  • Image links are Meta CDN URLs. They work for a while and are not archival. Video is a flag, not a file.
  • It is not an official Threads tool. Dami's Studio is independent and is not affiliated with or endorsed by Threads or Meta, or by any other company named on this page.

🧭 Which social scraper do you need?

If you wantUse
Threads profiles and their recent postsThis one
The same accounts' Instagram profile and gridInstagram Scraper
Exact Instagram follower counts and categoriesInstagram Profile Scraper
Profiles and posts from BlueskyBluesky Scraper

❓ Questions people ask

Do I need a Threads or Instagram login?

No. Nothing to connect, no cookie, no token.

Can I search Threads for a keyword?

Not from here. query filters the posts from the accounts you listed. A real global search is not something Threads exposes to a signed-out visitor.

Yes. They redirect to threads.com and resolve to the same account.

Why do the numbers differ from what I see in the app?

Threads prints big follower counts rounded, so a 5.7M on the page becomes 5700000 here. If a post seems missing, open the profile in a private browser window: what a logged-out visitor sees there is what this actor reads.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/threads-scraper. Either way the run happens on your Apify account at the same price.

These are public profiles and public posts. They are also personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the handle and the run ID. If you got a diagnostic row, its code and details usually name the problem on their own.