# Threads Scraper: Profiles, Posts, Replies & Search (`stratumics/threads-scraper`) Actor

Scrape Threads profiles, posts, replies and keyword search: followers, bio, post text, likes, replies, reposts, quotes, media and links. No login. Monitoring returns only new posts.

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

## Pricing

from $1.00 / 1,000 profiles

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 Scraper** collects public Threads profiles, posts, replies and keyword search results without logging in: followers, bio and bio links for each profile, and text, date, likes, replies, reposts, quotes, shares, images, videos, link previews, topic tags and quoted posts for each post. Paste usernames, profile links, post links or search terms and get clean rows you can export, so it works as a **Threads API and Threads profile scraper** with no Threads or Instagram account.

It reads public pages only and never logs in.

### What does Threads Scraper do?

- **Profiles**: give it `@nasa`, `nasa` or `https://www.threads.com/@nasa` and get a profile row with the exact follower count, display name, bio, bio links, verified badge and profile picture, plus the profile's posts, newest first, as deep as you ask within Threads' page limit (pinned posts come first, as on the profile).
- **Posts**: every post row has its text, publishing time, likes, replies, reposts, quotes and shares, the media (image and video links, carousels), the attached link preview, the topic tag, mentions, links in the text, the quoted or reposted post and the author.
- **Replies**: turn on replies and get the replies Threads shows under each post, nested conversations included, each linked to what it answers.
- **Post links**: paste links to single posts for their full rows and replies.
- **Keyword search**: the Recent or Top results Threads shows for a term.
- **Monitoring**: run it on a schedule and get only the posts published since the last run, per profile and per search term.

Limits of signed-out access, said plainly: Threads shows visitors who are not logged in about ten replies per post and about 20 results per search, so those two features give that much and no more. It also limits how many pages of posts one address can read in a row: in testing, a run read about 70 pages (about 1,700 posts) before Threads asked it to wait. The run then keeps everything: a profile cut short keeps the posts read so far, profiles it had not reached yet get the posts on their profile page (5 to 10), and the final message says how many profiles stopped early. Private profiles show no posts to anyone who is not an approved follower; they come back as free status rows.

### Why use this Threads scraper?

- **Cheaper than the leaders.** $1.50 per 1,000 posts on the Free plan and $0.80 on Business, where the most used Threads scrapers charge $2.50 to $5.00 per 1,000 and add start fees.
- **Deep profile history.** Profiles page through Threads' own timeline, 25 posts per page; in testing one run read 1,768 posts from two profiles, one of them back to its first post in July 2023.
- **Checked against the live site.** In testing, 10 of 10 posts had the same text as their pages in a signed-out browser, and likes, replies, reposts and shares were within 6% of the numbers the pages showed 15 minutes later (new likes and reposts, and the page's rounding such as "1.5K").
- **No login, no cookies.** Nothing to set up and no account at risk.
- **Monitoring built in.** Turn on "Only new posts" and schedule the run: each run returns only posts you have not received yet.
- **You pay for results only.** Private and missing profiles, deleted posts, filtered-out posts and errors are never charged.
- **Restart-safe.** If the platform moves a run to another server, it continues where it stopped and never stores or charges a row twice.

On top of that you get the Apify platform: scheduled runs, an API, webhooks, run history, and exports to JSON, CSV, Excel and more.

### What data can you extract from Threads?

| Field                                                                                                        | What it holds                                                  | Example                         |
| ------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------- | ------------------------------- |
| `type`                                                                                                       | `profile`, `post` or `reply`                                   | `post`                          |
| `id`, `code`, `url`                                                                                          | Threads id, the code in the link, and the link                 | `DekCdIIEZCG`                   |
| `text`, `createdAt`                                                                                          | The text, and the publishing time in UTC                       | `New podcast episode alert!`    |
| `likes`, `replies`, `reposts`, `quotes`, `shares`                                                            | Counts for the post                                            | `310`, `16`, `16`, `2`, `3`     |
| `mediaType`, `imageUrls`, `videoUrls`                                                                        | text, image, video or carousel, and the media links            | `text`, `[]`, `[]`              |
| `linkUrl`, `linkTitle`                                                                                       | The link preview attached to the post                          | `https://open.spotify.com/...`  |
| `topic`, `mentions`, `textLinks`                                                                             | Topic tag, @mentions and links in the text                     | `Podcast Threads`               |
| `quotedPost`, `repostedPost`                                                                                 | The post this one quotes or reposts (code, link, author, text) | `null`                          |
| `isPinned`, `isReply`, `replyToUsername`                                                                     | Pinned to the profile, and replies                             | `true`                          |
| `authorUsername`, `authorFullName`, `authorId`, `authorIsVerified`, `authorProfilePicUrl`                    | The author on every post and reply                             | `nasa`, `NASA`                  |
| `username`, `fullName`, `followers`, `bio`, `bioLinks`, `isVerified`, `isPrivate`, `profilePicUrl`, `status` | Profile rows; `status` is `ok`, `private` or `notFound`        | `nasa`, `12783247`              |
| `postCode`, `postUrl`, `parentId`                                                                            | Reply rows: the post and what the reply answers                | `DekCdIIEZCG`                   |
| `input`, `scrapedAt`                                                                                         | The input the row came from, and when it was collected         | `https://www.threads.com/@nasa` |

The full list of fields, with descriptions, is on the Dataset tab of the output.

### How to scrape Threads

1. Open Threads Scraper in Apify Console and click **Try for free**.
2. In **Profiles**, paste usernames or profile links; in **Post links**, paste post links; in **Search terms**, add keywords. Use any mix.
3. Set **Max posts per profile or search** (the default is 20) and, if you want them, turn on **Include replies**.
4. Optionally set **Only posts newer than**, or turn on monitoring.
5. Click **Start**. When the run finishes, download the data as JSON, CSV or Excel, or read it through the API.

### How much does it cost to scrape Threads?

The scraper uses pay-per-event pricing: you pay for each row saved to your dataset, plus a start fee of $0.0005 per run.

| Event         | Free                           | Starter         | Scale           | Business        |
| ------------- | ------------------------------ | --------------- | --------------- | --------------- |
| Post saved    | $1.50 per 1,000 ($0.0015 each) | $1.20 per 1,000 | $1.00 per 1,000 | $0.80 per 1,000 |
| Reply saved   | $0.50 per 1,000 ($0.0005 each) | $0.50 per 1,000 | $0.40 per 1,000 | $0.30 per 1,000 |
| Profile saved | $2.00 per 1,000 ($0.002 each)  | $2.00 per 1,000 | $1.50 per 1,000 | $1.00 per 1,000 |

Private and missing profiles are free status rows. The **Pricing** tab always shows the current prices.

Worked examples on the Free plan:

- **10 profiles, 100 posts each**: 10 profile rows ($0.02) plus 1,000 posts ($1.50) cost **about $1.52**.
- **200 posts with their replies** (about 10 each): $0.30 for the posts plus about 2,000 replies ($1.00), **about $1.30**.
- **A daily monitor of 20 accounts** that post three times a day, with profile rows turned off, saves about 1,800 posts a month: **about $2.72 a month**, start fees included.

Set **Maximum cost per run** in the run options to cap your spend. The scraper stops cleanly at that amount and keeps everything collected so far.

### Input

See the **Input** tab for every option. A typical input:

```json
{
    "profiles": ["https://www.threads.com/@nasa", "@zuck"],
    "posts": ["https://www.threads.com/@nasa/post/DekCdIIEZCG"],
    "searchTerms": ["artemis ii"],
    "searchSort": "recent",
    "maxPostsPerProfile": 50,
    "includeReplies": true,
    "maxRepliesPerPost": 20,
    "newerThan": "30 days"
}
```

- **Profiles**: usernames with or without @, or profile links on threads.com or threads.net.
- **Post links**: `https://www.threads.com/@user/post/<code>` (threads.net and `/t/<code>` links work too).
- **Search terms**: one per line; **Search results** picks Recent (newest) or Top (highest ranked).
- **Max posts per profile or search**: up to 5,000 per profile, within Threads' page limit for one run (about 1,700 posts in all in testing); a search gives about 20. Set 0 for profile rows only.
- **Only posts newer than**: a date (`2026-10-01`), an ISO date-time in UTC, or a relative value such as `7 days`. Profiles stop reading at the first older posts, so you pay only for what is in range.

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. Three rows from real runs (long text and links shortened, the replier's name and ids replaced): a profile, its pinned post, and a reply in a conversation under that post.

```json
[
    {
        "type": "profile",
        "status": "ok",
        "id": "28829152388",
        "username": "nasa",
        "fullName": "NASA",
        "bio": "Making the seemingly impossible, possible. ✨",
        "bioLinks": [],
        "followers": 12783247,
        "isVerified": true,
        "isPrivate": false,
        "profilePicUrl": "https://scontent-iad6-1.cdninstagram.com/v/t51.82787-19/669747085_1808...",
        "url": "https://www.threads.com/@nasa",
        "input": "https://www.threads.com/@nasa",
        "scrapedAt": "2026-10-18T07:25:36.425Z"
    },
    {
        "type": "post",
        "id": "4009340365949735046",
        "code": "DekCdIIEZCG",
        "url": "https://www.threads.com/@nasa/post/DekCdIIEZCG",
        "text": "🚨New podcast episode alert! \n\nThe world watched them make history during Artemis II. Now, hear what stayed with them. ...",
        "createdAt": "2026-10-16T17:10:38.000Z",
        "likes": 310,
        "replies": 16,
        "reposts": 16,
        "quotes": 2,
        "shares": 3,
        "mediaType": "text",
        "imageUrls": [],
        "videoUrls": [],
        "linkUrl": "https://open.spotify.com/episode/6M0CTlebFLsktPvvuZZJV6?si=vLnxWuqMTquh8dtxEUx9Pw",
        "linkTitle": "Reflections After Artemis II with Victor and Jeremy",
        "topic": "Podcast Threads",
        "mentions": [],
        "textLinks": [],
        "quotedPost": null,
        "repostedPost": null,
        "isPinned": true,
        "isReply": false,
        "replyToUsername": null,
        "authorUsername": "nasa",
        "authorFullName": "NASA",
        "authorId": "28829152388",
        "authorIsVerified": true,
        "authorProfilePicUrl": "https://scontent-iad6-1.cdninstagram.com/v/t51.82787-19/669747085_1808...",
        "input": "https://www.threads.com/@nasa",
        "scrapedAt": "2026-10-18T07:25:36.508Z"
    },
    {
        "type": "reply",
        "id": "4009371609127307672",
        "code": "DekJjxmkcmY",
        "url": "https://www.threads.com/@replier_one/post/DekJjxmkcmY",
        "postCode": "DekCdIIEZCG",
        "postUrl": "https://www.threads.com/@nasa/post/DekCdIIEZCG",
        "parentId": "4009342055197025071",
        "text": "They were holding them back, waiting for the right moment, the interviews were held 2 months ago (at least Reid and Christina, haven't listened to part 2 yet). Just when we need them!",
        "createdAt": "2026-10-16T18:12:42.000Z",
        "likes": 0,
        "replies": 0,
        "authorUsername": "replier_one",
        "authorFullName": "Replier One",
        "authorId": "60000000001",
        "authorIsVerified": false,
        "authorProfilePicUrl": "https://scontent-iad6-1.cdninstagram.com/v/t51.2885-19/...",
        "input": "https://www.threads.com/@nasa/post/DekCdIIEZCG",
        "scrapedAt": "2026-10-18T07:14:32.653Z"
    }
]
```

Each run also saves a **SUMMARY** record in its key-value store with, for every input, its status, the profile status, posts and replies saved, pages read, why reading stopped, and any problem.

### Monitoring new posts

1. Turn on **Only new posts (monitoring mode)** and enter a **Monitor name**, for example `brand-watch`.
2. Run it once. This first run sets the starting point and returns posts like a normal run.
3. Schedule the same input (hourly or daily). Each later run returns only posts published after the first run that it has not delivered before. A profile stops reading as soon as it reaches posts it already delivered, so a monitoring run that finds nothing costs only the start fee (plus the profile rows, if you keep them on). When there is nothing new, the run ends with "No new posts since the last run".

For search terms, monitoring returns the new posts among the results Threads shows at that moment (about 20). Threads reshuffles those results between requests, so a busy term can let a post slip past between two runs; profiles do not have that gap. Turn off **Save a profile row per profile** if you only want the new posts. The memory is a key-value store in your account named `threads-scraper-monitor-<name>`.

### Tips for scraping Threads

- **Counts on the website**: Threads' page shows reposts and quotes added together under the repost icon; this scraper gives them as two numbers, `reposts` and `quotes`.
- **Track growth over time**: schedule a daily run with profile rows on and compare `followers` between runs.
- **Only need recent posts?** Set **Only posts newer than** to `7 days`: each profile stops at the first older posts.
- **Need the images or videos?** Download them right after the run: Threads signs media links and they expire.

### Integrations and API

- **API**: start runs and read results over HTTP from any language. See the **API** tab for ready-made requests.
- **JavaScript**:

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('stratumics/threads-scraper').call({
    profiles: ['@nasa', '@zuck'],
    maxPostsPerProfile: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((item) => item.type === 'post').map((item) => [item.authorUsername, item.likes]));
```

- **Python**:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("stratumics/threads-scraper").call(
    run_input={"searchTerms": ["artemis ii"], "searchSort": "recent", "includeReplies": True}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if item["type"] == "post":
        print(item["createdAt"], item["authorUsername"], (item["text"] or "")[:60])
```

- **No-code tools**: connect runs to Zapier, Make, n8n, Google Sheets, Slack or your own webhook from the **Integrations** tab, for example to post every new post of a competitor into a team channel.
- **AI agents**: add the Actor to any agent or chat app that supports the Model Context Protocol through the Apify MCP server at `https://mcp.apify.com?tools=stratumics/threads-scraper`, then ask in plain words, such as "get the last 50 posts of these accounts and tell me which topics got the most replies".

### FAQ

#### Why do I get only about ten replies per post?

That is what Threads shows to visitors who are not logged in: the top replies under a post, with some of the conversations inside them. This scraper never logs in, so it gives the same: in testing, most posts gave 9 to 12 replies (4 to 19 in all), whether they had 20 replies or over 1,000.

#### Why does search give only about 20 results?

Threads shows signed-out visitors one page of search results, about 20 posts, in Recent or Top order. For more posts on a topic, add more specific terms, or follow the accounts that post about it.

#### What about private profiles and usernames that do not exist?

Both come back as free rows with a `status`: `private` when Threads shows the profile but hides its posts, and `notFound` when Threads sends signed-out visitors to its login page instead of a profile (the username does not exist, or Threads hides the profile from them). Nothing is charged for them.

#### Why did a profile stop before my limit?

Threads limits how many pages of posts one address can read in a row while signed out. In testing, a run read about 70 pages (25 posts each, so about 1,700 posts) before Threads asked it to wait, and the wait lasted more than 7 minutes. The scraper does not hammer it: it keeps every post read so far, gives the profiles it had not reached yet the posts on their profile page, marks the profiles cut short `stoppedBecause: "limited"` in the SUMMARY record, and says how many stopped early in its final message. Run those profiles again later; in testing, a new run started a few minutes later read the full 70 pages again. Searches and post links load from their own pages and keep working; only replies beyond what a post page shows need the limited calls.

#### Do I need a Threads or Instagram account, cookies or a proxy?

No account and no cookies. No proxy: Threads answers Apify's servers directly, up to the page limit above. Apify datacenter proxy was refused by Threads in testing, so it is not used; you can still set your own proxy in the input.

#### Is it legal to scrape Threads?

Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

The personal data in the output is what Threads shows publicly: the usernames, display names, ids, profile pictures and posts of the accounts you ask for and of the people who wrote the replies and search results you ask for, and the bios and bio links of the profiles you ask for. No email addresses, phone numbers, followers lists or private data are collected. Threads is a trademark of its owner, and this tool is not affiliated with or endorsed by Threads.

#### Something looks wrong. Where do I report it?

Open an issue on the **Issues** tab with the run link and the profile, post or search term. Most problems can be reproduced and fixed quickly.

### Other tools from Stratum ICS

- [Airbnb Scraper](https://apify.com/stratumics/airbnb-scraper): Get every Airbnb listing in a city or from listing links: price per night, rating, reviews, guests, bedrooms, host and Superhost status.
- [App Store Reviews Scraper](https://apify.com/stratumics/app-store-reviews-scraper): Get Apple App Store reviews with star ratings, titles, text, app versions, helpful votes and developer replies, well past Apple's 500-review limit, for any country, plus app ratings.
- [Bilibili Scraper](https://apify.com/stratumics/bilibili-scraper): Scrape Bilibili videos by search, link or uploader without logging in: views, likes, coins, tags, uploader profiles, comments with replies and danmaku, in clean rows.
- [Facebook Ads Library Scraper](https://apify.com/stratumics/facebook-ads-library-scraper): Get ads from the Meta (Facebook) Ad Library by keyword, advertiser page or library link: texts, images, videos, dates, platforms and versions, plus spend for political ads.
- [Facebook Posts Scraper](https://apify.com/stratumics/facebook-posts-scraper): Get posts from public Facebook pages: text, reactions by type, comments, shares, views and media, plus page details with followers, contacts, rating and creation date.
- [Google Ads Transparency Scraper](https://apify.com/stratumics/google-ads-transparency-scraper): Get the ads any advertiser runs on Google Search, YouTube, Shopping, Maps and Play, from the Ads Transparency Center: images, formats, dates, regions and EU reach.
- [Google Maps Reviews Scraper](https://apify.com/stratumics/google-maps-reviews-scraper): Get the Google Maps reviews of any place: rating, full text, exact date, photos, owner reply, reviewer details and food or service scores.
- [Google Maps Scraper](https://apify.com/stratumics/google-maps-scraper): Get the businesses on Google Maps for any search and area: name, address, phone, website, rating, review count, opening hours, plus emails and social profiles.
- [Google News Scraper](https://apify.com/stratumics/google-news-scraper): Get Google News articles with real publisher URLs (not Google redirects), source, date, image, author and optional full text.
- [Google Play Reviews Scraper](https://apify.com/stratumics/google-play-reviews-scraper): Get Google Play reviews with star ratings, text, app versions, thumbs-up counts, developer replies and feature ratings in any language, plus app details with installs and star histogram.
- [Google Trends Scraper](https://apify.com/stratumics/google-trends-scraper): Get Google Trends data as JSON, CSV or Excel: interest over time, interest by region and city, related queries, and trending searches by country.
- [Instagram Scraper](https://apify.com/stratumics/instagram-scraper): Scrape public Instagram profiles, posts, reels and comments without logging in: followers, bio, posts count, captions, likes, video views, media links, tags and music.
- [LinkedIn Jobs Scraper](https://apify.com/stratumics/linkedin-jobs-scraper): Scrape LinkedIn jobs with full descriptions, salary ranges, seniority, job type and applicant counts.
- [Reddit Scraper](https://apify.com/stratumics/reddit-scraper): Get Reddit posts and full comment threads from subreddits, searches, user profiles and post links: titles, text, scores, flair, media and replies.
- [Telegram Channel Scraper](https://apify.com/stratumics/telegram-channel-scraper): Get messages from public Telegram channels with views, dates, media, reactions, polls and forwards, plus channel info with exact subscriber counts.
- [TikTok Comments Scraper](https://apify.com/stratumics/tiktok-comments-scraper): Export TikTok comments and replies from any video or photo post: text, date, likes, reply count, commenter, pinned and creator-liked flags, plus video stats.
- [TikTok Scraper](https://apify.com/stratumics/tiktok-scraper): Scrape TikTok profiles and videos: followers, likes, bio, the latest 10 to 12 videos of each profile, and full stats for any video link.
- [Website Contact Scraper](https://apify.com/stratumics/website-contact-scraper): Turn a list of websites into one row per company with verified emails, formatted phone numbers, social profiles (LinkedIn, Facebook, Instagram, X), address and contact page.
- [YouTube Scraper](https://apify.com/stratumics/youtube-scraper): Get YouTube videos from searches, channels, playlists and links with exact views, likes, comment counts, dates and tags, plus channel profiles and comments.
- [YouTube Transcript Scraper](https://apify.com/stratumics/youtube-transcript-scraper): Get YouTube transcripts and captions as plain text, timed segments, SRT or WebVTT, from video links, whole channels or playlists, in any language YouTube offers.

# Actor input Schema

## `profiles` (type: `array`):

Threads usernames (@nasa or nasa) or profile links (https://www.threads.com/@nasa), one per line. Each gives a profile row and the profile's latest posts.

## `posts` (type: `array`):

Links to single Threads posts (https://www.threads.com/@user/post/...), one per line. Each gives one post row, and its replies when replies are on.

## `searchTerms` (type: `array`):

Keywords to search on Threads, one per line. Threads shows signed-out visitors about 20 results per search, so each term gives up to that many posts.

## `searchSort` (type: `string`):

Recent: the newest posts for the term. Top: the posts Threads ranks highest.

## `maxPostsPerProfile` (type: `integer`):

The most posts to save from each profile, newest first (pinned posts come first, as on the profile), and from each search term. Set 0 for profile rows only. Threads limits how many pages one run can read while signed out (about 1,700 posts in all in testing); profiles reached after that get the posts on their profile page.

## `includeProfileRows` (type: `boolean`):

Save one row per profile with followers, bio, bio links, verified badge and picture. Turn it off when you only want posts, for example in a monitoring schedule. Private and missing profiles always get a free status row.

## `includeReplies` (type: `boolean`):

Also save the replies under each post, each as a row of its own with the post it answers. Threads shows signed-out visitors about ten replies per post. Replies are charged separately.

## `maxRepliesPerPost` (type: `integer`):

The most replies to save under each post when replies are on.

## `newerThan` (type: `string`):

Keep only posts published on or after this date. Use a date (2026-10-01), an ISO date-time in UTC (2026-10-01T12:00:00Z), or a relative value such as "7 days" or "12 hours". Profiles stop at the first older posts, so you pay only for what is in range. Post links are always returned. Leave empty for no limit.

## `onlyNewPosts` (type: `boolean`):

Remember what was delivered for each profile and search term and, on later runs, return only posts published since monitoring began and not delivered yet. The first run returns posts like a normal run. Run it on a schedule to follow accounts or topics. Post links are not affected.

## `monitorName` (type: `string`):

Name of the memory used by monitoring mode, kept in a key-value store of your account. Runs with the same name share it, so use one name per schedule. Letters, digits and hyphens only.

## `proxyConfiguration` (type: `object`):

Threads answers Apify's servers directly, so no proxy is used by default. Apify datacenter proxy was refused by Threads in testing; choose a proxy here only if you want every request to go through it.

## Actor input object example

```json
{
  "profiles": [
    "https://www.threads.com/@nasa",
    "@zuck"
  ],
  "posts": [
    "https://www.threads.com/@nasa/post/DekCdIIEZCG"
  ],
  "searchTerms": [
    "artemis ii"
  ],
  "searchSort": "recent",
  "maxPostsPerProfile": 20,
  "includeProfileRows": true,
  "includeReplies": false,
  "maxRepliesPerPost": 20,
  "newerThan": "",
  "onlyNewPosts": false,
  "monitorName": "default",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `rows` (type: `string`):

One record per profile, post or reply; the type field tells them apart.

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

Status, posts and replies saved and any problem for each input.

# 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 = {
    "profiles": [
        "https://www.threads.com/@nasa"
    ],
    "maxPostsPerProfile": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stratumics/threads-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 = {
    "profiles": ["https://www.threads.com/@nasa"],
    "maxPostsPerProfile": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("stratumics/threads-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 '{
  "profiles": [
    "https://www.threads.com/@nasa"
  ],
  "maxPostsPerProfile": 20
}' |
apify call stratumics/threads-scraper --silent --output-dataset

```

## MCP server setup

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