# Truth Social Scraper (`khadinakbar/truth-social-all-in-one-scraper`) Actor

Scrape Truth Social profiles, posts, replies, comments, search, hashtags and trending truths. The mode is detected automatically from your input.

- **URL**: https://apify.com/khadinakbar/truth-social-all-in-one-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Social media, News, MCP servers
- **Stats:** 7 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

### What is Truth Social Scraper?

Truth Social Scraper extracts public Truth Social posts ("truths"), profiles, comment threads, keyword and hashtag search results and trending truths, and returns them as clean dataset rows. Each post row has the post `id`, `url`, plain-text `content`, `createdAt`, language, author handle, display name, verification and follower count, reply, retruth and like counts, reply and retruth flags, media, mentions and hashtags. Political analysts, journalists, traders watching market-moving posts, OSINT researchers and AI agents use it to monitor public figures and topics, starting from a username, URL, post ID, `#hashtag` or the word `trending`.

### Best fit for this Actor

- **Designed for monitoring public voices.** Use it to track what prominent accounts post, archive statements as they appear, and measure engagement per post.
- **One input box, auto-detected.** `query` accepts a username, profile URL, post URL or 18-digit ID, a `#hashtag` or `trending`, and the Actor picks the mode.
- **Scheduled monitoring.** `sinceLastRun` returns only posts newer than the last run for each profile or hashtag, which suits hourly or daily schedules.
- **Batch jobs.** `startUrls` takes many profile, post and hashtag URLs in one run.
- **Cross-platform view.** When you want the same story from X, then use [X (Twitter) Tweet Scraper](https://apify.com/khadinakbar/x-tweet-scraper) with the same names or keywords and compare the two datasets.
- **Community reaction elsewhere.** For discussion threads on the same topic, continue with [Reddit Posts Scraper](https://apify.com/khadinakbar/reddit-posts-scraper).

### What people and AI agents ask this Actor to do

> Get the latest 50 truths from realDonaldTrump.
> Pull this post and its comment thread.
> Search Truth Social for posts about tariffs.
> Give me only new posts from these accounts since yesterday's run.

| Request | Input to send |
|---|---|
| Latest posts from a prominent account | `{"query": "realDonaldTrump", "maxResults": 50}` |
| Posts with media only | `{"query": "realDonaldTrump", "onlyMedia": true, "maxResults": 25}` |
| Profile card plus posts | `{"query": "realDonaldTrump", "includeProfileInfo": true}` |
| One post and its comments | `{"query": "https://truthsocial.com/@realDonaldTrump/117340294147897033", "includeComments": true, "maxComments": 100}` |
| Keyword search | `{"searchTerms": ["tariffs"], "searchType": "statuses", "maxResults": 200}` |
| New posts only on a schedule | `{"query": "realDonaldTrump", "sinceLastRun": true}` |

### Workflow example: a market-signal alert

A trading desk starts with `query` set to `realDonaldTrump`, `sinceLastRun` on and `maxResults` at 20, and schedules the run every 15 minutes. Each run returns only new truths with `content`, `createdAt` and engagement counts. The desk feeds `content` into a keyword filter for words like tariff, rate or sanction, then pushes matching rows to a chat alert with the post `url`. At the end of the week the analyst exports the dataset and compares `likesCount` and `retruthsCount` across topics.

### How to scrape Truth Social

1. Put a username, profile URL, post URL or ID, `#hashtag` or `trending` in **Query**. Use **Search terms** for keywords or **Start URLs** for a batch.
2. Set **Maximum results** to cap the number of rows.
3. Click **Start**, then export the dataset or read it through the API.

### Input

```json
{
  "query": "realDonaldTrump",
  "maxResults": 50,
  "includeReplies": false,
  "onlyMedia": false,
  "cleanContent": true,
  "sinceLastRun": false
}
```

| Field | Type | What it controls |
|---|---|---|
| `query` | string | Username, profile URL, post URL or ID, `#hashtag`, or `trending`. Default `realDonaldTrump`. |
| `searchTerms` | array | Keywords or hashtags to search. Runs with an access token. |
| `startUrls` | array | Many profile, post or hashtag URLs in one run, each auto-detected. |
| `mode` | string | `auto` by default; or force `profile`, `post`, `comments`, `search`, `hashtag`, `trending` or `profileMetadata`. |
| `maxResults` | integer | Total rows for the run. Default 50. |
| `includeReplies` | boolean | Add the account's reply posts in profile mode. Default `false`. |
| `onlyMedia` | boolean | Keep posts with images or video in profile and hashtag modes. Default `false`. |
| `includeComments` | boolean | Add a single post's comment thread. Default `false`. |
| `maxComments` | integer | Comments per post when the thread is on. Default 40. |
| `searchType` | string | `statuses`, `accounts` or `hashtags` for keyword search. Default `statuses`. |
| `includeProfileInfo` | boolean | Add one profile row (bio, counts, avatar) before the posts. Default `false`. |
| `cleanContent` | boolean | Plain-text `content`; set `false` to keep HTML in `contentHtml`. Default `true`. |
| `sinceLastRun` | boolean | Return only posts newer than the previous run, per target. Default `false`. |
| `accessToken`, `username`, `password` | string | Optional sign-in for comments, search, hashtag, trending and smaller profiles. Stored encrypted. |
| `proxyConfiguration` | object | Apify Proxy. Residential is preset and recommended. |

### Output

| Field | What it contains |
|---|---|
| `type` | Record kind, such as `post` |
| `id`, `url` | Post ID and public link |
| `content`, `language`, `createdAt` | Post text, language and publish time |
| `authorUsername`, `authorDisplayName`, `authorId` | Author identity |
| `authorVerified`, `authorFollowers` | Author verification and audience size |
| `repliesCount`, `retruthsCount`, `likesCount` | Engagement counts |
| `isReply`, `isRetruth` | Post type flags |
| `hasMedia`, `mediaCount`, `media` | Attached images or video |
| `mentions`, `hashtags` | Structured mentions and tags |
| `sourceUrl`, `scrapedAt` | The input that produced the row, and collection time |

```json
{
  "type": "post",
  "id": "117340294147897033",
  "url": "https://truthsocial.com/@realDonaldTrump/117340294147897033",
  "content": "We have the BEST FINANCIAL NUMBERS EVER, and the FAKE NEWS MEDIA refuses to report them!!! President DJT",
  "createdAt": "2026-09-27T00:59:56.934Z",
  "language": "en",
  "authorUsername": "realDonaldTrump",
  "authorDisplayName": "Donald J. Trump",
  "authorId": "107780257626128497",
  "authorVerified": true,
  "authorFollowers": 13080832,
  "repliesCount": 1609,
  "retruthsCount": 2795,
  "likesCount": 10061,
  "isReply": false,
  "isRetruth": false,
  "hasMedia": false,
  "mediaCount": 0,
  "media": [],
  "mentions": [],
  "hashtags": [],
  "scrapedAt": "2026-09-27T06:48:13.844Z",
  "sourceUrl": "realDonaldTrump"
}
```

Comment rows follow the same post shape, and profile rows from `includeProfileInfo` or `profileMetadata` carry the account's bio and counts.

### Public and signed-in modes

Public mode covers the profiles, posts and profile metadata of prominent accounts such as `realDonaldTrump`, with no credentials. Comment threads, keyword search, hashtag timelines, trending truths and smaller profiles run when you add an access token from your own Truth Social session, or a username and password that the Actor exchanges for a token at runtime. Credentials stay encrypted in the input and are kept out of logs and output.

### Pricing

This Actor uses Pay per event plus Apify platform usage. Two events apply: **Actor Start** once per run, and **Result** once per row written to the dataset, whether that row is a post, comment, profile or hashtag. For example, one post with its first 100 comments creates 101 Result events and one Actor Start event, plus the platform usage for the run. `maxResults` sets the ceiling on Result events. The live Pricing tab on this page shows the current event prices.

### API example

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~truth-social-all-in-one-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query": "realDonaldTrump", "maxResults": 20}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("khadinakbar/truth-social-all-in-one-scraper").call(run_input={
    "query": "realDonaldTrump",
    "maxResults": 20,
    "sinceLastRun": True,
})
for post in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(post["createdAt"], post["likesCount"], post["content"][:80])
```

### Use with AI agents through Apify MCP

Connect this Actor to Claude, ChatGPT, Cursor or any MCP client through [Apify MCP](https://mcp.apify.com), then ask:

> Get the latest 20 truths from realDonaldTrump. Summarize the main topics, list the three posts with the most likes with their URLs and times, and tell me how many rows came back.

Agent checklist:

1. Put the account, URL, hashtag or `trending` in `query`, and set `maxResults` as the cost ceiling.
2. Use public mode for prominent accounts; add an access token for comments, search, hashtags or trending.
3. Read rows with `get-dataset-items` and cite each post's `url` and `createdAt`.
4. Turn on `sinceLastRun` for scheduled monitoring so each run returns only fresh posts.

### Best results

| Starting situation | Helpful action | Expected outcome |
|---|---|---|
| Monitoring a public figure | Schedule with `sinceLastRun` on | Only new posts each run |
| Visual content research | Set `onlyMedia` to `true` | Posts with images or video |
| Text for NLP or an LLM | Keep `cleanContent` at `true` | Plain text in `content` |
| Full conversation context | Set `includeReplies` to `true` | The account's replies as well as top-level posts |
| Many accounts at once | List profile URLs in `startUrls` | One dataset across all targets |
| Discussion around one post | Use the post URL with `includeComments` | The post plus its comment rows |

### Builder's note

I built this around one auto-detecting input, because people arrive with a name, a link or a hashtag and should not have to pick a mode first. I found that most demand is for monitoring prominent accounts, so public mode covers that job with no credentials, and the incremental flag keeps scheduled runs lean. My goal was one row shape for posts and comments, so the same downstream sheet or agent prompt works for every mode.

### FAQ

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

No for prominent accounts' posts and profiles. An access token unlocks comments, search, hashtags, trending and smaller profiles.

#### Can I get only new posts?

Yes. Set `sinceLastRun` to `true` and schedule the Actor; each target remembers its newest post.

#### How do I keep HTML formatting?

Set `cleanContent` to `false`, and the original markup appears in `contentHtml`.

#### Which proxy should I use?

Keep the preset Residential proxy for steady access.

### Responsible use

This Actor collects publicly available Truth Social content for research, journalism, market analysis and monitoring. Use it in line with Truth Social's terms and applicable laws, including data-protection and copyright law, and use credentials only for accounts you are authorized to use. Truth Social is a trademark of its owner, and this independent Actor is not affiliated with or endorsed by Truth Social or Trump Media & Technology Group.

# Changelog

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

# Actor input Schema

## `query` (type: `string`):

The main input, auto-detected. Accepts a username ('realDonaldTrump' or '@realDonaldTrump'), a profile URL ('https://truthsocial.com/@realDonaldTrump'), a post URL or 18-digit post ID, a '#hashtag', or the word 'trending'. Defaults to 'realDonaldTrump'. NOT for keyword search — use the Search Terms field for that. Ignored when Start URLs or Search Terms are provided.

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

Keywords or hashtags to search Truth Social for (e.g. 'tariffs', '#MAGA'). Each term runs a search and returns matching posts, accounts, or hashtags depending on Search Type. Requires authentication (Access Token or username/password) — Truth Social gates search behind login. This is keyword search, NOT a username lookup.

## `startUrls` (type: `array`):

A batch of Truth Social URLs to scrape — profile URLs, post URLs, or hashtag URLs (https://truthsocial.com/tags/MAGA). Each URL's mode is auto-detected. Use this for bulk runs across many profiles or posts. Takes priority over Query when both are set.

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

Force a specific scrape mode instead of auto-detecting from the input. 'auto' (default) infers the mode from Query/Start URLs. In public mode only profile, post, and profileMetadata work; comments, search, hashtag, and trending need an Access Token. 'profileMetadata' returns just bio + follower counts without posts.

## `maxResults` (type: `integer`):

The total maximum number of records (posts, profiles, comments, etc.) to return across the whole run. Controls cost: each result is billed once. Set higher for full timelines, lower for a quick sample. Minimum 1.

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

In profile mode, include the user's reply posts in addition to their main posts. When false (default), only top-level posts are returned. Has no effect in other modes.

## `onlyMedia` (type: `boolean`):

In profile/hashtag mode, return only posts that contain media (images or video). When false (default), all posts are returned. Useful for collecting visual content only.

## `includeComments` (type: `boolean`):

When scraping a single post, also fetch its full comment/reply thread. Each comment counts as one result toward Maximum Results. When false (default), only the post itself is returned. Equivalent to selecting the 'comments' mode.

## `maxComments` (type: `integer`):

Cap on the number of comments fetched per post when Include Comment Thread is on. Defaults to 40. Counts toward the overall Maximum Results limit.

## `searchType` (type: `string`):

What kind of results keyword search returns: 'statuses' (posts, default), 'accounts' (user profiles), or 'hashtags' (tag suggestions). Only applies when Search Terms are used.

## `includeProfileInfo` (type: `boolean`):

In profile mode, emit one profile-metadata record (bio, follower counts, avatar) before the posts. When false (default), only posts are returned. The profile record counts as one result.

## `cleanContent` (type: `boolean`):

Strip HTML tags from post content and return readable plain text (default). When false, the original HTML markup is preserved in the 'contentHtml' field. Mentions and hashtags are always also returned as structured arrays.

## `sinceLastRun` (type: `boolean`):

Incremental mode: for profile/hashtag scrapes, return only posts newer than the most recent post seen on the previous run (tracked per target in the key-value store). Ideal for scheduled monitoring. When false (default), a normal full scrape runs.

## `accessToken` (type: `string`):

Optional OAuth bearer token from a logged-in Truth Social web session. Truth Social now requires authentication to view non-prominent profiles; supply a token to unlock them. Leave empty for public mode (prominent accounts like realDonaldTrump work without it). Stored encrypted and never logged.

## `username` (type: `string`):

Optional Truth Social account username for password login, used to auto-fetch an access token when no Access Token is given. Pair with Password. Leave empty for public mode. Use a throwaway/research account, not a primary one.

## `password` (type: `string`):

Password for the Truth Social Username above, used only to obtain an OAuth token at runtime. Stored encrypted and never logged. Leave empty for public mode.

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

Proxy settings. RESIDENTIAL Apify Proxy is strongly recommended and on by default — Truth Social is behind Cloudflare and blocks datacenter IPs. Leave the default unless you have a specific reason to change it.

## Actor input object example

```json
{
  "query": "realDonaldTrump",
  "searchTerms": [
    "tariffs"
  ],
  "startUrls": [],
  "mode": "auto",
  "maxResults": 50,
  "includeReplies": false,
  "onlyMedia": false,
  "includeComments": false,
  "maxComments": 40,
  "searchType": "statuses",
  "includeProfileInfo": false,
  "cleanContent": true,
  "sinceLastRun": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped Truth Social records as structured JSON.

# 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 = {
    "query": "realDonaldTrump",
    "searchTerms": [
        "tariffs"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/truth-social-all-in-one-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 = {
    "query": "realDonaldTrump",
    "searchTerms": ["tariffs"],
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/truth-social-all-in-one-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 '{
  "query": "realDonaldTrump",
  "searchTerms": [
    "tariffs"
  ]
}' |
apify call khadinakbar/truth-social-all-in-one-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/truth-social-all-in-one-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/OnFmvaVe9Muy1pkvL/builds/8LSxLeHZSoh0ja0PN/openapi.json
