# Truth Social Scraper (Cheap) (`data_api/truth-social-scraper-cheap`) Actor

The Truth Social scraper is a no-code data extraction tool for truthsocial.com. Point it at any public Truth Social profile and it returns clean, structured JSON: posts, replies, retruths, media attachments, follower counts, and per-post engagement numbers

- **URL**: https://apify.com/data\_api/truth-social-scraper-cheap.md
- **Developed by:** [Data API](https://apify.com/data_api) (community)
- **Categories:** Social media, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

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

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

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

# README

## Truth Social Posts Scraper

Copying posts off Truth Social by hand gets old fast, and the timeline loads through an API that trips up most generic scrapers. This tool handles that part for you. Give it a handle and it returns the account's posts as clean rows: the text, when it was posted, the like, retruth, and reply counts, a direct link, and who wrote it. Run it on a single account or a long list, then export to a spreadsheet or straight into your database.

![Truth Social Posts Scraper](cover.jpg)

### What you get

Every post comes back as one tidy row with the same shape each time, so your columns line up when you load the results into a sheet or database. Each row carries:

- **Post content** — `postText` (clean plain text) and `htmlBody` (the original markup, which you can drop if you don't need it)
- **Engagement** — `likeCount`, `retruthCount`, and `replyCount`
- **Post details** — `statusId`, `publishedAt`, and `postLink`
- **Author** — `accountHandle` and `accountName`

### Quick start

1. Click **Try for free** and open the input form.
2. Type one or more Truth Social handles into **Account handles** (with or without the leading @).
3. Set **Posts per account** and flip on any filters you want — media only, drop replies, pinned only, and so on.
4. Press **Start**, then export the results as JSON, CSV, Excel, or XML once it finishes.

![How it works](how-it-works.jpg)

### Use cases

- **Media monitoring** — keep tabs on what a public figure or brand is posting without checking the app all day
- **Political and social research** — build a clean dataset of public statements with timestamps and engagement numbers
- **Journalism and fact-checking** — capture exact post text and IDs so you have a record even if a post is later removed
- **Engagement analysis** — compare likes, retruths, and replies across posts to see what lands with an audience
- **Archiving** — back up an account's public posts and pick up later from a saved post ID

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `accounts` | array of strings | Yes | Truth Social handles to collect posts for; the leading @ is optional. Each handle is processed on its own. |
| `postsPerAccount` | integer | No | Upper limit on posts pulled per handle. Default `30`; raise it for deep backfills. |
| `mediaOnly` | boolean | No | Keep only posts with an image, video, or GIF attachment. Default `false`. |
| `repliesOnly` | boolean | No | Keep only posts that reply to another post. Default `false`. |
| `skipReplies` | boolean | No | Leave replies out of the results. Default `true`. |
| `skipRetruths` | boolean | No | Leave retruths (reshared posts) out of the results. Default `false`. |
| `pinnedOnly` | boolean | No | Grab only the handle's pinned posts. Default `false`. |
| `dropHtml` | boolean | No | Discard the raw HTML body and keep only plain text. Default `false`. |
| `resumeFromId` | string | No | Begin collecting from this post ID onward, useful for resuming an earlier run. |

#### Example input

```json
{
    "accounts": ["mariabartiromo"],
    "postsPerAccount": 30,
    "mediaOnly": false,
    "repliesOnly": false,
    "skipReplies": true,
    "skipRetruths": false,
    "pinnedOnly": false,
    "dropHtml": false,
    "resumeFromId": ""
}
```

### Output

Each post becomes one row in the dataset, and the fields keep the same names and types on every run, so your output stays predictable.

#### Example output

```json
{
    "statusId": "116636418903333996",
    "publishedAt": "2026-05-25T17:35:13.050Z",
    "htmlBody": "<p>Big news coming this week. Stay tuned!</p>",
    "postText": "Big news coming this week. Stay tuned!",
    "retruthCount": 2464,
    "likeCount": 8283,
    "replyCount": 1024,
    "postLink": "https://truthsocial.com/@mariabartiromo/116636418903333996",
    "accountHandle": "mariabartiromo",
    "accountName": "Maria Bartiromo"
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `statusId` | string | Unique identifier of the post |
| `publishedAt` | string | Timestamp showing when the post went live |
| `htmlBody` | string | Original post body with its HTML markup intact |
| `postText` | string | Plain-text version of the post with markup stripped out |
| `retruthCount` | integer | How many times the post was retruthed (reshared) |
| `likeCount` | integer | How many likes (favourites) the post received |
| `replyCount` | integer | How many replies the post drew |
| `postLink` | string | Canonical web address of the post |
| `accountHandle` | string | Handle of the account that authored the post |
| `accountName` | string | Display name shown for the author |

### Tips for best results

- **Start small.** Run a single handle with `postsPerAccount` set low before you queue up a big batch, so you can confirm the output matches your pipeline.
- **Pick one reply filter.** `skipReplies` and `repliesOnly` pull in opposite directions, so set the one that matches what you actually want and leave the other off.
- **Skip the HTML if you don't need it.** Turn on `dropHtml` to keep only `postText` when you're loading into a database and don't want to escape markup.
- **Resume long collections.** Save the last `statusId` you saw and pass it to `resumeFromId` next time so you only fetch newer posts.
- **Backfill in stages.** For accounts with a long history, raise `postsPerAccount` gradually rather than asking for everything in one run.

### How can I use Truth Social post data?

**How can I use the Truth Social Posts Scraper to monitor an account?**
Add the handles you care about to `accounts`, set a modest `postsPerAccount`, and run it on a schedule. Each run returns the latest posts with text, publish time, and engagement counts, so you have a running log of what an account is saying without opening the app.

**How can I export Truth Social posts to a spreadsheet?**
Run the scraper, then use the export button to download JSON, CSV, or Excel. Every post is one row with the same fields — `postText`, `likeCount`, `retruthCount`, `replyCount`, `publishedAt`, and the rest — so it drops straight into a sheet or BI tool.

**How can I track engagement on Truth Social posts?**
The output includes `likeCount`, `retruthCount`, and `replyCount` for each post. Pull a batch of recent posts and sort or chart by those columns to see which content gets the most reach, and use `postLink` to jump back to any post.

**How can I archive Truth Social posts for research?**
Collect the posts you need, save each `statusId`, and pass the most recent one to `resumeFromId` on the next run. That way you keep a clean, growing archive of public posts with timestamps and links, without re-fetching what you already have.

### Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. 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.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Support

Questions, feature requests, or a field you'd like added? Reach out at <data.apify@proton.me> and we'll get back to you.

# Actor input Schema

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

List of Truth Social usernames to scrape (e.g. realDonaldTrump).

## `maxItemsPerProfile` (type: `integer`):

Maximum number of posts (statuses) to extract per profile.

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

If true, only fetch posts that contain media attachments.

## `onlyReplies` (type: `boolean`):

If true, only fetch posts that are replies to other posts.

## `excludeReplies` (type: `boolean`):

If true, exclude replies from the fetched posts.

## `excludeReblogs` (type: `boolean`):

If true, exclude retruths (shares) from the fetched posts.

## `pinned` (type: `boolean`):

If true, only fetch pinned posts.

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

If true, the raw HTML 'content' field will be removed from output, keeping only the plain 'contentText'.

## `startPostId` (type: `string`):

An optional Post ID to start scraping from (acts as initial max\_id). Useful for resuming past runs.

## Actor input object example

```json
{
  "profiles": [
    "realDonaldTrump"
  ],
  "maxItemsPerProfile": 20,
  "onlyMedia": false,
  "onlyReplies": false,
  "excludeReplies": true,
  "excludeReblogs": false,
  "pinned": false,
  "cleanContent": false
}
```

# 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": [
        "realDonaldTrump"
    ],
    "startPostId": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_api/truth-social-scraper-cheap").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": ["realDonaldTrump"],
    "startPostId": "",
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,data_api/truth-social-scraper-cheap"
        }
    }
}

```

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/9na2Nk46aYpfp9U0U/builds/NEgdRN9LYKuZwdWW9/openapi.json
