# Truth Social Scraper - Posts & Profiles, No Login (`cliqtomedia/truth-social-scraper`) Actor

Scrape public Truth Social posts and profiles by username with no login. Text, media, link cards, quotes, ReTruths, reply/like counts and follower counts as clean JSON. Date filter, up to 100 accounts per run.

- **URL**: https://apify.com/cliqtomedia/truth-social-scraper.md
- **Developed by:** [Cliqto Media](https://apify.com/cliqtomedia) (community)
- **Categories:** Social media, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.25 / 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

Scrape public Truth Social posts and profiles by username with no login, and get clean JSON rows with post text, media, link cards, quotes, ReTruths, reply/ReTruth/like counts and the author's follower count.

Use it for media monitoring, political and market research, archives or AI pipelines: the smallest run is one username, such as `realDonaldTrump`, which returns the latest 20 posts in a few seconds for about $0.03 on the Free plan.

![Truth Social Scraper: usernames, profile URLs and a date filter in; full post data and clean rows out. No login.](https://api.apify.com/v2/key-value-stores/q3EqaNaAiGmO3zLXu/records/hero.png)

### Table of contents

- [What it does](#what-it-does)
- [Quick start](#quick-start)
- [Input](#input)
- [Output](#output)
- [Pricing](#pricing)
- [Use cases](#use-cases)
- [Scheduling and monitoring](#scheduling-and-monitoring)
- [Switching from another Truth Social scraper](#switching-from-another-truth-social-scraper)
- [API, export and integrations](#api-export-and-integrations)
- [Limits and partial results](#limits-and-partial-results)
- [Troubleshooting](#troubleshooting)
- [FAQ](#faq)
- [Learn more](#learn-more)
- [Related Actors](#related-actors)
- [Support](#support)

### What it does

The Actor reads the public Truth Social web API, the same one the website uses for logged-out visitors. For each username you give, it finds the account and saves either its latest posts (newest first) or one profile row. It works on many accounts in one run, stops at a date you choose, and tells you clearly when an account does not exist, is private or is not a valid username.

#### Good fit

- Follow what a list of public accounts posted today or in the last week.
- Build a dataset of posts with text, media links and engagement counts.
- Get follower counts, bios and join dates of many accounts at once.
- Feed fresh posts to an AI agent, a spreadsheet or a news alert flow.

#### Not a fit / limits

- No search, trends, groups, comments by other people, followers lists or DMs: only posts and profiles of the usernames you give.
- Only public accounts. Private (locked) accounts are reported as `private` with no posts.
- Truth Social allows only a few requests per minute, and the Actor respects that limit. It saves about 60–100 posts per minute, so 1,000 posts take about 14 minutes.
- At most 100 usernames per run and 2,000 posts per account. 100 accounts with 20 posts each take about 40 minutes.

### Quick start

1. Open the **Input** tab.
2. Add one or more usernames to **Usernames or profile URLs** (`handles`), for example `realDonaldTrump`.
3. Keep **Max posts per account** (`maxPostsPerUser`) at 20, or set a higher number.
4. Click **Start**.
5. Open the **Output** tab: the **Posts** view shows date, author, text, link and counts.

Expected result: 20 posts per account, newest first, in a few seconds for one account.

### Input

#### Input fields

| Field | Plain name | Type | Required | Default / prefill | Allowed values | Effect | Example | Recommendation |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `handles` | Usernames or profile URLs | array of strings | yes | prefill `["realDonaldTrump"]` | 1–100 items: `name`, `@name` or `https://truthsocial.com/@name` | which accounts to read | `["WhiteHouse", "@TeamTrump"]` | Repeats are skipped; invalid items are reported and the rest still run. |
| `mode` | What to scrape | string | no | `posts` | `posts`, `profiles` | posts of each account, or one profile row per account | `"profiles"` | Use `profiles` for follower counts and bios only. |
| `maxPostsPerUser` | Max posts per account | integer | no | default 20, prefill 20 | 1–2000 | how many of the newest posts per account | `200` | Keep it small for frequent runs; each 20 posts is one request. |
| `since` | Only posts since | string | no | empty (no date limit) | date `2026-10-01`, date-time `2026-10-01T12:00:00Z`, or `12 hours`, `7 days`, `2 weeks` | skips older posts and stops reading the account there | `"7 days"` | Best way to keep monitoring runs short. |
| `includeReplies` | Include replies | boolean | no | `false` | true / false | adds the account's replies to other posts | `true` | Leave off for original posts only. |
| `includeReblogs` | Include ReTruths | boolean | no | `true` | true / false | adds ReTruths (reposts of other people's posts) | `false` | Turn off for the account's own posts only. |

An empty `handles` list or a list with no valid username stops the run with an `Invalid input` message and no charge.

#### Interacting settings

| When | Input A | Input B | Effective behavior | Example | Cost/result effect |
| --- | --- | --- | --- | --- | --- |
| Both set | `maxPostsPerUser` | `since` | reading stops at whichever comes first | 200 and `"1 day"` | fewer posts and requests |
| Posts mode only | `mode: "profiles"` | `maxPostsPerUser`, `since`, `include*` | post settings are ignored | profiles of 10 accounts | one row per account |
| Pinned posts | `since` | — | a pinned post older than `since` is skipped, newer posts are still read | — | none |

#### Input examples

##### Latest posts of one account

```json
{
  "handles": ["realDonaldTrump"],
  "maxPostsPerUser": 20
}
```

Expected behavior: one account lookup and one page of posts.
Expected output: 20 posts with `createdAt`, `text`, `url`, `media`, `favouritesCount`.
Limit or cost note: a few seconds, about $0.03.

##### Last 7 days of several accounts, with replies

```json
{
  "handles": ["WhiteHouse", "TeamTrump", "DonaldJTrumpJr"],
  "since": "7 days",
  "maxPostsPerUser": 100,
  "includeReplies": true
}
```

Expected behavior: posts newer than 7 days, at most 100 per account.
Expected output: post rows; each account's status is in `RUN_SUMMARY`.
Limit or cost note: one request per 20 posts, about 5 requests per minute.

##### Profiles

```json
{
  "mode": "profiles",
  "handles": ["realDonaldTrump", "WhiteHouse", "TeamTrump"]
}
```

Expected output: one profile row per account with `followersCount`, `postsCount`, `bio`, `createdAt`.

### Output

Results go to the default **Dataset**, with two views: **Posts** and **Profiles**. A run summary is saved as `RUN_SUMMARY` in the key-value store, and the **Output** tab links all three.

#### Output example

```json
{
  "type": "post",
  "id": "117435353994630003",
  "url": "https://truthsocial.com/@realDonaldTrump/117435353994630003",
  "inputHandle": "realDonaldTrump",
  "account": {
    "id": "107780257626128497",
    "username": "realDonaldTrump",
    "displayName": "Donald J. Trump",
    "url": "https://truthsocial.com/@realDonaldTrump",
    "followersCount": 13111621,
    "followingCount": 69,
    "postsCount": 37168,
    "verified": true,
    "avatarUrl": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg"
  },
  "createdAt": "2026-10-13T19:54:55.085Z",
  "editedAt": null,
  "text": "Don’t ever mess with nature! President DJT",
  "contentHtml": "<p>Don’t ever mess with nature! President DJT</p>",
  "language": "en",
  "repliesCount": 791,
  "reblogsCount": 1825,
  "favouritesCount": 7100,
  "isReply": false,
  "inReplyToId": null,
  "inReplyToAccountId": null,
  "isReblog": false,
  "reblog": null,
  "isQuote": false,
  "quoteId": null,
  "quote": null,
  "sensitive": false,
  "spoilerText": null,
  "visibility": "public",
  "pinned": false,
  "mentions": [],
  "hashtags": [],
  "media": [
    {
      "id": "117435345857080951",
      "type": "video",
      "url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/117/435/345/857/080/951/original/98bf6e8266e6ae0a.mp4",
      "previewUrl": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/thumbnails/117/435/345/857/080/951/original/72433ae574eb1d6c.jpg",
      "width": 1078,
      "height": 1148,
      "durationSecs": 41.563719,
      "description": null
    }
  ],
  "card": null,
  "poll": null,
  "source": "truthsocial.com",
  "fetchedAt": "2026-10-14T03:59:02Z"
}
```

This is one full post row from the first input example. `null` means Truth Social has no value for this post (no edit, no quote, no link card).

#### Post fields

| Field | Meaning | Type | Can be empty? | Example / enum | Source / notes |
| --- | --- | --- | --- | --- | --- |
| `type` | row type | string | no | `post` | |
| `id` | post ID | string | no | `117435353994630003` | stable, use it to remove duplicates |
| `url` | link to the post | string | no | `https://truthsocial.com/@realDonaldTrump/117435353994630003` | |
| `inputHandle` | the username you gave | string | no | `realDonaldTrump` | |
| `account` | author: `id`, `username`, `displayName`, `url`, `followersCount`, `followingCount`, `postsCount`, `verified`, `avatarUrl` | object | no | see example | counts at fetch time |
| `createdAt` | when it was posted (UTC) | string | no | `2026-10-13T19:54:55.085Z` | ISO 8601 |
| `editedAt` | when it was last edited | string | yes | `null` | null if never edited |
| `text` | plain text of the post | string | can be `""` | `Don't ever mess with nature!` | HTML removed, paragraphs kept; `""` for media-only posts |
| `contentHtml` | original post HTML | string | can be `""` | `<p>…</p>` | |
| `language` | language code | string | yes | `en` | set by Truth Social |
| `repliesCount`, `reblogsCount`, `favouritesCount` | replies, ReTruths, likes | integer | no | `791`, `1825`, `7100` | at fetch time |
| `isReply`, `inReplyToId`, `inReplyToAccountId` | reply details | boolean, string | IDs null if not a reply | `false` | |
| `isReblog`, `reblog` | ReTruth flag and the original post (id, url, createdAt, text, account, counts, media) | boolean, object | `reblog` null if not a ReTruth | | |
| `isQuote`, `quoteId`, `quote` | quoted post | boolean, string, object | null if no quote | | |
| `sensitive`, `spoilerText` | content warning | boolean, string | `spoilerText` null | `false` | |
| `visibility` | post visibility | string | no | `public` | |
| `pinned` | pinned on the profile | boolean | no | `false` | |
| `mentions` | mentioned accounts (`id`, `username`, `url`) | array | can be `[]` | | |
| `hashtags` | hashtags without `#` | array | can be `[]` | `["news"]` | |
| `media` | images and videos: `id`, `type`, `url`, `previewUrl`, `width`, `height`, `durationSecs`, `description` | array | can be `[]` | `type`: `image`, `video`, `gifv` | direct file URLs |
| `card` | link preview: `url`, `title`, `description`, `type`, `providerName`, `imageUrl` | object | yes | | null if the post has no link card |
| `poll` | poll options and votes | object | yes | | null if no poll |
| `source` | data source | string | no | `truthsocial.com` | |
| `fetchedAt` | when the run read it (UTC) | string | no | `2026-10-14T03:59:02Z` | |

#### Profile fields

`type` (`profile`), `id`, `username`, `url`, `inputHandle`, `displayName`, `bio` (plain text), `website`, `location`, `followersCount`, `followingCount`, `postsCount`, `verified`, `bot`, `locked`, `createdAt` (join date), `lastPostAt` (date only, as Truth Social gives it), `avatarUrl`, `headerUrl`, `fields` (profile links: `name`, `value`), `source`, `fetchedAt`. `website`, `location` and `lastPostAt` can be null.

#### Run summary (`RUN_SUMMARY`)

| Field | Meaning |
| --- | --- |
| `status` | `COMPLETE`, `PARTIAL` (stopped early, rows kept), `ERROR` (source failed, nothing saved) or `INVALID_INPUT` |
| `reason` | why it stopped early: `CHARGE_LIMIT`, `TIME_LIMIT`, `SOURCE_ERROR`, `ABORTED`, or null |
| `message` | the same text as the run status message |
| `handles[]` | one entry per input (invalid usernames first, then the rest in input order): `input`, `status` (`complete`, `partial`, `not_found`, `private`, `invalid`, `error`, `skipped`), `username`, `accountId`, `saved`, `newestPostAt`, `oldestPostAt`, `message` |
| `postsSaved`, `profilesSaved`, `accountsChecked`, `statusCounts` | counts |
| `settings`, `http` | the settings used and request counters |

#### Output entities and surfaces

| Situation | Where | Result shape | User action |
| --- | --- | --- | --- |
| Normal | Dataset (Posts / Profiles view) | post or profile rows | open, export or call the API |
| Account not found, private or invalid | `RUN_SUMMARY.handles[]` | `not_found`, `private`, `invalid` with a message | check the username |
| No posts in the period | `RUN_SUMMARY.handles[]` | `complete`, `saved: 0`, message `No posts in the selected period.` | widen `since` |
| Stopped early | Dataset + `RUN_SUMMARY` | rows kept, `PARTIAL` with `reason` | raise the limit or timeout |
| Truth Social not answering | `RUN_SUMMARY`, run `FAILED` | `ERROR` or `PARTIAL` with `SOURCE_ERROR` | try again later |

### Pricing

#### Pricing unit

You pay per event (Free plan prices; paid plans get lower post prices):

- **Post** — $0.0015 per saved post ($1.50 per 1,000). Bronze $0.0014, Silver $0.0013, Gold $0.00125.
- **Account checked** — $0.0025 per username that Truth Social answered about: found, not found or private. In profiles mode this is the price of the profile row.

Invalid usernames and skipped accounts are not charged, and neither is an account whose lookup failed because Truth Social did not answer. An account that was found is charged once even if reading its posts fails later. There is no start or finish fee. Platform usage is included.

#### Cost examples (Free plan prices)

| Scenario | Input scope | Events | Charge | Time |
| --- | --- | ---: | ---: | --- |
| One account, latest posts | 1 username, 20 posts | 1 account + 20 posts | $0.0325 | a few seconds |
| Weekly check of 5 accounts | 5 usernames, `since: "7 days"`, ~150 posts | 5 + 150 | about $0.24 | about 2 minutes |
| Deep history | 1 username, 1,000 posts | 1 + 1,000 | $1.5025 | about 14 minutes |
| Profiles | 10 usernames | 10 accounts | $0.025 | about 1–2 minutes |
| Nothing new | 5 usernames, no posts in the period | 5 accounts | $0.0125 | under a minute |
| Wrong usernames | 3 not found | 3 accounts | $0.0075 | under a minute |

### Use cases

| Buyer job | Input path | Output entity | Key fields | Next integration |
| --- | --- | --- | --- | --- |
| Daily monitoring of a few accounts | `handles` + `since: "1 day"` | post | `createdAt`, `text`, `url`, `media` | Schedule + webhook, Google Sheets |
| Engagement research | `handles` + `maxPostsPerUser` | post | `favouritesCount`, `reblogsCount`, `repliesCount` | CSV / Excel export |
| Account directory | `mode: "profiles"` | profile | `followersCount`, `postsCount`, `bio`, `createdAt` | API, spreadsheet |
| AI agent context | `handles` (small) | post | `text`, `createdAt`, `url` | MCP |

### Scheduling and monitoring

Create a schedule (for example every hour) with `since: "1 day"` and a small `maxPostsPerUser`. Each run returns only recent posts; use `id` to remove posts you already have. An account with nothing new costs only the account check ($0.0025). If an account's last post is from a day before `since`, the Actor skips its timeline and makes only one request. Add a webhook or an integration to send new rows to Slack, a sheet or your own API when the run finishes.

### Switching from another Truth Social scraper

Many Truth Social scrapers return the raw Mastodon-style JSON (`created_at`, `favourites_count`, `media_attachments`). This Actor returns the same data in camelCase with a few clean-ups:

| Raw field | This Actor |
| --- | --- |
| `content` (HTML) | `text` (plain) and `contentHtml` |
| `created_at`, `replies_count`, `reblogs_count`, `favourites_count` | `createdAt`, `repliesCount`, `reblogsCount`, `favouritesCount` |
| `media_attachments[]` | `media[]` with `url`, `previewUrl`, `durationSecs` |
| `account{...}` (40+ fields) | `account{}` with 9 useful fields |
| `tags[]`, `mentions[]` | `hashtags[]` (names), `mentions[]` |
| `in_reply_to_id`, `reblog`, `quote_id` | `isReply` / `inReplyToId`, `isReblog` / `reblog`, `isQuote` / `quoteId` / `quote` |

Fields only useful to a logged-in user (`favourited`, `bookmarked`, `muted`, `emojis` and similar) are not included. One run can read up to 100 accounts.

### API, export and integrations

- **API:** start the run with `POST https://api.apify.com/v2/acts/cliqtomedia~truth-social-scraper/runs` and the input JSON; read rows from the run's Dataset (`?view=posts` or `?view=profiles`).
- **Export:** JSON, CSV, Excel, XML or RSS from the Dataset.
- **Webhooks / no-code:** Apify integrations (Make, Zapier, Google Sheets, Slack) can send new rows when a run finishes.

#### Use with AI agents (MCP)

- MCP server with only this Actor: `https://mcp.apify.com?tools=cliqtomedia/truth-social-scraper`.
- Smallest useful input: `{"handles": ["realDonaldTrump"], "maxPostsPerUser": 20}`.
- Key fields: `text` (what was posted), `createdAt` (when), `url` (link to cite), `account.username` (who), `favouritesCount` (engagement).
- One account with 20 posts takes a few seconds and costs about $0.03. Larger requests are slow: about 5 requests (up to 100 posts) per minute.

### Limits and partial results

#### Spending limit

If you set a maximum cost per run, the Actor stops before it goes over it: rows already saved stay in the Dataset, the run ends as `SUCCEEDED` with `PARTIAL` / `CHARGE_LIMIT` in `RUN_SUMMARY`, and the rest of the accounts are `skipped`.

#### Limits

- Up to 100 usernames per run, up to 2,000 posts per account (20 posts per request). 100 usernames with 20 posts each take about 40 minutes, within the default 1-hour timeout.
- About 5 requests per minute, as Truth Social allows; the Actor waits when Truth Social asks it to slow down.
- The default run timeout is 1 hour, enough for about 3,000–4,000 posts. If the timeout comes first, saved rows stay and the run is `PARTIAL` / `TIME_LIMIT`.

### Troubleshooting

#### The run takes long

Symptom: the run log shows `Rate limited by truthsocial.com; waiting 60 s`.
Reason: Truth Social allows only a few requests per minute, and the Actor waits instead of going around the limit.
Action: lower `maxPostsPerUser` or use `since`; split large lists into scheduled runs.

#### An account returns no posts

Check the account's entry in `RUN_SUMMARY.handles`: `not_found` (wrong username), `private` (locked account), `invalid` (not a username), or `complete` with `No posts in the selected period.` (widen `since`).

#### The run ends as PARTIAL with skipped accounts

Read `reason`: `TIME_LIMIT` (raise the run timeout or lower `maxPostsPerUser`), `CHARGE_LIMIT` (raise the maximum cost) or `ABORTED`. Saved rows stay in the Dataset.

#### The run fails with SOURCE_ERROR

Truth Social did not answer several requests (two in a row, or three in the whole run). Rows saved before the error stay in the Dataset. Try again later.

### FAQ

#### Do I need a Truth Social account or cookies?

No. The Actor reads only public data that Truth Social shows to logged-out visitors.

#### Why can't it go faster?

Truth Social limits how often a visitor can ask for data. The Actor stays under that limit, about 5 requests (up to 100 posts) per minute, and waits when Truth Social asks.

#### Are the counts live?

Likes, ReTruths, replies and follower counts are as they were at `fetchedAt`. Run again to refresh them.

#### Is this data complete?

It is what the public API returns for the account's timeline, newest first, up to 2,000 posts. Deleted posts and posts of private accounts are not available.

#### Is scraping Truth Social allowed?

The Actor reads only public pages without login, at the rate Truth Social allows, and does not bypass any login or CAPTCHA. Truth Social's terms restrict automated collection and commercial use; you are responsible for how you collect, store and reuse the content, including personal data and authors' rights.

### Learn more

- [Truth Social](https://truthsocial.com/): the source.
- [Truth Social Terms of Service](https://truthsocial.com/terms-of-service).
- [Mastodon API: account statuses](https://docs.joinmastodon.org/methods/accounts/#statuses): the format Truth Social's public API follows.
- [Apify pay-per-event pricing](https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event).

### Related Actors

- [Bluesky Scraper](https://apify.com/cliqtomedia/bluesky-scraper) — the same kind of posts and profiles from Bluesky, also with no login.

### Support

Use the **Issues** tab of this Actor for bugs, questions and feature requests. Include the run ID, the input and the error text. Never post tokens, cookies or private data.

# Changelog

This Actor's version history is a separate document: https://apify.com/cliqtomedia/truth-social-scraper/changelog.md

# Actor input Schema

## `handles` (type: `array`):

Public Truth Social accounts: a username such as realDonaldTrump, @realDonaldTrump, or a profile URL such as https://truthsocial.com/@realDonaldTrump. Up to 100 per run; repeats are skipped.

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

posts: the latest posts of each account (each row also carries the author's follower count). profiles: one profile row per account (bio, followers, following, post count, verified, join date).

## `maxPostsPerUser` (type: `integer`):

Stop after this many posts per account (newest first). Posts mode only.

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

Only posts published at or after this time: a date (2026-10-01), a date-time in UTC (2026-10-01T12:00:00Z) or a relative period (12 hours, 7 days, 2 weeks). Empty = no date limit. Paging stops at the first older post, so a date limit also saves time and cost.

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

Also return the account's replies to other posts. Off: only top-level posts, ReTruths and quotes.

## `includeReblogs` (type: `boolean`):

Also return ReTruths (reposts of other accounts' posts); the original post is in the reblog field.

## Actor input object example

```json
{
  "handles": [
    "realDonaldTrump",
    "WhiteHouse"
  ],
  "mode": "posts",
  "maxPostsPerUser": 20,
  "since": "7 days",
  "includeReplies": false,
  "includeReblogs": true
}
```

# Actor output Schema

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

Posts as a table (posts mode).

## `profiles` (type: `string`):

Profiles as a table (profiles mode).

## `runSummary` (type: `string`):

Status, reason, per-account result (complete, partial, not_found, private, invalid, error) and counts.

# 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 = {
    "handles": [
        "realDonaldTrump"
    ],
    "maxPostsPerUser": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("cliqtomedia/truth-social-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 = {
    "handles": ["realDonaldTrump"],
    "maxPostsPerUser": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("cliqtomedia/truth-social-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 '{
  "handles": [
    "realDonaldTrump"
  ],
  "maxPostsPerUser": 20
}' |
apify call cliqtomedia/truth-social-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cliqtomedia/truth-social-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/2SxQxnqRfnyOuK8Kh/builds/hvoPdIJO1rlea3TJ4/openapi.json
