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

Threads Scraper — Posts, Replies & Profiles, No Login

Pricing

$9.00 / 1,000 results

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

Threads Scraper — Posts, Replies & Profiles, No Login

Threads scraper without login: extract public posts, profiles, replies, search and hashtags with engagement data via API. Try free.

Pricing

$9.00 / 1,000 results

Rating

0.0

(0)

Developer

Vnx0

Vnx0

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

5 days ago

Last modified

Categories

Share

Scrape public Threads.com data without login, cookies, or API keys: profiles, user posts, replies tabs, single-post threads, keyword search, and hashtag feeds. This Threads scraper returns one flat row per post with real like, reply, repost, and quote counts, plus a profile row when you want it.

Threads only shows logged-out visitors a window of recent content (about 10 profile posts, about 29 items per post thread, one page per search or hashtag — checked 2026-09-10). This Actor keeps every visible row, tells you when the login wall cut a run short, and never bills you for rows date filters removed or for an all-empty run.

What you can scrape

  • Profiles — username, full name, bio, profile picture, verified flag, follower count, bio-link website, post URL. (followingCount stays null for guests — Threads does not serve it logged-out.)
  • User posts (mode: posts) — recent posts per username, newest first.
  • Author replies (mode: replies) — the profile Replies tab, not just top-level posts.
  • Post threads — any postUrls entry returns the post plus its reply thread; replySort: top puts the best-liked replies first.
  • Keyword searchsearchQueries with searchSortType: top | recent.
  • Hashtag feedshashtags with or without #.
  • Media and context — photo/video/carousel URLs with dimensions, mediaType, hasAudio for video, hashtags, mentions, external urls, link-preview URL, repost and quote lineage (repostedFrom, quotedPostAuthor, parentPostId, rootPostId), scrapedFromMode, and searchQuery on search rows.

Threads profile scraper

Pass handles, @handles, or profile URLs in usernames:

{ "usernames": ["zuck", "@mosseri", "https://www.threads.com/@creators"], "mode": "posts", "includeProfile": true, "maxPostsPerProfile": 10 }

mode applies to usernames: posts (default), replies, or profile (metadata only). includeProfile: true adds one profile row per username alongside posts. maxPostsPerProfile: 0 means no per-profile cap (global maxItems still applies).

Scrape Threads posts

Each post row carries 41 fields (about 29 on a typical row — conditional repost, quote, and reply fields are omitted when they do not apply unless you set compactOutput: false):

GroupFields
Identitytype, postId, code, url, username, userId, userFullName, userIsVerified
Contenttext, publishedAt, takenAtTimestamp, isEdited, isReply, replyToAuthor, hashtags, mentions, urls
EngagementlikeCount, replyCount, repostCount, quoteCount, reshareCount
Repost / quoteisRepost, repostedFrom, repostedPostId, repostedPostUrl, isQuotePost, quotedPostId, quotedPostUrl, quotedPostAuthor
ThreadparentPostId, rootPostId
MediamediaType, mediaCount, mediaUrls, media[{type,url,width,height}], hasAudio, linkPreviewUrl
SourcescrapedFromMode, searchQuery, scrapedAt

Profile rows carry type, username, userId, fullName, biography, profilePicUrl, profileUrl, isVerified, followerCount, followingCount, website, isPrivate.

Post threads and top replies

{ "postUrls": ["https://www.threads.com/@zuck/post/DdCYWl7GktV"], "includeReplies": true, "replySort": "top", "maxRepliesPerPost": 50 }
  • includeReplies: false returns exactly one row for the post URL.
  • replySort: top (default) keeps the root post first and ranks replies by likes; recent keeps page order.
  • maxRepliesPerPost caps expansion per URL; maxItems caps the whole run.

Threads search scraper

{ "searchQueries": ["climate change", "ai agents"], "searchSortType": "top", "postedAfter": "2026-01-01", "maxItems": 100 }

Search returns the public results page (single page per query — Threads-side limit). postedAfter / postedBefore (YYYY-MM-DD or ISO) drop rows before billing, so filtered-out rows cost nothing.

Threads hashtag scraper

{ "hashtags": ["coffee", "#travel"], "maxItems": 100 }

Same single-page window as search. The # prefix is optional; output rows carry searchQuery: "#coffee" so mixed runs stay attributable.

Output fields and export

Every run writes flat rows to the default dataset (JSON, CSV, Excel, XML in the Console) and a RUN_SUMMARY object to the key-value store with per-target outcomes, date-excluded counts, and error reasons. An all-empty run fails with the summary instead of billing green — check RUN_SUMMARY.targetsEmpty before retrying.

{
"type": "post",
"postId": "3981852126213720917",
"code": "DdCYWl7GktV",
"url": "https://www.threads.com/@zuck/post/DdCYWl7GktV",
"username": "zuck",
"text": "Post text here",
"publishedAt": "2026-09-01T12:00:00.000Z",
"likeCount": 4969,
"replyCount": 1034,
"repostCount": 372,
"quoteCount": 277,
"mediaType": "text",
"hashtags": [],
"mentions": [],
"scrapedFromMode": "posts",
"scrapedAt": "2026-09-10T00:00:00.000Z"
}

Pricing

Pay-per-result: one billable event per dataset row (post or profile). Date-excluded rows are never pushed and never billed. Set maxTotalChargeUsd (0 = no cap) to stop cleanly at a budget. Start small: one username with maxPostsPerProfile: 5 shows the full schema for a few cents, then raise maxItems for bulk runs. The final per-1K price is listed on the Pricing tab.

How to scrape Threads

  1. Click Try for free and open the Input tab.
  2. Add usernames, postUrls, searchQueries, or hashtags (combine them in one run).
  3. Pick mode for usernames and set maxItems as your spend control.
  4. Click Start, then open the Dataset tab to preview rows.
  5. Export as JSON, CSV, or Excel, or call the API for pipelines.
  6. Add an Apify Schedule for daily creator or keyword checks.

Threads scraper API

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('vnx0/threads-scraper-no-login').call({
usernames: ['zuck'],
mode: 'posts',
includeProfile: true,
maxPostsPerProfile: 10,
maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Python:

from apify_client import ApifyClient
client = ApifyClient(token="APIFY_TOKEN")
run = client.actor("vnx0/threads-scraper-no-login").call(
run_input={"searchQueries": ["ai agents"], "maxItems": 50}
)
print(client.dataset(run["defaultDatasetId"]).list_items().items[:2])

Prefer no code: run from Console, schedule it, attach a webhook, or connect Make, Zapier, or n8n. AI agents can call it through the Apify MCP server.

Use cases

  • Creator research — compare recent posts, follower counts, and engagement across handles.
  • Brand and keyword monitoring — schedule daily searchQueries runs and diff the dataset.
  • Hashtag tracking — pull #tag feeds for campaigns or events.
  • Conversation analysis — expand a post thread with top replies first for sentiment review.
  • Content research — collect text, hashtags, mentions, and media URLs for analysis pipelines.
  • Competitor checks — watch public posting cadence and repost/quote pickup.

This Actor does not do lead enrichment, email extraction, follower-list pulls, or new-post delta detection — schedule full runs and diff on postId instead.

Limitations

LimitWhat happens
Logged-out window (~10 profile posts, ~29 thread items, 1 page search/hashtag)Run keeps visible rows and notes truncation in logs
Private or login-gated accountsTarget reported empty in RUN_SUMMARY, skipped
View counts, follower/following lists, full historyNot served to guests — never promised, never null-filled silently
Media binariesURLs only; CDN links expire — download promptly
Threads layout changesEmbedded-data extractor with DOM fallback; failures logged per target

FAQ

Do I need a Threads or Instagram login, cookies, or API key? No. Only what Threads serves to logged-out visitors, over Apify Proxy by default.

Is there an official Threads API? How is this different? Meta's official API covers your own content, publishing, and insights behind app review. This Actor reads public profiles, posts, search, and hashtags and returns them as rows you can export or call via API — no app review.

Can I scrape private accounts? No. Public data only.

Why did I get fewer rows than my max? The max is a ceiling, not a guarantee. Inactive profiles, niche queries, and the logged-out window return fewer rows. The run still succeeds if any target returned data.

Do view counts come back? No. Threads does not expose them to guests.

Do date filters save money? Yes. postedAfter / postedBefore exclusions happen before the dataset push, so excluded rows cost nothing.

What if every target returns nothing? The run fails with a RUN_SUMMARY explaining which targets were empty and why, instead of a green billed run.

threads.com or threads.net? Both URL forms are accepted as input; output URLs use the canonical threads.com form.

How do I export to CSV or Excel? Run in Console, open Storage, download — or fetch GET /v2/datasets/{id}/items?format=csv with your token.

Can AI agents use it? Yes — via the Apify API or MCP server with the same JSON input.

Troubleshooting

  • No valid targets — provide at least one of usernames, postUrls, searchQueries, hashtags.
  • All-empty failure — read RUN_SUMMARY.targetsEmpty for per-target reasons (not-found-404, no-rows-returned); check handle spelling and try one known-public profile.
  • Thin search results — split multi-word phrases into separate queries; try recent sort.
  • Private account — expected empty; remove it from the list.
  • Cost worries — set maxPostsPerProfile: 5 + maxTotalChargeUsd: 1 for a sample run first.
  • Proxy errors — leave proxy on automatic routing unless you have a reason to change it.

Reads public pages only; respects the logged-out window; no credential handling. Found a bug or Threads changed layout? Open an issue on the Actor page — reports with a failing input and RUN_SUMMARY get fixed first.