# Threads Post Scraper (`sinam7/threads-post-scraper`) Actor

Scrape Threads posts and comments, post author only.

- **URL**: https://apify.com/sinam7/threads-post-scraper.md
- **Developed by:** [sinam7](https://apify.com/sinam7) (community)
- **Categories:** Social media, Automation
- **Features:** Limited permissions
- **Stats:** 108 total users, 10 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.0015 / result

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 Post Scraper

Scrape Threads posts and comments from a single post URL. Filters out profile images and recommended posts, returning only the original post and its related replies.

### What this actor does

- Accepts a single Threads post URL
- Extracts post content, author info, timestamps, images, and comments
- Automatically filters out:
  - Profile thumbnails (s150x150, s42x42)
  - Unrelated recommended posts from Threads feed
- Returns only posts from the original author or replies to the original post

### Input

#### Example input

```json
{
  "url": "https://www.threads.net/@username/post/ABC123"
}
```

#### Input fields

| Field | Type | Required | Notes |
|-------|------|----------|-------|
| url | string | Yes | Full Threads post URL (e.g., https://www.threads.net/@username/post/ABC123) |

### Output

The actor outputs an array of post objects to the dataset.

#### Example output item

```json
[
  {
    "authorId": "/@hyle_edu.kr",
    "authorName": null,
    "content": "hyle_edu.kr\nDesign Threads\nCursor 디자인 총괄이 말아주는(낋여주는) 스타트업 랜딩 페이지 리뷰 영상\nUI/UX 디자이너분들께 실전 레이아웃·카피 피드백이 꽤 도움 될 것 같습니다.\n5가지 핵심 교훈:\n1) 첫 화면에서 한 줄로 정체를 밝혀라.\n2) 누구를 위한 제품인지 콕 집어 말해라.\n3) 한 화면에 CTA는 딱 하나만 둬라.\n4) 보라 그라디언트·AI 템플릿 느낌을 버려라.\n5) 말로 돌리지 말고, 바로 데모를 보여줘라.  \nTranslate",
    "timestamp": "2025-11-27T08:04:22.000Z",
    "images": [
      "https://scontent-iad3-2.cdninstagram.com/v/t51.2885-15/588000954_17852930637589530_3115163017750846664_n.jpg?stp=dst-jpg_e35_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InRocmVhZHMuRkVFRC5pbWFnZV91cmxnZW4uMjE2MHgxMjA2LnNkci5mODI3ODcuZGVmYXVsdF9pbWFnZS5jMiJ9&_nc_ht=scontent-iad3-2.cdninstagram.com&_nc_cat=106&_nc_oc=Q6cZ2QHgrxrOBEi_eqXMrmfiDdX3j_o7E4JnDU2yJd9VGNapB_a-senBjgZIZW_Il9lVgJI&_nc_ohc=WeCMxiN7Zc4Q7kNvwGggxko&_nc_gid=CZmmu7zoN4syiEHB2bNy1A&edm=APs17CUBAAAA&ccb=7-5&ig_cache_key=Mzc3NDk2Mjg2NDU1NDcxNzQwMg%3D%3D.3-ccb7-5&oh=00_Afm3SeH-ljp6D7EhRYx0phszFpE84lTMXT6l5lDUhMFC8Q&oe=69360721&_nc_sid=10d13b"
    ],
    "postUrl": "https://www.threads.net/@hyle_edu.kr/post/DRjXLmGEzDa",
    "isOriginalAuthor": true
  },
  {
    "authorId": "/@hyle_edu.kr",
    "authorName": null,
    "content": "hyle_edu.kr\nDesign Threads\nAuthor\nyoutube.com/watch…\nyoutube.com\nCursor Head of Design Reviews Startup Websites",
    "timestamp": "2025-11-27T08:04:27.000Z",
    "images": [
      "https://external-iad3-1.xx.fbcdn.net/emg1/v/t13/4510717797100347293?stp=dst-src&url=https%3A%2F%2Fi.ytimg.com%2Fvi%2FRynySryqM_0%2Fmaxresdefault.jpg&utld=ytimg.com&_nc_gid=CZmmu7zoN4syiEHB2bNy1A&_nc_oc=AdnnBnpQiJ-ImFHLB1zQ6KdkwE3eYgejFX751eNz-RdBMIC6qxpnkF8Fk2HROXnpQZk&ccb=13-1&oh=06_Q3-5AXm8t92Bc1cF_D9RD01869Pwh9uLvqptfXeRGYMGpgoL&oe=6931F0AD&_nc_sid=1d65fc"
    ],
    "postUrl": "https://www.threads.net/@hyle_edu.kr/post/DRjXMNbE5Ds",
    "isOriginalAuthor": true
  }
]
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| authorId | string | Author's Threads ID (e.g., "/@username") |
| authorName | string|null | Author's display name (often null in current implementation) |
| content | string | Post text content, newline-separated |
| timestamp | string | ISO 8601 timestamp |
| images | string\[] | Array of image URLs (excludes profile pictures) |
| postUrl | string | Full URL to the post |
| isOriginalAuthor | boolean | Whether this post is from the original thread author |

### Features

#### Smart filtering

**Profile image exclusion**: Automatically removes profile thumbnails by detecting thumbnail size patterns (s150x150, s42x42) in URLs.

**Feed recommendation filtering**: Threads shows recommended posts mixed with replies. This actor filters them out by:

- Identifying the original post author from the URL
- Keeping only posts from that author or replies to their posts
- Excluding unrelated recommended content

#### Stable selectors

Uses DOM attributes that are less likely to change:

- `div[data-pressable-container="true"]` for post containers
- `a[href^="/@"]` for author links
- `time` elements for timestamps
- `span[dir="auto"]` for text content

Avoids obfuscated React Native class names like `x1lliihq` that change frequently.

### Usage

#### Via Apify Console

1. Open the actor in Apify Console
2. Click **Run**
3. Enter a Threads post URL in the input
4. Start the run
5. View results in the **Dataset** tab

#### Via API

##### Start a run

```bash
curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs?token=YOUR_TOKEN&waitForFinish=120" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.threads.net/@username/post/ABC123"
  }'
```

The `waitForFinish=120` parameter makes the request wait up to 120 seconds for results (synchronous mode).

##### Fetch results from dataset

```bash
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_TOKEN"
```

#### Integration with n8n

This actor is designed to work with n8n Cloud via a sub-workflow:

1. **HTTP Request** node calls the actor
2. **HTTP Request** node fetches results from the dataset
3. Results are passed to AI for summarization

See the [blog post](https://sinam7.tistory.com) for detailed n8n integration guide.

### Limitations

- **Public content only**: No login/cookies support
- **DOM structure dependency**: Threads may change their HTML structure at any time
- **Rate limiting**: Respect Apify's rate limits and Threads' terms of service
- **No pagination**: Fetches only initially loaded comments (typically first 10-20)

### Notes

- The actor waits 3 seconds after page load to ensure dynamic content is rendered

- `authorName` is often null because Threads stores author names in complex nested structures

- Image URLs are CDN links that may expire after some time

- This actor is optimized for single post scraping, not bulk operations

- Update the size filters (s150x150, s42x42) in the code

# Actor input Schema

## `url` (type: `string`):

Threads post url to scrape

## Actor input object example

```json
{
  "url": "https://www.threads.net/@username/post/xxxxx"
}
```

# Actor output Schema

## `overview` (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 = {
    "url": "https://www.threads.net/@username/post/xxxxx"
};

// Run the Actor and wait for it to finish
const run = await client.actor("sinam7/threads-post-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 = { "url": "https://www.threads.net/@username/post/xxxxx" }

# Run the Actor and wait for it to finish
run = client.actor("sinam7/threads-post-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 '{
  "url": "https://www.threads.net/@username/post/xxxxx"
}' |
apify call sinam7/threads-post-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sinam7/threads-post-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/lWoEyEYuScRPAgqKO/builds/Dk7JhUGJ95XcmMUfD/openapi.json
