Meta Threads Profile Posts Scraper
Pricing
from $3.00 / 1,000 profile metadata scrapeds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 hours ago
Last modified
Categories
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
| Field | Type | Description |
|---|---|---|
| type | string | "post" or "profile" |
| username | string | Threads username |
| postId | string | Unique post ID |
| postUrl | string | Canonical URL |
| text | string | Post text (null for media-only) |
| publishedAt | ISO 8601 | Post timestamp UTC |
| likeCount | integer | Total likes |
| replyCount | integer | Total direct replies |
| repostCount | integer | Total reposts |
| quoteCount | integer | Total quote-posts |
| mediaUrls | string[] | Image/video CDN URLs |
| isRepost | boolean | True if this is a repost |
| authorFullName | string | Display name |
| authorIsVerified | boolean | Verified badge |
| authorFollowerCount | integer | Follower count at scrape time |
| bio | string | Profile bio (type=profile only) |
| externalUrl | string | Bio link URL (type=profile only) |
| profilePicUrl | string | Profile picture URL (type=profile only) |
| scrapedAt | ISO 8601 | Scrape timestamp UTC |
Pricing
- $0.00005 per run start (per GB RAM)
- $0.005 per post scraped
- $0.003 per profile metadata record (when
includeProfileInfois 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 ApifyClientclient = 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
- Loads each Threads profile page via HTTP GET (no headless browser).
- Parses all embedded
<script data-sjs>JSON blobs from the SSR response. - Extracts user metadata and thread_items arrays using a schema-agnostic deep-finder — resilient to Threads layout changes.
- For requests exceeding the SSR batch (~24 posts), paginates via Threads' internal GraphQL endpoint using
LSDandfb_dtsgtokens extracted from the initial page. - 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.
Legal disclaimer
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.