# Threads User Posts Scraper - Full Post History (`benthepythondev/threads-user-posts-scraper`) Actor

Export every public post of any Meta Threads account without login: text, date, likes, replies, reposts, quotes, media and links. Also reads the accounts' replies and reposts.

- **URL**: https://apify.com/benthepythondev/threads-user-posts-scraper.md
- **Developed by:** [Ben](https://apify.com/benthepythondev) (community)
- **Categories:** Social media, Marketing, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 1,000 posts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 📜 Threads User Posts Scraper - Full Post History

Export everything a Threads account has published, back to its first post: full text, publication time, likes, replies, reposts, quotes, shares, links, mentions, pictures and videos. The same Actor also reads the replies an account wrote and the posts it reposted. No login, cookies or API key. Export to JSON/CSV/Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

### 🔎 What is the Threads User Posts Scraper?

It is an Apify Actor that reads public Threads accounts the way a logged-out visitor's browser does, and keeps going page after page instead of stopping where the profile page asks visitors to log in.

On a test run it saved National Geographic's whole public history, 1,819 posts from July 2023 to the day of the run, in 128 seconds. Smaller accounts take a few seconds.

Choose what to collect:

- **Posts:** what the accounts published, newest first. Thread continuations by the same author are included.
- **Replies the accounts wrote:** each reply comes with the link and text of the post it answers.
- **Reposts:** the original posts the accounts reposted, with the time of the repost.

A date window (`postedAfter`, `postedBefore`) limits the export to a period, and reading stops as soon as older posts are reached, so a daily run with yesterday's date is quick and cheap.

#### What data does it extract?

- **Post:** `id`, `code`, `url`, `text`, `posted_at`, `is_pinned`, `is_edited`, `is_reply`, `reply_to_author`
- **Engagement:** `likes`, `replies`, `reposts`, `quotes`, `shares`
- **Author:** `username`, `full_name`, `author_id`, `is_verified`
- **Content:** `mentions[]`, `links[]` (real destinations, not Threads redirect links), `link_title`, `quoted_post_url`, `image_urls[]`, `video_urls[]`
- **Replies job:** `reply_to_url`, `reply_to_text`
- **Reposts job:** `reposted_by`, `reposted_at`

### ⬇️ Input

| Field | Type | What it does |
|---|---|---|
| `mode` | string | `posts`, `replies` or `reposts` |
| `usernames` | array | Usernames, @handles or profile links |
| `maxResults` | integer | Rows per account, newest first. 20 by default, up to 100,000 |
| `postedAfter` | string | Only rows from this UTC date on (YYYY-MM-DD) |
| `postedBefore` | string | Only rows up to this UTC date |

#### Example input

Every post of two accounts in September 2026:

```json
{
  "mode": "posts",
  "usernames": ["natgeo", "nasa"],
  "maxResults": 1000,
  "postedAfter": "2026-09-01",
  "postedBefore": "2026-09-30"
}
```

### ⬆️ Output

A real post row (media link shortened):

```json
{
  "record_type": "post",
  "id": "3867248781788782365",
  "code": "DWrOkcIlR8d",
  "url": "https://www.threads.com/@natgeo/post/DWrOkcIlR8d",
  "username": "natgeo",
  "author_id": "63269174602",
  "full_name": "National Geographic",
  "is_verified": true,
  "text": "Apollo 8 astronauts captured the iconic Earthrise image, which inspired the global environmental movement. Artemis II astronauts may have the chance to recreate it more than 50 years later. Here's how they might do it: https://on.natgeo.com/eOreaO",
  "posted_at": "2026-04-03T16:00:23+00:00",
  "likes": 867,
  "replies": 8,
  "reposts": 54,
  "quotes": 2,
  "shares": 5,
  "is_reply": false,
  "reply_to_author": null,
  "is_pinned": false,
  "is_edited": false,
  "mentions": [],
  "links": [
    "https://on.natgeo.com/eOreaO"
  ],
  "link_title": null,
  "quoted_post_url": null,
  "image_urls": [
    "https://scontent-iad6-1.cdninstagram.com/v/t51.82787-15/659913135_1795..."
  ],
  "video_urls": [],
  "scraped_at": "2026-10-02T20:45:48.418624+00:00"
}
```

A row from the replies job carries the post it answers:

```json
{
  "record_type": "reply",
  "id": "3999285079710053730",
  "code": "DeAUJdDozVi",
  "url": "https://www.threads.com/@mosseri/post/DeAUJdDozVi",
  "username": "mosseri",
  "author_id": "63482099442",
  "full_name": "Adam Mosseri",
  "is_verified": true,
  "text": "Because on Instagram we show the profile pic instead of the profile icon when a user has multiple accounts, and native Liquid Glass doesn’t support images, so we needed to recreate the effect without access to the same APIs.",
  "posted_at": "2026-10-02T20:12:34+00:00",
  "likes": 105,
  "replies": 12,
  "reposts": 2,
  "quotes": 0,
  "shares": 2,
  "is_reply": true,
  "reply_to_author": "admirer_7124",
  "is_pinned": false,
  "is_edited": false,
  "mentions": [],
  "links": [],
  "link_title": null,
  "quoted_post_url": null,
  "image_urls": [],
  "video_urls": [],
  "reply_to_url": "https://www.threads.com/@admirer_7124/post/DeAPAhmCnSC",
  "reply_to_text": "Why does Liquid Glass look so different between Instagram and Threads when they’re both owned by Meta?\nThe design still feels incomplete and barely refined, as if the developers stopped halfway and called it finished. I really hope they keep improving it.",
  "scraped_at": "2026-10-02T20:40:25.373184+00:00"
}
```

### 💰 How much does it cost?

You pay per saved post, plus a tiny start fee per run.

| Apify plan | Price per 1,000 posts |
|---|---|
| Free | $2.00 |
| Starter | $1.90 |
| Scale | $1.80 |
| Business and above | $1.70 |

The 1,819-post history above costs $3.64 on the Free plan. Set **Maximum cost per run** in the run options and the Actor stops saving at that amount and says so in the status message.

### 💡 Use cases

- 📊 **Competitor and brand monitoring:** a daily run with `postedAfter` set to yesterday collects only the new posts of every account you follow.
- 🧪 **Content analysis:** find which formats, topics and posting times get the most likes, replies and reposts.
- 🧠 **Datasets for AI and research:** complete, dated post histories for fine-tuning, RAG pipelines or academic studies.
- 🗂️ **Archiving:** keep a copy of an account's public posts with their links and media URLs.

### ❓ FAQ

**Do I need a Threads or Instagram account?** No. The Actor never logs in and needs no cookies.

**How far back does it go?** To the account's first public post. Threads opened in July 2023.

**How fast is it?** About 15 posts per request, roughly 14 posts per second on a long timeline.

**Does `maxResults` count per account or per run?** Per account. Three usernames with `maxResults: 100` can save up to 300 rows. To cap the whole run, set **Maximum cost per run**.

**What about pinned posts?** A pinned post comes first with `is_pinned: true`, whatever its age. The date window still applies to it.

**What happens with private or misspelled accounts?** They are skipped and listed in the status message and the `SUMMARY` record. The run still succeeds with everything else.

**Why do some posts have no text?** Posts that are only a picture, a video or a link have an empty `text`. Their media and links are still in the row.

**What if Threads slows the Actor down?** The Actor continues from the same page through a new residential address, so a long export does not start over.

**Is it legal to scrape Threads posts?** The Actor reads only what Threads shows publicly to any visitor and does not log in. Posts contain personal data, so GDPR, CCPA and similar rules apply to how you store and use them, and Meta's terms apply to you as well. If in doubt, ask a lawyer.

**Something is missing or broken?** Open an issue on the Actor's Issues tab with the run ID. Issues are answered within one business day.

### 🔗 You might also like

- [Threads Scraper - Posts, Profiles & Replies](https://apify.com/benthepythondev/threads-public-scraper)
- [Threads Profile Scraper](https://apify.com/benthepythondev/threads-profile-scraper)
- [Threads Replies Scraper](https://apify.com/benthepythondev/threads-replies-scraper)
- [Reddit Scraper](https://apify.com/benthepythondev/reddit-scraper)
- [YouTube Transcript Scraper](https://apify.com/benthepythondev/youtube-transcript-scraper)

**Keywords:** threads posts scraper, threads user posts, threads post history, scrape threads posts, meta threads scraper, threads.net scraper, threads timeline export, threads posts to csv, threads api alternative, threads without login, threads replies by user, threads reposts, threads engagement data, threads content analysis, threads monitoring, social media dataset

# Actor input Schema

## `mode` (type: `string`):

Each tab is read newest first, back to the account's first post.

## `usernames` (type: `array`):

Usernames, @handles or profile links, for example zuck, @natgeo or https://www.threads.com/@nasa.

## `maxResults` (type: `integer`):

Rows to save for each account. The newest come first; raise it to go further back.

## `postedAfter` (type: `string`):

Only rows from this UTC date on (YYYY-MM-DD). Reading stops once older posts are reached.

## `postedBefore` (type: `string`):

Only rows up to this UTC date (YYYY-MM-DD).

## Actor input object example

```json
{
  "mode": "posts",
  "usernames": [
    "natgeo"
  ],
  "maxResults": 20
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "usernames": [
        "natgeo"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/threads-user-posts-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "usernames": ["natgeo"] }

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/threads-user-posts-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "usernames": [
    "natgeo"
  ]
}' |
apify call benthepythondev/threads-user-posts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,benthepythondev/threads-user-posts-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/aLo8joHi4nYFptyfN/builds/gh0hRuIJpJ21OEcgA/openapi.json
