# Threads Post Scraper – Text, Media & Engagement (`scrapingmonkey/threads-post-details-scraper`) Actor

Extract public Threads posts from URLs. Get text, engagement, author details, media, carousel items, topics, links, and available attached context in one row per post.

- **URL**: https://apify.com/scrapingmonkey/threads-post-details-scraper.md
- **Developed by:** [ScrapingMonkey](https://apify.com/scrapingmonkey) (community)
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

Collect the text, media, author, and public engagement behind a Threads post URL. **Threads Post Scraper** handles text, image, video, and carousel posts, bringing their content and available context into one dataset row.

Use it for a known set of campaign, editorial, or research links. No Threads login or cookies are required, and each result retains the submitted URL with a `success` or `failed` status.

| At a glance | Details |
| --- | --- |
| 📥 Input | Full Threads post URLs on threads.com or threads.net |
| 📤 Output | Text, author, engagement, media, topics, links, and available attached context |
| 🔐 Login required | No |
| ⚡ Processing | Up to 5 posts concurrently with automatic retries |
| 💾 Delivery | One dataset row per unique valid post code, including carousel media |

### What the Threads post scraper extracts 🔎

The Actor retrieves the requested post and classifies its visible media as text, image, video, or carousel. Additional fields depend on the content that Threads exposes for that post.

- Post identity, canonical URL, text, publication time, and language
- Author identity, profile link, avatar, verification, and available follower count
- Likes, replies, reposts, quotes, reshares, and views when exposed
- Image and video URLs, variants, dimensions, duration, and ordered carousel media
- Text fragments, mentions, links, topic tags, and link previews
- Embedded quote or repost summaries, polls, location, audio, and source-provided transcription when present
- Reply controls and available edit, pin, spoiler, and interaction flags

This is a post-details lookup. Reply counts and embedded shared-post summaries do not represent a crawl of the full conversation.

### How to scrape Threads post details 🚀

1. Copy a full public Threads post URL.
2. Add it to `inputList`, with one link per item.
3. Start the Actor and inspect the `status` and `type` columns.
4. Export the text, metrics, media references, or other fields you need.

```json
{
  "inputList": [
    "https://www.threads.com/@zuck/post/DQEmdfkkSNE"
  ]
}
```

Both threads.com and threads.net URLs are accepted. Use the full /@username/post/CODE address; bare post codes and profile-only URLs are not supported.

### Threads post data fields and output 📦

| Field group | Included data |
| --- | --- |
| Post and author | Identity, canonical URL, text, dates, language, and author details |
| Engagement | Likes, replies, reposts, quotes, reshares, and views |
| Media | Image and video references, variants, dimensions, and ordered carousel children |
| Text context | Fragments, mentions, links, topics, and link previews |
| Attachments | Available shared-post summaries, polls, location, audio, and transcription |
| Controls | Reply policy and available pin, edit, spoiler, and interaction flags |

Complete illustrative success item; these fictional values show the output structure and are not a live result:

```json
{
  "input": "https://www.threads.com/@trailjournal/post/TrailWalk01",
  "status": "success",
  "url": "https://www.threads.com/@trailjournal/post/TrailWalk01",
  "type": "carousel",
  "text": "A quiet trail morning with @trailguide! Route notes: https://example.com/trail",
  "published_at": "2026-09-01T22:00:00Z",
  "code": "TrailWalk01",
  "id": "3823456789012345678",
  "pk": "3823456789012345678",
  "author.profile_picture_url": "https://example.com/trail-journal.jpg",
  "author.username": "trailjournal",
  "author.name": "Trail Journal",
  "author.profile_url": "https://www.threads.com/@trailjournal",
  "author.id": "7123456789",
  "author.pk": "7123456789",
  "author.is_verified": false,
  "author.is_private": false,
  "author.followers": 18400,
  "statistics.likes": 286,
  "statistics.replies": 18,
  "statistics.reposts": 12,
  "statistics.quotes": 4,
  "statistics.reshares": 7,
  "statistics.views": 8200,
  "image_url": "https://example.com/trail-view.jpg",
  "video_url": "",
  "video_duration": 0.0,
  "width": 1200,
  "height": 800,
  "media_type": 8,
  "accessibility_caption": "",
  "carousel_media_count": 2,
  "carousel_media.position": [
    1,
    2
  ],
  "carousel_media.id": [
    "3823456789012345679",
    "3823456789012345680"
  ],
  "carousel_media.pk": [
    "3823456789012345679",
    "3823456789012345680"
  ],
  "carousel_media.code": [
    "TrailPhoto1",
    "TrailVideo1"
  ],
  "carousel_media.type": [
    "image",
    "video"
  ],
  "carousel_media.media_type": [
    1,
    2
  ],
  "carousel_media.image_url": [
    "https://example.com/trail-view.jpg",
    "https://example.com/trail-video-cover.jpg"
  ],
  "carousel_media.video_url": [
    "",
    "https://example.com/trail-video.mp4"
  ],
  "carousel_media.video_duration": [
    0.0,
    12.5
  ],
  "carousel_media.width": [
    1200,
    1080
  ],
  "carousel_media.height": [
    800,
    1920
  ],
  "carousel_media.accessibility_caption": [
    "Sunlight on a forest path",
    "Walking through the forest"
  ],
  "carousel_media.image_versions.url": [
    [
      "https://example.com/trail-view.jpg",
      "https://example.com/trail-view-small.jpg"
    ],
    [
      "https://example.com/trail-video-cover.jpg"
    ]
  ],
  "carousel_media.image_versions.width": [
    [
      1200,
      600
    ],
    [
      1080
    ]
  ],
  "carousel_media.image_versions.height": [
    [
      800,
      400
    ],
    [
      1920
    ]
  ],
  "carousel_media.video_versions.url": [
    [],
    [
      "https://example.com/trail-video.mp4"
    ]
  ],
  "carousel_media.video_versions.width": [
    [],
    [
      1080
    ]
  ],
  "carousel_media.video_versions.height": [
    [],
    [
      1920
    ]
  ],
  "carousel_media.video_versions.type": [
    [],
    [
      101
    ]
  ],
  "carousel_media.video_versions.bitrate": [
    [],
    [
      2500000
    ]
  ],
  "image_versions.url": [
    "https://example.com/trail-view.jpg"
  ],
  "image_versions.width": [
    1200
  ],
  "image_versions.height": [
    800
  ],
  "video_versions.url": [],
  "video_versions.width": [],
  "video_versions.height": [],
  "video_versions.type": [],
  "video_versions.bitrate": [],
  "text_fragments.text": [
    "A quiet trail morning with @trailguide! Route notes: https://example.com/trail"
  ],
  "text_fragments.type": [
    "plaintext"
  ],
  "text_fragments.url": [
    ""
  ],
  "text_fragments.user_id": [
    ""
  ],
  "text_fragments.username": [
    ""
  ],
  "text_fragments.profile_url": [
    ""
  ],
  "mentions.user_id": [
    ""
  ],
  "mentions.username": [
    "trailguide"
  ],
  "mentions.profile_url": [
    "https://www.threads.com/@trailguide"
  ],
  "links.url": [
    "https://example.com/trail"
  ],
  "links.text": [
    "https://example.com/trail"
  ],
  "topic.name": "Hiking",
  "topic.url": "https://www.threads.com/search?q=Hiking&serp_type=tags&tag_id=53421",
  "topic.id": "53421",
  "link_preview.url": "https://example.com/trail",
  "link_preview.display_url": "example.com/trail",
  "link_preview.title": "Forest loop route notes",
  "link_preview.description": "A short route with shaded paths and a viewpoint.",
  "link_preview.image_url": "https://example.com/trail-view.jpg",
  "link_preview.favicon_url": "https://example.com/favicon.png",
  "quoted_post.id": "",
  "quoted_post.pk": "",
  "quoted_post.code": "",
  "quoted_post.url": "",
  "quoted_post.text": "",
  "quoted_post.timestamp": 0,
  "quoted_post.author.id": "",
  "quoted_post.author.pk": "",
  "quoted_post.author.username": "",
  "quoted_post.author.name": "",
  "quoted_post.author.profile_url": "",
  "quoted_post.author.profile_picture_url": "",
  "quoted_post.author.is_verified": false,
  "quoted_post.author.is_private": false,
  "quoted_post.author.followers": 0,
  "quoted_post.image_url": "",
  "quoted_post.video_url": "",
  "quoted_post.media_type": 0,
  "reposted_post.id": "",
  "reposted_post.pk": "",
  "reposted_post.code": "",
  "reposted_post.url": "",
  "reposted_post.text": "",
  "reposted_post.timestamp": 0,
  "reposted_post.author.id": "",
  "reposted_post.author.pk": "",
  "reposted_post.author.username": "",
  "reposted_post.author.name": "",
  "reposted_post.author.profile_url": "",
  "reposted_post.author.profile_picture_url": "",
  "reposted_post.author.is_verified": false,
  "reposted_post.author.is_private": false,
  "reposted_post.author.followers": 0,
  "reposted_post.image_url": "",
  "reposted_post.video_url": "",
  "reposted_post.media_type": 0,
  "poll.id": "",
  "poll.question": "",
  "poll.expiration_timestamp": 0,
  "poll.is_finished": false,
  "poll.options.id": [],
  "poll.options.text": [],
  "poll.options.votes": [],
  "poll.options.votes_percentage": [],
  "location.name": "",
  "location.address": "",
  "location.city": "",
  "location.latitude": 0.0,
  "location.longitude": 0.0,
  "location.id": "",
  "audio.title": "",
  "audio.artist": "",
  "audio.album": "",
  "audio.audio_url": "",
  "audio.cover_url": "",
  "audio.duration": 0,
  "audio.is_original_audio": false,
  "audio.id": "",
  "language": "en",
  "transcription": "",
  "reply_control": "everyone",
  "timestamp": 1788300000,
  "is_reply": false,
  "is_quote_post": false,
  "is_repost": false,
  "is_pinned": false,
  "is_edited": false,
  "is_ghost_post": false,
  "is_spoiler_media": false,
  "comments_disabled": false,
  "counts_hidden": false,
  "can_reply": true,
  "can_reshare": true
}
```

The example includes every output field; optional attachments are empty where this illustrative post has none. The table and JSON use the same literal dotted keys, such as `author.username` and `statistics.likes`.

Related list columns keep their positions. The second value in `carousel_media.type` describes the same child as the second value in `carousel_media.video_url`. Variant fields, such as `carousel_media.image_versions.url`, keep an inner list for each child; an empty inner list means that child has no variants of that kind. Mentions, links, and poll options each have their own aligned lists.

Missing values in success rows use empty strings, `0`, `false`, or empty lists. In particular, a zero metric may mean the source omitted it. Failed rows keep `input` and `status` and set the post-data fields to `null`.

### Input requirements and coverage ⚙️

| Parameter | Type | Required | Rules |
|---|---|---|---|
| `inputList` | array of strings | Yes | At least one full Threads /@username/post/CODE URL; no fixed batch-size maximum |

HTTP and HTTPS URLs on threads.com, threads.net, and their subdomains are accepted. Trailing slashes, query parameters, and fragments are allowed. Successful output uses a canonical threads.com URL.

Valid links are deduplicated by post code, including .com and .net links to the same post. Invalid input entries receive individual failed rows. There are no search terms, profile pagination, or reply-pagination settings.

### Threads post use cases 🎯

#### Campaign reporting

Collect selected post text, author context, and available likes, replies, reposts, and views for a campaign report.

#### Editorial research

Store topics, outgoing links, preview text, and quoted-post context beside the original public post.

#### Mixed-media catalogues

Keep text, image, video, and carousel posts in a common dataset while preserving each carousel's media order.

#### Public content review

Export the visible text, media references, and available content flags for authorized human or automated review.

### Pricing and billable post rows 💰

Check the Actor's **Pricing** tab for the current pricing model and rate.

Under dataset-item pricing, each saved success or failed row can be billable. Valid duplicate requests are processed once; invalid entries can each save a failed row. Automatic retries do not independently create extra dataset rows.

Carousel children, media variants, mentions, poll options, and embedded quote summaries stay in their parent post's row.

### Threads Post Details Scraper API and integrations 🔌

Use the Actor ID from the **API** tab as `$ACTOR_ID` and your Apify token as `$APIFY_TOKEN`.

```bash
curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"inputList":["https://www.threads.com/@zuck/post/DQEmdfkkSNE"]}'
```

The request starts a run. Retrieve its dataset after completion, or connect an Apify schedule and webhook to repeat collection and trigger downstream work. Export to JSON, CSV, or Excel, or send selected fields to Google Sheets, Make, Zapier, or your own application.

### Reliability and limits ⚠️

The Actor processes up to five post requests concurrently and retries temporary failures. It matches the requested post code before saving a success result. An unavailable post or exhausted request produces a failed row while other valid inputs can continue.

Private, deleted, restricted, or login-gated content may be inaccessible. Optional attachments and engagement figures can be absent. A transcription is returned only when it already exists in the accessible post data; no speech recognition is performed. Media URLs can expire, and shared-post summaries are limited to the context attached to the requested post.

### Frequently asked questions ❓

#### Do old threads.net links work?

Yes. Full post URLs on threads.net and threads.com are accepted, and the result uses a canonical threads.com URL.

#### Does it collect all replies?

No. It returns the available reply count and the requested post's details, without paginating a conversation.

#### Will carousel items create extra rows?

No. All children remain in the post's row as aligned lists, with nested lists for each child's media variants.

#### Are quoted posts fetched separately?

No. Quote and repost fields contain the summaries exposed with the requested post, not a separate full scrape of each referenced post.

#### Does it generate a transcript for videos?

No. It only returns a transcription if Threads exposes one in the post data.

#### Why are poll or audio fields empty?

Most posts do not contain every attachment type. Empty values can mean an attachment is absent or unavailable in the retrieved data.

### Support, responsible use, and related actors 🛟

For help with a result, share the run ID and a safe public example input through the Actor's support channel. Keep tokens and other credentials out of support messages.

Use public data and media within the permissions and obligations that apply to your project, including privacy and copyright requirements.

# Actor input Schema

## `inputList` (type: `array`):

Add one full Threads post URL per item, for example https://www.threads.com/@username/post/POSTCODE. Only complete post links are accepted; post codes are not supported.

## Actor input object example

```json
{
  "inputList": [
    "https://www.threads.com/@zuck/post/DQEmdfkkSNE"
  ]
}
```

# Actor output Schema

## `posts` (type: `string`):

One dataset row for every submitted link. Check the status field to distinguish successfully extracted posts from failed inputs.

# 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 = {
    "inputList": [
        "https://www.threads.com/@zuck/post/DQEmdfkkSNE"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/threads-post-details-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 = { "inputList": ["https://www.threads.com/@zuck/post/DQEmdfkkSNE"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapingmonkey/threads-post-details-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 '{
  "inputList": [
    "https://www.threads.com/@zuck/post/DQEmdfkkSNE"
  ]
}' |
apify call scrapingmonkey/threads-post-details-scraper --silent --output-dataset

```

## MCP server setup

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