# Threads (`canadesk/threads`) Actor

Collect or Search for Posts and User profiles on Threads. It's fast and costs little!

- **URL**: https://apify.com/canadesk/threads.md
- **Developed by:** [Canadesk Support](https://apify.com/canadesk) (community)
- **Categories:** SEO tools, Social media, News
- **Features:** Full permissions
- **Stats:** 384 total users, 13 monthly users, 97.7% runs succeeded, 19 bookmarks
- **User rating**: 1.00 out of 5 stars

## Pricing

from $2.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.

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

Collect public profiles, posts, replies, reposts and search results from **Threads**. Run one profile or search term, or submit up to 100 inputs in one batch.

### Features

| **Process** | **What you get** |
| :--- | :--- |
| Get User Profile | Username, name, biography, follower count, verification status, profile image and website, when available. |
| Get User Posts | Recent posts with text, links, dates and engagement counts, plus the account's profile. |
| Get User Replies | The account's public replies with the original post and author for context. |
| Get User Reposts | Posts shared by the account, plus its profile. |
| Search for User | Public accounts matching your search terms. |
| Search | Public posts matching a keyword or phrase. |

Results include the text, timestamps, links, engagement counts and profile fields available in the public response. Posts and search use the initial response; they do not provide a complete account archive.

### Getting started

1. Select a process, such as **Get User Posts**.
2. Add one or more usernames or profile URLs, such as `microsoft365` and `https://www.threads.com/@spotify/`. For searches, enter keywords or phrases instead.
3. Set the maximum posts or matches per query. Optionally choose the newest posts first or enter a **Since date**.
4. Start the Actor, then open the dataset to review or download your results.

Both `threads.com` and `threads.net` profile URLs are supported. Use usernames or profile URLs rather than numeric profile IDs.

#### Example: collect posts from two profiles

```json
{
  "process": "gt",
  "keyword": ["microsoft365", "https://www.threads.com/@spotify/"],
  "maximum": 25,
  "sort": "recent",
  "includeraw": "yes",
  "proxy": { "useApifyProxy": true }
}
```

To search posts, use `"process": "st"` and enter search phrases in `keyword`. The other process values are `gu` (profile), `gi` (replies), `go` (reposts) and `su` (user search).

### Filters and options

| Option | How to use it |
| --- | --- |
| Profiles or search terms | Add multiple entries to collect them in one run; up to 10,000 entries are accepted. |
| Maximum posts or matches | Choose the result limit per query; the default is 25. A returned profile is additional. |
| Sorting | Keep pinned posts first or sort from newest to oldest. |
| Since date | Enter `YYYY-MM-DD` to exclude older posts from the available results. |
| Raw data | Include additional profile, post and media fields. |
| Proxy configuration | Use the preselected Apify proxy or provide your own. |

### Your results

Profile results include identifying information and available account details. Post results include `id`, `url`, `text`, `date`, `timestamp`, and available counts for likes, replies, reposts, quotes and shares. Reply results also include the original author and reply content.

With pay-per-event pricing, each profile, post, reply entry, repost or user-search match is a separate result. Embedded author details and reply context are included in that result.

### Pricing

Each valid pay-per-event run with at least one input includes a minimum charge of **100 result units**, shared across all inputs in that run. Any placeholder rows are clearly marked and contain no scraped data; filter them out when exporting. Each separate run has its own minimum, including scheduled or API runs. Platform usage is included.

Export rows with `rowType: result` to include only collected data. A minimum already charged still applies if lookups fail or the run is stopped; interrupted runs may contain fewer rows.

Until a scheduled switch to pay-per-event takes effect, existing rental pricing and the grouped `{profile, data}` output remain active, without placeholders.

### Availability

Threads exposes a limited recent window through its public website. The Actor cannot guarantee complete post history or the requested number of results. Private or unavailable profiles may return no data. For ongoing monitoring, schedule regular runs and use the date filter to focus on recent posts.

### Support

Open an issue on the Actor's Issues tab and include your run URL and the profiles or search terms involved.

#### Unsuccessful lookups

If a lookup problem prevents a run from returning any real results, the run returns one clear error record and applies a reduced minimum of $0.02 at the current rate, plus the listed start fee.

# Actor input Schema

## `process` (type: `string`):

No description

## `keyword` (type: `array`):

Usernames or Threads profile URLs; numeric IDs are not supported. Search modes accept phrases. Shared minimum charge of 100 result units per valid non-empty PPE run, including runs with no matches. Each separate run has its own minimum; see Pricing for current rates. Up to 100 inputs per run.

## `maximum` (type: `integer`):

Limits returned posts or search matches after filtering. A separately returned profile is an additional result. Public availability may be lower.

## `sort` (type: `string`):

Sort posts after collection; keep upstream order or show latest first.

## `since` (type: `string`):

Applied after data collection. Format: YYYY-MM-DD

## `includeraw` (type: `string`):

Includes raw data.

## `pause` (type: `integer`):

Wait time between requests.

## `proxy` (type: `object`):

Optional Apify datacenter or custom proxy. Explicit settings are honored; there is no automatic residential upgrade.

## Actor input object example

```json
{
  "process": "gt",
  "keyword": [
    "microsoft365",
    "https://www.threads.com/@spotify/"
  ],
  "maximum": 25,
  "sort": "pinned",
  "includeraw": "no",
  "pause": 0,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "keyword": [
        "microsoft365",
        "https://www.threads.com/@spotify/"
    ],
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("canadesk/threads").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 = {
    "keyword": [
        "microsoft365",
        "https://www.threads.com/@spotify/",
    ],
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("canadesk/threads").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 '{
  "keyword": [
    "microsoft365",
    "https://www.threads.com/@spotify/"
  ],
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call canadesk/threads --silent --output-dataset

```

## MCP server setup

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

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/NzdcBhNkm63221iqF/builds/XOUNcLg6eTCEQhuqb/openapi.json
