Meta Threads Profile Posts Scraper avatar

Meta Threads Profile Posts Scraper

Pricing

from $3.00 / 1,000 profile metadata scrapeds

Go to Apify Store
Meta Threads Profile Posts Scraper

Meta Threads Profile Posts Scraper

Scrape Threads profile posts: text, media URLs, likes, replies, reposts, quotes, and timestamps. Bulk usernames, HTTP-only, no login required. MCP-ready.

Pricing

from $3.00 / 1,000 profile metadata scrapeds

Rating

0.0

(0)

Developer

Khadin Akbar

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

19 hours ago

Last modified

Share

Extract posts from any public Meta Threads profile — text, media, engagement metrics, and author metadata. HTTP-only, no login required. Bulk usernames supported. MCP-ready for AI agents.

What it does

Input one or more Threads usernames (or profile URLs) and get back structured JSON records for each post:

  • Full post text
  • Like, reply, repost, and quote counts
  • Media URLs (images and videos)
  • Post timestamp (ISO 8601)
  • Canonical post URL
  • Author name, follower count, verified status

Optionally include one profile metadata record per username (bio, external URL, profile picture URL, follower count).

When to use this actor

  • Content analytics — audit a competitor's or creator's last N posts on Threads.
  • Influencer research — pull engagement rates across multiple profiles at once.
  • Brand monitoring — track what an account is posting over time.
  • Social media reporting — bulk-export posts to CSV, Google Sheets, or a dashboard.
  • AI agents / Claude / ChatGPT — call this as an MCP tool to retrieve Threads posts as structured data during a research task.

Do NOT use for keyword or hashtag search — use a search-focused Threads actor for that.

Output data

FieldTypeDescription
typestring"post" or "profile"
usernamestringThreads username
postIdstringUnique post ID
postUrlstringCanonical URL
textstringPost text (null for media-only)
publishedAtISO 8601Post timestamp UTC
likeCountintegerTotal likes
replyCountintegerTotal direct replies
repostCountintegerTotal reposts
quoteCountintegerTotal quote-posts
mediaUrlsstring[]Image/video CDN URLs
isRepostbooleanTrue if this is a repost
authorFullNamestringDisplay name
authorIsVerifiedbooleanVerified badge
authorFollowerCountintegerFollower count at scrape time
biostringProfile bio (type=profile only)
externalUrlstringBio link URL (type=profile only)
profilePicUrlstringProfile picture URL (type=profile only)
scrapedAtISO 8601Scrape timestamp UTC

Pricing

  • $0.00005 per run start (per GB RAM)
  • $0.005 per post scraped
  • $0.003 per profile metadata record (when includeProfileInfo is true)

Typical cost: 1 username × 30 posts = ~$0.15

Pay-Per-Usage (compute + proxy passthrough) also enabled for large-scale runs.

Usage

Basic — scrape last 30 posts from one profile

{
"usernames": ["zuck"],
"maxPostsPerProfile": 30
}

Bulk profiles + no profile metadata

{
"usernames": ["zuck", "natgeo", "nasa"],
"maxPostsPerProfile": 50,
"includeProfileInfo": false
}

With custom proxy

{
"usernames": ["someusername"],
"maxPostsPerProfile": 100,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

API

curl -X POST \
"https://api.apify.com/v2/acts/khadinakbar~meta-threads-profile-posts-scraper/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"usernames":["zuck"],"maxPostsPerProfile":30}'

JavaScript / Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('khadinakbar/meta-threads-profile-posts-scraper').call({
usernames: ['zuck', 'natgeo'],
maxPostsPerProfile: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

from apify_client import ApifyClient
client = ApifyClient(token='YOUR_TOKEN')
run = client.actor('khadinakbar/meta-threads-profile-posts-scraper').call(run_input={
'usernames': ['zuck', 'natgeo'],
'maxPostsPerProfile': 50,
})
for item in client.dataset(run['defaultDatasetId']).iterate_items():
print(item)

How it works

  1. Loads each Threads profile page via HTTP GET (no headless browser).
  2. Parses all embedded <script data-sjs> JSON blobs from the SSR response.
  3. Extracts user metadata and thread_items arrays using a schema-agnostic deep-finder — resilient to Threads layout changes.
  4. For requests exceeding the SSR batch (~24 posts), paginates via Threads' internal GraphQL endpoint using LSD and fb_dtsg tokens extracted from the initial page.
  5. Pushes each post as a flat JSON record; emits a PPE charge event per post.

FAQ

Does it need a Threads account or login? No. Only works on public profiles.

What's the max posts per profile? Up to 500. The SSR batch typically includes ~24 posts; additional posts are fetched via GraphQL pagination.

What happens if a profile is private or doesn't exist? The run continues to the next username. A warning is logged. No charge for profiles that return no data.

Will it break when Threads updates its layout? The parser uses key-name traversal rather than fixed JSON paths. Minor layout changes are automatically handled. Major structural changes (rare) may require an actor update.

Can I use my own proxy? Yes — set proxyConfiguration.useApifyProxy: false and provide proxyUrls.

Does it scrape replies or hashtag feeds? No. This actor focuses on profile posts. For replies or search, use a dedicated actor.

This actor scrapes publicly accessible data from Meta Threads in the same way a web browser would. It does not bypass authentication, access private content, or circumvent paywalls. Users are responsible for ensuring their usage complies with Meta's Terms of Service and applicable laws in their jurisdiction. Web scraping of publicly available data is generally permitted for legitimate research, analytics, and competitive intelligence purposes under most jurisdictions, but this varies by location. Apify and the actor developer assume no liability for misuse.