# Truth Social Alerts: AI Market Signals from Trump Truth Posts (`rich_minds/truth-social-alerts-ai`) Actor

First 25 posts free. Truth social alerts: Trump posts naming your tariffs, Fed, tickers or countries — pay per qualified post, junk never charged by us. Tagged with a headline, via a Truth Social scraper. Free demo on any plan; live search runs on your Apify account, any plan that runs Store Actors.

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

## Pricing

from $4.00 / 1,000 qualified post (rules only)s

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

## Truth Social Alerts: AI Market Signals from Trump Truth Posts

**Every new Trump post that names your tariffs, Fed or tickers — tagged, in your channel.**

⚡ First **25 posts free** · 💵 **≈ $0.03 per alert all in**, the source read on your account included — $0.004 of it is ours · 🤖 AI ≈ **$0.038** per post all in · ⏱️ demo in seconds

![Truth Social alerts ranked by market relevance — summary, topic, relevance and score, one row per new post](https://api.apify.com/v2/key-value-stores/hKoeXBwCEGNomx81O/records/shortlist.svg)

> **Try it in 30 seconds.** Click **Try it** — the form is pre-filled with 6 sample posts and a tariff / Fed / $NVDA
> watch list; 3 qualify, nothing charged. Type accounts or pick a **preset** to read them live; 25 posts free.
> → [What a run costs](#-pricing--what-a-run-really-costs) · [What the AI adds](#-what-the-ai-tier-adds) · [Run it on a schedule](#-run-it-on-a-schedule)

### ⚡ At a glance

| | |
|---|---|
| **What you get** | New posts that name your keywords, tickers, countries or topics — topic, market relevance 0–100, entities, a headline |
| **You provide** | The accounts to watch (or a preset — five administration accounts in one run) and your watch list |
| **Output** | a ranked sheet (Excel, CSV, Sheets) plus a Slack / Discord / Telegram / e-mail digest per run |
| **Typical run** | realDonaldTrump, 50 latest posts read → ≈ 10 qualify on a tariff / Fed / market watch list (≈ 20 %, estimate) |
| **Cost of that run** | $0.29 rules only (≈ $0.029 per post all in) · $0.38 with AI (≈ $0.038 per post all in) — the $0.25 source read on your account included |
| **Free tier** | first 25 qualified posts per account |
| **Keys / setup** | AI on your plan: with Apify model access, every post, no key · any other plan: your first 5 real posts live on us, then a free Gemini / Groq key = 1–3 AI verdicts per run, a paid key every post |
| **Which plan** | Free demo and your own list (list mode, [template](https://api.apify.com/v2/key-value-stores/hKoeXBwCEGNomx81O/records/list-template.json)): any plan · live read: a plan that runs Store Actors |
| **How fast** | At the next run: every 15 minutes for newsrooms; the *Fast lane* preset every 2 minutes for desks |
| **Works with** | Schedules, webhooks, Telegram, Slack, Teams, Google Chat, Discord, Sheets, Make / n8n, MCP |

### 🎯 What this Actor does

It reads your accounts with a Truth Social scraper on your account and charges only for posts that pass:

- **Only the posts that matter** — a watch keyword, entity (company, `$TICKER`, country, person) or topic. No watch
  list: every new post, tagged.
- **Topic and market relevance** 0–100 — markets, a policy or a named party; never a price call.
- **Who is named**, with the post's exact words and the stance; sectors as a flagged inference.
- **A headline to forward**, a plain summary, New York time, market session, engagement vs median.
- **Only new posts.** Reposts, replies, old and duplicate posts are dropped free.

#### 📈 Truth Social market signals for traders — Trump tariff alerts, Trump Fed alerts

Pick the *Trump tariff alerts* or *Trump Fed alerts* preset, or set **Minimum market relevance**.

#### 🔔 Trump Truth Social alerts in Slack, Discord or Telegram

Paste a Slack, Discord, Telegram (your bot's send link), Teams or Google Chat URL into **Send alerts to** — detected
from the address — or add `notifyEmail`; any other https URL gets each post as JSON (Make, n8n).

#### 🗳️ Midterm endorsement alerts — Trump's 2026 endorsements and attacks

The *Election & endorsements* preset flags endorsements of and attacks on candidates before the 2026-11-03
midterms, race and state named — for newsrooms and campaign desks.

#### 👀 A Truth Social monitor for any account

Any public handle; all your accounts in one run ($0.0001 a run).

### 🚀 How to use it

1. **Click `Try it`** — the form is pre-filled with the free demo on sample posts; it works as is.
2. **Type the accounts to watch and your watch list** (or pick a preset) — they start the live read on your Apify
   account, capped by "Max source spend". Leave "AI assessment" on: your first 5 posts get live AI verdicts on any
   plan; all 25 free ones get them with Apify model access or a paid own key.
3. **Press Start and open the dataset** — qualified posts land best-first.
4. **Schedule it every 15 minutes** (Actions → Schedule) with "Only new posts" on — only new posts are read and
   charged; a desk takes the *Fast lane* preset every 2 minutes.

![Alerts view — the ready-to-post alert line, market hours and the link](https://api.apify.com/v2/key-value-stores/hKoeXBwCEGNomx81O/records/alerts.svg)

📚 **Learn more:** [Step-by-step tutorial — how to get Trump Truth Social alerts with this Actor](https://api.apify.com/v2/key-value-stores/hKoeXBwCEGNomx81O/records/tutorial.html)

### 🆚 Why this instead of running Truth Social Scraper yourself?

A scraper returns every post; here the same read is filtered, tagged and pushed — misses cost $0 here.

| | [Truth Social Scraper (`muhammetakkurtt/truth-social-scraper`)](https://apify.com/muhammetakkurtt/truth-social-scraper) or [`tri_angle/truth-scraper`](https://apify.com/tri_angle/truth-scraper) alone | **This Actor** |
|---|---|---|
| **Your time per 100 posts that matter** | ≈ 3.3 h reading ≈ 500 posts (our estimate, 2 min a post, timing dated in the roadmap) | 0 h — filtered, tagged, ranked |
| **Posts you never read** | none | ≈ 4 of 5 dropped free on a watch list (estimate) |
| **Topic, relevance, entities** | none | 12 topics, relevance 0–100, entities, headline |
| **Same 100 posts that matter, all in** | $2.50–2.70 for ≈ 500 unsorted posts | $2.90 rules only ($0.40 here + the same read) · $3.80 with AI |
| **Price** | $0.005 per post + $0.0001–0.02 per run · 152 / 46 users | from $0.004 per qualified post, first 25 free, no start fee of ours |

#### vs other Truth Social scrapers and free tools

Store listings checked 2026-10-10, drawbacks from their READMEs. Each prices its own unit — theirs every post, ours
a post that **matches your watch list**; for 100 matches a scraper reads ≈ 500 (≈ 20 %, estimate) and you sort them.

| | Price | 100 posts, its own unit (all in) | Your time for 100 matches | What is missing |
|---|---|---|---|---|
| **This Actor** | $0.004 per qualified post ($0.01 AI), first 25 free · new | $2.90 per 100 matches, the read included ($3.80 AI) | 0 h — filtered, tagged, deduped | — |
| [`maplerope44/trump-truth-social-scraper`](https://apify.com/maplerope44/trump-truth-social-scraper) | $0.005 per item + $0.0005 start | $0.50 per 100 posts — ≈ 5× for 100 matches | ≈ 3.3 h sorting | filters, tags, memory |
| [`khadinakbar/truth-social-all-in-one-scraper`](https://apify.com/khadinakbar/truth-social-all-in-one-scraper) | $0.004 per record + usage | $0.40 per 100 posts + usage — ≈ 5× for 100 matches | ≈ 3.3 h sorting | topic, watch list |
| [`automation-lab/truth-social-scraper`](https://apify.com/automation-lab/truth-social-scraper) | $0.0023 per post + $0.005 start · 13 % failed | $0.24 per 100 posts — ≈ 5× for 100 matches | ≈ 3.3 h sorting | filters, tags, memory |
| [`neverempty/truth-social-posts-monitor`](https://apify.com/neverempty/truth-social-posts-monitor) | $0.004 per post + $0.008 start | $0.41 per 100 posts — ≈ 5× for 100 matches | ≈ 3.3 h sorting | watch list, topic, entities |
| [`datahamster/truth-social-posts`](https://apify.com/datahamster/truth-social-posts) | $0.002 per result + $0.006 per check | $0.21 per 100 posts — ≈ 5× for 100 matches | ≈ 3.3 h sorting | watch list, topic, entities |
| Trump's Truth (trumpstruth.org) — free | $0 | — | you search it | other accounts, API, alerts |
| Truth Social website (truthsocial.com/@realDonaldTrump) — free | $0 | — | you refresh it | keyword alerts, export |
| Benzinga Pro | $37 a month Basic, $197 Essential (pricing page, 2026-10-10) | — | — | the post itself, your watch list |

### 💵 Pricing — what a run really costs

Pay per result: **one event per qualified post, nothing else.** Your first 25 qualified posts are free, whatever the
tier.

| Event | When it is charged | Price |
|---|---|---|
| `qualified-post-basic` | AI off — matches, topic, rule relevance, market session, baseline, headline | **$0.004** |
| `qualified-post-ai` | AI on — plus a score with a quoted reason, summary, sentiment, entities, sectors | **$0.01** |

**Never charged by us:** reposts, replies, old or empty posts, posts off your watch list or below `minScore`, posts
you already received. **The source's read** bills your Apify account per post plus a run fee, capped by
`maxDiscoveryChargeUsd`.

**How that compares** — $0.004 equals the $0.004 median per-post price of the ten priced Truth Social Actors, but
per qualified post: one replaces ≈ 5 raw posts on a watch list — $0.0008 per raw-row equivalent.

**Worked example** — realDonaldTrump, 50 posts read → ≈ 10 qualified on a tariff / Fed watch list (≈ 20 %,
estimate): source $0.25 + $0.0001 run fee on your account + 10 × $0.004 = **$0.29, about $0.029 per qualified post
all in**. With AI: $0.25 + 10 × ($0.01 + ≈ $0.003 tokens) = **$0.38, about $0.038 per post all in**.

**At volume** — *Administration watch* (5 accounts) every 15 minutes: $0.29 run fees + ≈ 1,800 posts read ($9) +
≈ 360 qualified × $0.013 ≈ **$14 a month with AI**, all in (estimate).

### 🤖 What the AI tier adds

The same post (“Just spoke with the CEO of Nvidia ($NVDA). They will be investing $100 Billion in new chip plants in
Arizona and Texas…”) with AI off — lexicon and rules, from the free demo run:

```json
{"topic": "company_or_stock", "marketRelevance": 100, "ruleScore": 90, "label": "hot", "sentiment": "unknown",
 "reason": "names '$NVDA'; company / stock words: '$NVDA', 'Nvidia', 'investing'",
 "entities": [{"name": "$NVDA", "type": "ticker", "stance": "neutral", "quote": "$NVDA"}],
 "alertHeadline": "@ExampleOfficial: Just spoke with the CEO of Nvidia ($NVDA). They will be investing $100…"}
```

AI **on** (`qualified-post-ai`, $0.01) — the same post read against *your* goal by the own-key default model
(list-mode run with a free Gemini key, 2026-10-16, ≈ 280 output tokens a post):

```json
{"topic": "company_or_stock", "marketRelevance": 100, "ruleScore": 90, "fitScore": 100, "label": "hot",
 "sentiment": "positive", "reason": "'Just spoke with the CEO of Nvidia ($NVDA).'",
 "entities": [{"name": "Nvidia", "type": "company", "stance": "positive", "quote": "Nvidia"},
              {"name": "$NVDA", "type": "ticker", "stance": "positive", "quote": "$NVDA"},
              {"name": "Arizona", "type": "country", "stance": "neutral", "quote": "Arizona"},
              {"name": "Texas", "type": "country", "stance": "neutral", "quote": "Texas"}],
 "sectors": [{"name": "semiconductors", "reason": "Involves major chip investments by Nvidia", "inferred": true}],
 "alertHeadline": "Nvidia announces $100B investment in US chip plants",
 "aiModel": "google:gemini-3.5-flash-lite", "assessedBy": "ai"}
```

That read takes ≈ 2 minutes by hand (our estimate on 3 sample posts). Which AI your plan gets:
[Keys / setup](#-at-a-glance); a free Gemini key: [aistudio.google.com/apikey](https://aistudio.google.com/apikey).

### ⚙️ Input

<details><summary>Main fields and their defaults</summary>

| Field | Type | Default | What it does |
|---|---|---|---|
| `usernames` | string\[] | — | Accounts to read live; typing them starts the live read |
| `preset` | pick from a list | `custom` | A ready watch list in one click, first read capped at $0.15 |
| `watchKeywords`, `watchEntities` | string\[] | — | A post naming any of them qualifies; `$NVDA` also matches `NVDA` |
| `goalDescription` | string | — | The AI scores each post against it |
| `minScore` | 0–100 | `0` | Decides what you pay: below this = not delivered, not charged |
| `sinceDate` | string | — | A date, or a recent window: `60m`, `6h`, `2d` |
| `maxQualified`, `maxDiscoveryChargeUsd` | integer, number | `100`, `0.5` | Caps on posts charged here and on the source's spend |
| `enableAi` | boolean | `true` | AI assessment on / off |
| `discoveryActorId` | pick from a list | `tri_angle/truth-scraper` | The source scraper |

Also: `topics`, `minMarketRelevance`, `onlyOutliers`, `includeReplies`, `includeReposts`, `targetFlags`,
`suppressionList`, `maxPostsPerAccount`, `onlyNewPosts`, `dedupeTtlDays`; delivery `notifyEmail` and `sendAlertsTo`
(any Slack / Discord / Telegram / Teams / Google Chat / webhook URL, detected by host); the per-service fields and
`alertFooter` are advanced.

</details>

### 📤 Output

One item per qualified post. Views: `Shortlist`, `Alerts (Slack / Telegram)`, `Entities & sectors`, `Corpus
(research export)`, `Score breakdown`. **Scored by** (`assessedBy`: `ai`, `sample` or `rules`) says
which scale `score` is on.

<details><summary>An example row (the free demo, AI off, <code>chargedEvent: demo</code>)</summary>

```json
{"url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000101", "postId": "114900000000000101",
 "accountUsername": "ExampleOfficial", "accountProfileUrl": "https://truthsocial.com/@ExampleOfficial",
 "publishedAtEt": "2026-10-06T10:05:00-04:00", "postedDuringUsMarketHours": true, "usMarketSession": "regular",
 "text": "Effective November 1st, the United States will impose a 25% Tariff on all cars and trucks imported…",
 "favouritesCount": 41000, "engagementMultiple": 1.9, "matchedKeywords": ["tariff"],
 "matchedEntities": ["European Union", "China"], "topic": "tariffs_trade", "secondaryTopics": ["geopolitics_war"],
 "marketRelevance": 95, "flags": ["keyword_match", "entity_match", "market_hours"], "ruleScore": 95, "score": 95,
 "label": "hot", "assessedBy": "rules",
 "reason": "names 'tariff', 'European Union', 'China'; tariffs & trade words: 'Tariff', 'Reciprocal'; states an action",
 "chargedEvent": "demo", "dedupeKey": "id:114900000000000101"}
```

</details>

#### Output fields

<details><summary>Every field of a row</summary>

The example row's fields, plus: `usMarketSession`, `isAnnouncement`, `accountDisplayName`, `accountFollowers`, `accountVerified`, `publishedAt`,
`textLength`, `language`, `isReply`, `isRepost`, `isQuote`, `isPinned`, `isSensitive`, `quotedText`, `quotedUrl`,
`repostOfUrl`, `inReplyToUrl`, `mediaType`, `mediaUrls`, `mediaCount`, `hasPoll`, `linkUrl`, `linkTitle`,
`linkDomain`, `hashtags`, `repliesCount`, `reblogsCount`, `accountBaseline`, `isOutlier`, `targetFlagsMatched`,
`scoreReasons`, `generatedText`, `recommendedNextStep`, `sourceActor`, `aiModel`, `billedAs`, `scrapedAt`.
A count or flag the source
did not report is `null`, never 0. **Threshold and trend on `ruleScore`** — the same scale on every row; `score` is the
AI fit where `assessedBy` is `ai` (or `sample`), else the rule score — sort one run on it. Each field, one full item
and the `OUTPUT` keys: [API reference](https://api.apify.com/v2/key-value-stores/hKoeXBwCEGNomx81O/records/api-reference.md).

</details>

**Upsert key for a CRM or Sheet:** `dedupeKey` (`id:` + the post id) — one post is one row however many runs find
it; `itemId` hashes it.

**Which record to read:** `OUTPUT` (funnel, source bill `sourceStatus.sourceCost`), the **`DIGEST`** ("vs last run:
qualified 41 → 55") and the **`REPORT`** page (`OUTPUT.reportUrl`).

⭐ **Found it useful? A review on the Store helps others find it.**

### 🔁 Run it on a schedule

1. **Open the saved task and click Schedule** after your first real run (`OUTPUT.scheduleTaskUrl`) — every 15
   minutes for newsrooms, daily for research.
2. Keep **Only new posts** and `dedupeAcrossRuns` on — a run with nothing new costs only the source's run fee.
3. Add `notifyEmail` or paste a Slack, Teams, Google Chat, Discord or **Telegram** link (a @BotFather bot, admin in
   the channel) into **Send alerts to**. Make / n8n upsert each post into your [tracker sheet](https://api.apify.com/v2/key-value-stores/hKoeXBwCEGNomx81O/records/tracker.csv)
   on `dedupeKey`.
4. From run 2, `OUTPUT.history` and the `REPORT` show every run; `historyDatasetName` keeps a corpus.

A month of one account every 15 minutes: ≈ 750 posts read ($3.75) + $0.29 run fees (2,880 runs × $0.0001) + ≈ 150
qualified × $0.004 = **≈ $4.60 rules only**, **≈ $6 with AI** (estimate). A post reaches you up to ≈ 16 minutes
after it was posted.

#### ⚡ Fast lane for traders — a 2-minute schedule

Pick *Fast lane* (the 5 newest posts, relevance 50+, AI on), press Start, then the saved task → **Schedule** → every
2 minutes. A run with nothing new reads nothing (the source's cursor): $0.0001, nothing here. A post reaches you up
to ≈ 3 minutes after it was posted (estimate, measurement dated in the roadmap). A month: 21,600 runs × $0.0001 = $2.16

- ≈ 750 posts read ($3.75) + ≈ 150 alerts × $0.004 = **≈ $6.50 rules only**, ≈ $7.90 with AI (estimate).

#### 🎯 Try it for your niche

Pick one under **Start from a ready watch list** and press Start; its first live read is capped at $0.15 (counts
dated in the roadmap).

<details><summary>The 7 ready watch lists</summary>

| Niche | What it looks for | Start |
|---|---|---|
| Trump tariff alerts | topic *Tariffs & trade* + tariff, trade deal, export controls | [preset](https://api.apify.com/v2/key-value-stores/hKoeXBwCEGNomx81O/records/preset-tariffs-trade.json) |
| Trump Fed alerts | topic *Fed, rates & inflation* + Fed, Powell, interest rates | [preset](https://api.apify.com/v2/key-value-stores/hKoeXBwCEGNomx81O/records/preset-fed-rates.json) |
| Market movers | any post with market relevance 50+ | [preset](https://api.apify.com/v2/key-value-stores/hKoeXBwCEGNomx81O/records/preset-market-movers.json) |
| Crypto | topic *Crypto* + bitcoin, stablecoin, strategic reserve | [preset](https://api.apify.com/v2/key-value-stores/hKoeXBwCEGNomx81O/records/preset-crypto.json) |
| Administration watch | 5 administration accounts in one run; relevance 40+ | [preset](https://api.apify.com/v2/key-value-stores/hKoeXBwCEGNomx81O/records/preset-administration-watch.json) |
| Election & endorsements | midterm endorsements and attacks | [preset](https://api.apify.com/v2/key-value-stores/hKoeXBwCEGNomx81O/records/preset-election-endorsements.json) |
| Fast lane | 5 newest posts, relevance 50+, every 2 minutes | [preset](https://api.apify.com/v2/key-value-stores/hKoeXBwCEGNomx81O/records/preset-fast-lane.json) |

</details>

### 🔌 Integrations, automation and API

#### Run outcomes — what your integration sees

<details><summary>Every outcome: run status, dataset, <code>OUTPUT</code> field, charged?, what to do</summary>

| Outcome | Status | Dataset | `OUTPUT` | Charged? | What to do |
|---|---|---|---|---|---|
| Free demo | SUCCEEDED | samples | `mode: demo` | no | type accounts |
| Success | SUCCEEDED | posts | funnel, `aiCoverage` | per post | — |
| Nothing new / matched | SUCCEEDED | empty | `outcome: empty` | not by us (source read ran) | widen the watch list |
| Demo text in place | SUCCEEDED | empty | `inputNeeded` | no | replace the field |
| Invalid input | FAILED | empty | — | no | fix the field named |
| Your plan cannot run the source Store Actor | SUCCEEDED — the same for the Console, the API and a schedule; check `OUTPUT.ok` | empty | `ok: false`, `outcome: source_refused`, `sourceRefused: plan` | no | [list mode](#-list-mode-rows--what-a-pasted-post-needs) |
| Source format changed | FAILED | empty | `sourceError` | no | other source or `list` |
| Unknown account | FAILED if nothing loaded | other accounts' posts | `sourceStatus.failedAccounts` | per post | check the handle |
| Source partial (timed out) | SUCCEEDED | posts scraped | `sourceStatus.partial: true` | per post | raise `discoveryTimeoutSecs` |
| AI unavailable | SUCCEEDED | rule-scored | `aiError` | free, then basic | `llmProvider: byok` |

</details>

- **Webhook** — `{"event": "post.qualified", "post": {…}, "runId"}` per post (`posts.qualified` per batch), the
  full row; retried once, never fails the run; `webhookSecret` signs it (`X-Signature: sha256=<HMAC>`).
- **Which call runs what** — `OUTPUT.mode`: `demo` (`{}`, never charged), `live` (accounts typed, or a goal
  alone), `list` or `dataset`.
- **Truth Social API for agents / MCP** — plain typed inputs; MCP server
  `https://mcp.apify.com/?actors=rich_minds/truth-social-alerts-ai`: ask *"what did Trump post about tariffs in the
  last hour?"*. The snippets run the **real read**, capped; `{}` runs the free demo.

<details><summary>API snippets — Python and JavaScript</summary>

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("rich_minds/truth-social-alerts-ai").call(
    run_input={
        "sourceMode": "actor",  # free first call: {} or {"sourceMode": "list", "itemsList": [...]}
        "usernames": ["realDonaldTrump"],
        "watchKeywords": ["tariff", "Fed"],
        "watchEntities": ["$NVDA", "China"],
        "goalDescription": "I trade semiconductor stocks; flag tariffs, export controls and the Fed",
        "maxQualified": 50,
        "maxDiscoveryChargeUsd": 0.5,  # source spend cap on your account
    },
    timeout_secs=3240,  # live read + AI, paid own key — see "How long does a run take?"
    # build="0.1.4",  # pin the build you tested with (Changelog)
)
out = client.key_value_store(run["defaultKeyValueStoreId"]).get_record("OUTPUT")["value"]
if out.get("sourceError"):  # a failed source, never "nothing new"
    raise RuntimeError(out["sourceError"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if item["ruleScore"] >= 60:  # threshold on ruleScore: one scale on every row
        print(item["url"], item["score"], item["label"], item["alertHeadline"])
```

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('rich_minds/truth-social-alerts-ai').call({
    sourceMode: 'actor', // free first call instead: {} (the demo)
    usernames: ['realDonaldTrump'],
    watchKeywords: ['tariff', 'Fed'],
    goalDescription: 'I trade semiconductor stocks; flag tariffs, export controls and the Fed',
    maxQualified: 50,
    maxDiscoveryChargeUsd: 0.5, // source spend cap
}, { timeout: 3240 /* , build: '0.1.4' — pin the build you tested with */ });
const out = (await client.keyValueStore(run.defaultKeyValueStoreId).getRecord('OUTPUT')).value;
if (out.sourceError) throw new Error(out.sourceError); // a failed source, never "nothing new"
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((i) => i.ruleScore >= 60).map((i) => [i.url, i.score, i.label, i.alertHeadline]));
```

**Minimal agent input** — the last hour, the memory off:

```json
{"usernames": ["realDonaldTrump"], "watchKeywords": ["tariff"], "sinceDate": "60m", "dedupeAcrossRuns": false, "maxQualified": 10, "maxDiscoveryChargeUsd": 0.5}
```

</details>

#### 🧾 List-mode rows — what a pasted post needs

<details><summary>Fields a pasted post can carry</summary>

`sourceMode: "list"` runs on any plan: paste posts into `itemsList` — either source Actor's JSON works as is.

| Field | Needed? | What it enables |
|---|---|---|
| `id` | required — or `postId`, else `url` | identity, dedupe key, the post URL |
| `content` | required for matches, topic and AI — or `text` | keywords, entities, topic, relevance, AI |
| `created_at` | recommended — or `createdAt` | `publishedAtEt`, market hours, `sinceDate`, latency |
| `account.username` | recommended — or `username` | the account, its baseline, `accountProfileUrl` |
| `favourites_count` | optional — with `reblogs_count`, `replies_count` (or camelCase) | engagement, outliers |
| `card` | optional — also `url`, `media_attachments`, `mentions`, `tags`, `reblog`, `quote`, `in_reply_to_id`, `pinned` | link, media, matches, repost / quote / reply filters |

</details>

### 👥 Who is it for?

| You are… | You run it to… | Start with |
|---|---|---|
| Newsroom or political journalist | the post at the next run, with a headline ready to publish — midterm endorsements too | no watch list or *Election & endorsements*, Slack digest |
| Trading-community operator | post market-relevant Trump alerts into your Discord or Telegram channel | preset *Market movers* + your channel's link in **Send alerts to** |
| Public-affairs, PR or political-risk team | catch your company, industry or country being named | `watchEntities` with your names and `$TICKER`, Teams |
| Trader or quant desk | the post up to ≈ 3 minutes after it lands, when it names tariffs, the Fed, a ticker or a country | preset *Fast lane*, every 2 minutes, webhook |

**Run a Discord or Telegram channel?** *Market movers* + your channel's link in **Send alerts to**, scheduled; each
digest ends with a small "via Truth Social Alerts on Apify" line (`alertFooter` switches it off).

### 🧠 How the AI works

- **Grounded.** One post at a time; topics from the 12 labels; every entity and quote must appear in the post;
  sectors are the only inference, flagged `inferred: true`.
- **Your goal.** The score measures the post against your `goalDescription` and watch list, best rule score first.
- **No key where your Apify plan includes model access** — otherwise your own key (`llmProvider: "byok"`). Default:
  `anthropic/claude-haiku-4.5`.
- **Fallback.** If the model fails, the post keeps its rule fields at the basic price.

### 🔒 Data, compliance and limits

- Public posts only, read with no login. Posts contain personal data — follow Truth Social's terms and GDPR / CCPA.
- **No investment advice.** Market relevance says whether a post touches markets — never which way a price moves;
  such AI reasons are removed.
- Market hours: the NYSE regular session, 09:30–16:00 New York time on trading days — NYSE holidays are closed and
  early closes end at 13:00 (calendar for 2026–2027); `usMarketSession` says pre, regular, after or closed. An outlier
  needs 5 posts of the account.

### ❓ FAQ

**What will my first real search cost?** realDonaldTrump, 50 posts ≈ $0.25 on your account (capped at $0.50); the
first 25 qualified posts are free, then $0.004 each ($0.01 with AI).

**How fast does a new post reach me?** At the next run: up to ≈ 16 minutes on a 15-minute schedule, ≈ 3 minutes with
the *Fast lane* every 2 minutes (estimates; `runLatencyMinutes` on every row).

**Is this a Truth Social scraper?** It runs one for you on your account and adds the filters, tags and memory;
`list` mode never runs it.

**Is it a Benzinga Pro alternative?** For Truth Social, yes: Benzinga Pro Basic is $37 a month per seat; here one
account every 15 minutes costs ≈ $6 a month with AI, the post itself and a webhook. For broad market news, Benzinga
wins.

**Why pay when trumpstruth.org is free?** For being told: Trump's Truth is a free archive — use it to search the
past; it has no other accounts, API or alerts.

**Will I be charged for the same post twice?** No, with `dedupeAcrossRuns` on (default): every charged post is
remembered by its post id, even when the source's cursor is reset. Edit the watch list and a post you already paid
for under the old one comes back in the new list as `already-charged` — delivered, never charged again. One charge
per post per `dedupeStoreName`.

**Can it alert me to Trump's midterm endorsements?** Yes — the *Election & endorsements* preset flags every
endorsement of or attack on a candidate, with the race and state, on realDonaldTrump and TeamTrump.

<details><summary>More questions: run time, plans, free units, sending</summary>

**How long does a run take?** Size your `timeoutSecs` from it (source + AI + the rate-limit budget):

| Mode | Time | `timeoutSecs` to pass |
|---|---|---|
| Free demo (6 sample posts) | under 1 s (measured) | 120 |
| Live read, rules only | ≈ 1 min for 50 posts (estimate) | 600 |
| AI via Apify's model access | ≈ 3–5 min per 100 posts, 8 calls at a time (estimate) | 900 |
| AI with a free own key | 1–3 posts assessed, the AI stops after 60 s of waits | 600 |
| AI with a paid own key | ≈ 810 s for 50 posts (estimate) | 1800 |

Own key pace by design (qualifier as of 2026-10-10): after the provider's first rate limit, calls are spaced 6 s
apart — at most 10 posts per minute; the per-provider figure is measured on the first own-key run (roadmap).

**Which Apify plan do I need?** Any plan runs the free demo and `list` mode; the live read runs on a plan that runs
Store Actors. Which AI you get on your plan: [Keys / setup](#-at-a-glance).

**Do rule-scored posts use my free ones?** Yes, while the AI is unavailable — except the last 5, kept for your first AI-assessed posts (`OUTPUT.chargeSplit.freeKeptForAi`).

**What if nothing matches?** The run succeeds with 0 rows, nothing charged here.

**How do I send the alerts safely?** Forward them to channels you run, within each platform's rules; never reply to
or mass-message strangers on Truth Social from them (that risks a restricted account). The Actor posts nothing to
Truth Social.

</details>

### 🧩 More Actors from the same developer

Not quite your use case? The same pay-per-qualified-result model, closest to this Actor's buyers first:

- **[Reddit Brand Monitoring](https://apify.com/rich_minds/reddit-brand-monitoring-ai)** — Know the moment Reddit talks about your brand or ticker — ranked, with the thread to answer first.
- **[Threads Brand Monitoring](https://apify.com/rich_minds/threads-brand-monitoring-ai)** — The same alert feed for Threads: every new post naming your brand, ranked.
- **[Facebook Page Post Tracker](https://apify.com/rich_minds/fb-page-post-tracker)** — Watch official Facebook pages the way you watch Truth Social: new winning posts, weekly.

### 🆘 Support

Something missing or wrong? Open an issue on the Actor's page or message the developer through the Apify Console.

### 📝 Changelog

One line per published build, newest first.

- **0.1.4** (2026-10-16) — Your own free Gemini key now works as is in "My own API key" mode — no model name to type — and the page shows a real AI-written alert next to the rules-only one; A shorter form: alerts are set up once in "Send alerts to", and the demo's sample posts no longer link to Truth Social pages that do not exist; When your Apify plan cannot run the Truth Social scraper, the run now ends as succeeded with a clear "plan refused" outcome and the any-plan next step, instead of a failed run.
- **0.1.3** (2026-10-10) — one "Send alerts to" field, *Fast lane* and *Election & endorsements* presets, NYSE
  holidays in market hours, no second charge after a watch-list edit.
- **0.1.2** (2026-10-10) — one-run source by default, Telegram digest, two presets, `sinceDate` windows.
- **0.1.1** (2026-10-10) — initial release: watch lists, topics, market relevance, entities, headlines, webhooks.

# Actor input Schema

## `usernames` (type: `array`):

Handles to read live, e.g. <code>realDonaldTrump</code> (<code>@name</code> or the profile URL work too). Empty = the free demo on sample posts; typing accounts starts the live read on your Apify plan (any plan that runs Store Actors), spend-capped below. Adding an account keeps the memory of the others.

## `preset` (type: `string`):

Pick one and press Start: it fills the fields you left empty and reads the accounts live, its first read capped at $0.15 (no preset is measured on a live read yet). Your own values always win. <b>Custom</b> = fill the fields yourself.

## `watchKeywords` (type: `array`):

Deliver posts that name any of these words or phrases (any case, whole words; <code>tariff\*</code> also matches tariffs) in the post, the quoted post or the link title. Leave empty with every other filter to get every new post.

## `watchEntities` (type: `array`):

Deliver posts that name any of these in the text, the mentions, the hashtags or the link title. <code>$NVDA</code> matches <code>$NVDA</code> or a bare <code>NVDA</code> in capitals. The AI tags the stance toward each.

## `goalDescription` (type: `string`):

Describe your book or beat in plain words. The AI scores every post against it and explains why in one line.

## `enableAi` (type: `boolean`):

Topic, market relevance 0–100, a score against your goal with a quoted reason, summary, headline, sentiment and grounded entities per post. <b>On = $0.01 per qualified post + AI tokens; off = $0.004</b> (rule-based tags only). Your first 5 posts get live AI verdicts on any plan; every one with Apify model access or a paid own key.

## `maxQualified` (type: `integer`):

Hard cap on results — and the ceiling of what <b>this Actor</b> charges: at most this many × $0.01 with AI on (× $0.004 with AI off), e.g. 100 × $0.01 = $1.00; the source's own spend has its cap right below. The best-scoring posts are output first.

## `maxDiscoveryChargeUsd` (type: `number`):

Affects what you pay: hard cap on what the Truth Social source runs may charge your account (≈ $0.005 per post + $0.0001 per run on the default source) — $0.50 in the form and for an API or agent call that leaves it out. Raise it for many accounts.

## `notifyEmail` (type: `string`):

After every run with at least one new post, the digest (how many are new, the top 10 with headline, topic and link) is e-mailed here through Apify's send-mail Actor. Schedule the run (Actions → Schedule) and only new posts reach your inbox. Never sent for the free demo.

## `minScore` (type: `integer`):

Affects what you pay: posts scoring below this are discarded and <b>not charged</b>. 0 = every post that passes your watch filters. Raise it to pay only for the strongest matches.

## `topics` (type: `array`):

Deliver posts whose topic (the AI's, else the keyword lexicon's) is one of these.

## `minMarketRelevance` (type: `integer`):

Deliver posts whose market relevance (does it touch markets, a policy or a named company or country — never a price direction) is at least this. 0 = off.

## `onlyOutliers` (type: `boolean`):

Deliver posts whose engagement (likes + 2 × reposts + 3 × replies) is at least 2× the account's median — once 5 or more of its posts were seen.

## `sinceDate` (type: `string`):

YYYY-MM-DD, an ISO date-time, or a recent window: <code>60m</code>, <code>6h</code>, <code>2d</code> (an agent asking about the last hour sends <code>60m</code>). Older posts are dropped free; the default source skips older days at the source.

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

Off: replies are dropped free. On: the default source runs a second, replies-only read per account (one more run fee).

## `includeReposts` (type: `boolean`):

Off: reposts of other people's posts are dropped free.

## `targetFlags` (type: `array`):

Only deliver posts with at least one of these rule flags, ranked higher with more of them. An API call passes the names from the README's flag table, e.g. <code>market_hours</code> (<code>marketHours</code> works too); an unknown name stops the run at once with the list of valid ones.

## `suppressionList` (type: `array`):

Post ids, URLs or account handles to never output. Skipped before any processing and never charged.

## `llmProvider` (type: `string`):

<b>Apify (no keys)</b> — the AI runs through Apify's built-in OpenRouter proxy; tokens are billed to your Apify account at OpenRouter's rates. <b>My own key</b> — use your OpenAI / Anthropic / Gemini / Groq key instead; a free-tier key assesses only a few posts per run — expect 1–3 AI checks (2 calls at a time, one after a rate limit, then the 3 borderline posts retried one by one) — and the rest keep their rule score; a paid Groq / Gemini key (billing on) assesses every post.

## `llmModel` (type: `string`):

Leave empty for the default: <code>anthropic/claude-haiku-4.5</code> through Apify, <code>google:gemini-3.5-flash-lite</code> with your own key (a free Gemini key works as is). Apify mode takes an OpenRouter slug such as <code>openai/gpt-4.1-mini</code>; own-key mode takes <code>provider:model</code>, e.g. <code>anthropic:claude-haiku-4-5-20251001</code> or <code>groq:openai/gpt-oss-120b</code>.

## `llmApiKey` (type: `string`):

Required when <b>AI model access</b> is <i>My own API key</i>. Stored encrypted by Apify, never logged.

## `sendAlertsTo` (type: `string`):

Paste one or more URLs, one per line — the service is detected from the address: a Slack or Discord channel webhook, a Teams Workflows or Google Chat space webhook, your Telegram bot's send link (<code>https://api.telegram.org/bot\<token>/sendMessage?chat_id=@yourchannel</code>) or any other https URL (Zapier, Make, n8n, your CRM), which gets each qualified post as JSON. After every run with at least one new post, the digest (how many are new, the top 10 with headline and link) is posted there. Never sent for the free demo. Headers, batching, signing and one field per service: <i>Delivery details (advanced)</i>.

## `dedupeAcrossRuns` (type: `boolean`):

Remembers every post you were charged for (in a named key-value store on your account) and skips it in future runs — even when the source's own cursor was reset.

## `dedupeTtlDays` (type: `integer`):

How long a delivered post stays remembered. 0 = never deliver or charge it again (posts do not recur — keep 0).

## `historyDatasetName` (type: `string`):

Optional. Type a name (e.g. <code>truth-social-alerts-log</code>) and every run appends its new posts with the date to that named dataset on your account — one labelled corpus across months to connect to Google Sheets or your BI tool once. Empty = off. Costs nothing extra.

## `sourceMode` (type: `string`):

<b>actor</b> — read the accounts above live with the source Store Actor on your account, billed separately. <b>dataset</b> — an existing dataset of either source Actor. <b>list</b> — posts you paste in. <b>Bring your own data:</b> rows or a dataset ID, and you pay only for the analysis — the source Actor is never run. The mode you choose always runs as chosen; only the untouched sample posts next to accounts you typed switch to the live read (spend-capped). <code>{}</code> over the API runs the free demo — nothing charged.

## `discoveryActorId` (type: `string`):

Affects what you pay: <b>tri_angle/truth-scraper</b> (default) — every account in one run, $0.005 per post + $0.0001 per run: ≈ $0.29 a month of run fees on a 15-minute schedule. <b>muhammetakkurtt/truth-social-scraper</b> — one run per account, $0.005 per post + $0.02 per run (≈ $58 a month per account on the same schedule).

## `maxPostsPerAccount` (type: `integer`):

Affects what you pay: the source bills ≈ $0.005 per post it returns, so 50 posts × 1 account ≤ $0.25 + the run fee. With <b>Only new posts</b> on, a scheduled run returns only what is new. Minimum 5.

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

Uses the source's own last-post cursor (<code>useLastPostId</code> / <code>continueFromLastPostId</code>), so a schedule pays the source only for new posts. Our cross-run memory drops repeats on top.

## `autoSwitchToLive` (type: `boolean`):

On (default): accounts typed next to the untouched sample posts start the live read (spend-capped; <code>OUTPUT.switchedToLive</code> names them). Off: the mode you send is the mode that runs — API pipelines that must never start a paid read on their own: send <code>false</code>.

## `datasetId` (type: `string`):

Only for <b>dataset</b> mode: a dataset of <code>muhammetakkurtt/truth-social-scraper</code> or <code>tri_angle/truth-scraper</code> output. Pick it so the Actor is granted read access.

## `itemsList` (type: `array`):

Only for <b>list</b> mode. JSON array of Truth Social posts in either source's shape: at least <code>id</code> or <code>url</code> plus <code>content</code> (or <code>text</code>), optionally <code>created_at</code>, <code>account.username</code> and the counts. The prefilled posts are fictional samples.

## `discoveryInput` (type: `object`):

Only for <b>actor</b> mode. Extra keys passed to every source run as-is, overriding ours (e.g. <code>{"onlyMedia": true}</code>). The live read runs that Store Actor on your Apify plan — if your plan cannot run Store Actors, paste your own posts in <b>list</b> mode (any plan); <b>dataset</b> only for a dataset you already have.

## `maxToProcess` (type: `integer`):

Upper bound on how many new posts are scored in one run (controls run time). Default = 3 × max qualified.

## `webhookUrl` (type: `string`):

Each qualified post is POSTed here as JSON with <code>alertHeadline</code>, <code>summary</code>, <code>url</code>, <code>topic</code>, <code>marketRelevance</code> and <code>entities</code> (Zapier, Make, n8n, a Telegram bot). Stored encrypted — Zapier / Make hook URLs carry their secret in the path. A failed POST is retried and never fails the run.

## `webhookHeaders` (type: `object`):

Extra HTTP headers for the webhook, e.g. <code>{"Authorization": "Bearer …"}</code>. Stored encrypted by Apify, never logged.

## `webhookBatchSize` (type: `integer`):

1 = one POST per post the moment it is ready (per-post alerts). Higher = one POST per N posts (batched).

## `webhookSecret` (type: `string`):

Any random string. Every webhook POST then carries <code>X-Signature: sha256=\<HMAC-SHA256 of the raw body with this secret></code>, so your endpoint can verify it came from this Actor. Stored encrypted by Apify, never logged.

## `alertFooter` (type: `boolean`):

Ends each Discord and Telegram digest with one small line, "via Truth Social Alerts on Apify" and the link, so your channel's members can find the source. Switch it off to post the alerts without it.

## `dedupeStoreName` (type: `string`):

Key-value store used for cross-run memory. Left at the default, the memory is kept per search (source mode and filters): rewording <code>goalDescription</code> or adding an account keeps it, so a scheduled run never re-delivers what you already have. Running it for several desks or clients on one account, type one name per desk.

## `discoveryTimeoutSecs` (type: `integer`):

API only — hidden on the form. How long the source Store Actor may run before its partial results are used. Raise it when the status says the source stopped early.

## `slackWebhookUrl` (type: `string`):

API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Slack incoming-webhook URL for the digest.

## `discordWebhookUrl` (type: `string`):

API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Discord channel webhook URL for the digest.

## `teamsWebhookUrl` (type: `string`):

API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Teams Workflows webhook URL for the digest.

## `googleChatWebhookUrl` (type: `string`):

API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Google Chat space webhook URL for the digest.

## `telegramUrl` (type: `string`):

API only — hidden on the form, where <code>sendAlertsTo</code> takes it. The bot's sendMessage link with its chat_id (<code>https://api.telegram.org/bot\<token>/sendMessage?chat_id=@yourchannel</code>).

## Actor input object example

```json
{
  "preset": "custom",
  "goalDescription": "I trade US-listed semiconductor stocks and EUR/USD; flag tariffs, export controls, the Fed and any company or country named.",
  "enableAi": true,
  "maxQualified": 100,
  "maxDiscoveryChargeUsd": 0.5,
  "minScore": 0,
  "minMarketRelevance": 0,
  "onlyOutliers": false,
  "includeReplies": false,
  "includeReposts": false,
  "llmProvider": "apify",
  "dedupeAcrossRuns": true,
  "dedupeTtlDays": 0,
  "historyDatasetName": "",
  "sourceMode": "list",
  "discoveryActorId": "tri_angle/truth-scraper",
  "maxPostsPerAccount": 50,
  "onlyNewPosts": true,
  "autoSwitchToLive": true,
  "itemsList": [
    {
      "id": "114900000000000101",
      "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000101",
      "created_at": "2026-10-06T14:05:00.000Z",
      "content": "<p>Effective November 1st, the United States will impose a 25% Tariff on all cars and trucks imported from the European Union. China is next. Reciprocal trade is FAIR trade!</p>",
      "language": "en",
      "visibility": "public",
      "account": {
        "username": "ExampleOfficial",
        "display_name": "Example Official (sample)",
        "followers_count": 9800000,
        "verified": true,
        "url": "https://truthsocial.com/@ExampleOfficial"
      },
      "replies_count": 6200,
      "reblogs_count": 9800,
      "favourites_count": 41000,
      "media_attachments": [],
      "mentions": [],
      "tags": [],
      "card": null,
      "pinned": false
    },
    {
      "id": "114900000000000102",
      "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000102",
      "created_at": "2026-10-04T13:20:00.000Z",
      "content": "<p>The Fed must CUT INTEREST RATES NOW. Powell is TOO LATE, AGAIN. Inflation is DOWN, the economy is BOOMING!</p>",
      "language": "en",
      "visibility": "public",
      "account": {
        "username": "ExampleOfficial",
        "display_name": "Example Official (sample)",
        "followers_count": 9800000,
        "verified": true,
        "url": "https://truthsocial.com/@ExampleOfficial"
      },
      "replies_count": 3100,
      "reblogs_count": 5200,
      "favourites_count": 22000,
      "media_attachments": [],
      "mentions": [],
      "tags": [],
      "card": null,
      "pinned": false
    },
    {
      "id": "114900000000000103",
      "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000103",
      "created_at": "2026-10-07T19:45:00.000Z",
      "content": "<p>Just spoke with the CEO of Nvidia ($NVDA). They will be investing $100 Billion in new chip plants in Arizona and Texas. Great for American workers!</p>",
      "language": "en",
      "visibility": "public",
      "account": {
        "username": "ExampleOfficial",
        "display_name": "Example Official (sample)",
        "followers_count": 9800000,
        "verified": true,
        "url": "https://truthsocial.com/@ExampleOfficial"
      },
      "replies_count": 2400,
      "reblogs_count": 6100,
      "favourites_count": 30500,
      "media_attachments": [],
      "mentions": [],
      "tags": [],
      "card": {
        "url": "https://www.example-news.com/chips-investment",
        "title": "Nvidia plans $100 billion US chip investment",
        "provider_name": "Example News"
      },
      "pinned": false
    },
    {
      "id": "114900000000000104",
      "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000104",
      "created_at": "2026-10-05T01:10:00.000Z",
      "content": "<p>Congratulations to Governor Jane Doe on a tremendous win. She has my Complete and Total Endorsement!</p>",
      "language": "en",
      "visibility": "public",
      "account": {
        "username": "ExampleOfficial",
        "display_name": "Example Official (sample)",
        "followers_count": 9800000,
        "verified": true,
        "url": "https://truthsocial.com/@ExampleOfficial"
      },
      "replies_count": 900,
      "reblogs_count": 2100,
      "favourites_count": 11000,
      "media_attachments": [],
      "mentions": [],
      "tags": [],
      "card": null,
      "pinned": false
    },
    {
      "id": "114900000000000105",
      "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000105",
      "created_at": "2026-10-08T16:30:00.000Z",
      "content": "",
      "language": null,
      "visibility": "public",
      "account": {
        "username": "ExampleOfficial",
        "display_name": "Example Official (sample)",
        "followers_count": 9800000,
        "verified": true,
        "url": "https://truthsocial.com/@ExampleOfficial"
      },
      "replies_count": 1500,
      "reblogs_count": 3900,
      "favourites_count": 19000,
      "media_attachments": [
        {
          "type": "video",
          "url": "https://static.example-cdn.com/media/sample-rally.mp4",
          "preview_url": "https://static.example-cdn.com/media/sample-rally.jpg"
        }
      ],
      "mentions": [],
      "tags": [],
      "card": null,
      "pinned": false
    },
    {
      "id": "114900000000000106",
      "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000106",
      "created_at": "2026-10-08T17:02:00.000Z",
      "content": "",
      "language": "en",
      "visibility": "public",
      "account": {
        "username": "ExampleOfficial",
        "display_name": "Example Official (sample)",
        "followers_count": 9800000,
        "verified": true,
        "url": "https://truthsocial.com/@ExampleOfficial"
      },
      "replies_count": 0,
      "reblogs_count": 0,
      "favourites_count": 0,
      "reblog": {
        "id": "114899999999999990",
        "url": "https://example.com/truth-social-sample/@SampleSupporter/114899999999999990",
        "content": "<p>Great rally tonight!</p>"
      },
      "media_attachments": [],
      "mentions": [],
      "tags": [],
      "card": null,
      "pinned": false
    }
  ],
  "discoveryInput": {},
  "webhookBatchSize": 1,
  "alertFooter": true,
  "dedupeStoreName": "truth-social-alerts-ai-seen",
  "discoveryTimeoutSecs": 3600
}
```

# Actor output Schema

## `qualified` (type: `string`):

All qualified posts as JSON, best-scoring first.

## `sheet` (type: `string`):

The same posts as a spreadsheet.

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

JSON record with the funnel (loaded -> filtered -> AI-assessed -> qualified), per-reason skip counts, charged events by type, free-tier posts used and remaining, whether a budget limit was reached, webhook delivery counts and the dedupe store size.

# 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 = {
    "goalDescription": "I trade US-listed semiconductor stocks and EUR/USD; flag tariffs, export controls, the Fed and any company or country named.",
    "maxDiscoveryChargeUsd": 0.5,
    "sourceMode": "list",
    "itemsList": [
        {
            "id": "114900000000000101",
            "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000101",
            "created_at": "2026-10-06T14:05:00.000Z",
            "content": "<p>Effective November 1st, the United States will impose a 25% Tariff on all cars and trucks imported from the European Union. China is next. Reciprocal trade is FAIR trade!</p>",
            "language": "en",
            "visibility": "public",
            "account": {
                "username": "ExampleOfficial",
                "display_name": "Example Official (sample)",
                "followers_count": 9800000,
                "verified": true,
                "url": "https://truthsocial.com/@ExampleOfficial"
            },
            "replies_count": 6200,
            "reblogs_count": 9800,
            "favourites_count": 41000,
            "media_attachments": [],
            "mentions": [],
            "tags": [],
            "card": null,
            "pinned": false
        },
        {
            "id": "114900000000000102",
            "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000102",
            "created_at": "2026-10-04T13:20:00.000Z",
            "content": "<p>The Fed must CUT INTEREST RATES NOW. Powell is TOO LATE, AGAIN. Inflation is DOWN, the economy is BOOMING!</p>",
            "language": "en",
            "visibility": "public",
            "account": {
                "username": "ExampleOfficial",
                "display_name": "Example Official (sample)",
                "followers_count": 9800000,
                "verified": true,
                "url": "https://truthsocial.com/@ExampleOfficial"
            },
            "replies_count": 3100,
            "reblogs_count": 5200,
            "favourites_count": 22000,
            "media_attachments": [],
            "mentions": [],
            "tags": [],
            "card": null,
            "pinned": false
        },
        {
            "id": "114900000000000103",
            "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000103",
            "created_at": "2026-10-07T19:45:00.000Z",
            "content": "<p>Just spoke with the CEO of Nvidia ($NVDA). They will be investing $100 Billion in new chip plants in Arizona and Texas. Great for American workers!</p>",
            "language": "en",
            "visibility": "public",
            "account": {
                "username": "ExampleOfficial",
                "display_name": "Example Official (sample)",
                "followers_count": 9800000,
                "verified": true,
                "url": "https://truthsocial.com/@ExampleOfficial"
            },
            "replies_count": 2400,
            "reblogs_count": 6100,
            "favourites_count": 30500,
            "media_attachments": [],
            "mentions": [],
            "tags": [],
            "card": {
                "url": "https://www.example-news.com/chips-investment",
                "title": "Nvidia plans $100 billion US chip investment",
                "provider_name": "Example News"
            },
            "pinned": false
        },
        {
            "id": "114900000000000104",
            "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000104",
            "created_at": "2026-10-05T01:10:00.000Z",
            "content": "<p>Congratulations to Governor Jane Doe on a tremendous win. She has my Complete and Total Endorsement!</p>",
            "language": "en",
            "visibility": "public",
            "account": {
                "username": "ExampleOfficial",
                "display_name": "Example Official (sample)",
                "followers_count": 9800000,
                "verified": true,
                "url": "https://truthsocial.com/@ExampleOfficial"
            },
            "replies_count": 900,
            "reblogs_count": 2100,
            "favourites_count": 11000,
            "media_attachments": [],
            "mentions": [],
            "tags": [],
            "card": null,
            "pinned": false
        },
        {
            "id": "114900000000000105",
            "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000105",
            "created_at": "2026-10-08T16:30:00.000Z",
            "content": "",
            "language": null,
            "visibility": "public",
            "account": {
                "username": "ExampleOfficial",
                "display_name": "Example Official (sample)",
                "followers_count": 9800000,
                "verified": true,
                "url": "https://truthsocial.com/@ExampleOfficial"
            },
            "replies_count": 1500,
            "reblogs_count": 3900,
            "favourites_count": 19000,
            "media_attachments": [
                {
                    "type": "video",
                    "url": "https://static.example-cdn.com/media/sample-rally.mp4",
                    "preview_url": "https://static.example-cdn.com/media/sample-rally.jpg"
                }
            ],
            "mentions": [],
            "tags": [],
            "card": null,
            "pinned": false
        },
        {
            "id": "114900000000000106",
            "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000106",
            "created_at": "2026-10-08T17:02:00.000Z",
            "content": "",
            "language": "en",
            "visibility": "public",
            "account": {
                "username": "ExampleOfficial",
                "display_name": "Example Official (sample)",
                "followers_count": 9800000,
                "verified": true,
                "url": "https://truthsocial.com/@ExampleOfficial"
            },
            "replies_count": 0,
            "reblogs_count": 0,
            "favourites_count": 0,
            "reblog": {
                "id": "114899999999999990",
                "url": "https://example.com/truth-social-sample/@SampleSupporter/114899999999999990",
                "content": "<p>Great rally tonight!</p>"
            },
            "media_attachments": [],
            "mentions": [],
            "tags": [],
            "card": null,
            "pinned": false
        }
    ],
    "discoveryInput": {}
};

// Run the Actor and wait for it to finish
const run = await client.actor("rich_minds/truth-social-alerts-ai").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 = {
    "goalDescription": "I trade US-listed semiconductor stocks and EUR/USD; flag tariffs, export controls, the Fed and any company or country named.",
    "maxDiscoveryChargeUsd": 0.5,
    "sourceMode": "list",
    "itemsList": [
        {
            "id": "114900000000000101",
            "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000101",
            "created_at": "2026-10-06T14:05:00.000Z",
            "content": "<p>Effective November 1st, the United States will impose a 25% Tariff on all cars and trucks imported from the European Union. China is next. Reciprocal trade is FAIR trade!</p>",
            "language": "en",
            "visibility": "public",
            "account": {
                "username": "ExampleOfficial",
                "display_name": "Example Official (sample)",
                "followers_count": 9800000,
                "verified": True,
                "url": "https://truthsocial.com/@ExampleOfficial",
            },
            "replies_count": 6200,
            "reblogs_count": 9800,
            "favourites_count": 41000,
            "media_attachments": [],
            "mentions": [],
            "tags": [],
            "card": None,
            "pinned": False,
        },
        {
            "id": "114900000000000102",
            "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000102",
            "created_at": "2026-10-04T13:20:00.000Z",
            "content": "<p>The Fed must CUT INTEREST RATES NOW. Powell is TOO LATE, AGAIN. Inflation is DOWN, the economy is BOOMING!</p>",
            "language": "en",
            "visibility": "public",
            "account": {
                "username": "ExampleOfficial",
                "display_name": "Example Official (sample)",
                "followers_count": 9800000,
                "verified": True,
                "url": "https://truthsocial.com/@ExampleOfficial",
            },
            "replies_count": 3100,
            "reblogs_count": 5200,
            "favourites_count": 22000,
            "media_attachments": [],
            "mentions": [],
            "tags": [],
            "card": None,
            "pinned": False,
        },
        {
            "id": "114900000000000103",
            "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000103",
            "created_at": "2026-10-07T19:45:00.000Z",
            "content": "<p>Just spoke with the CEO of Nvidia ($NVDA). They will be investing $100 Billion in new chip plants in Arizona and Texas. Great for American workers!</p>",
            "language": "en",
            "visibility": "public",
            "account": {
                "username": "ExampleOfficial",
                "display_name": "Example Official (sample)",
                "followers_count": 9800000,
                "verified": True,
                "url": "https://truthsocial.com/@ExampleOfficial",
            },
            "replies_count": 2400,
            "reblogs_count": 6100,
            "favourites_count": 30500,
            "media_attachments": [],
            "mentions": [],
            "tags": [],
            "card": {
                "url": "https://www.example-news.com/chips-investment",
                "title": "Nvidia plans $100 billion US chip investment",
                "provider_name": "Example News",
            },
            "pinned": False,
        },
        {
            "id": "114900000000000104",
            "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000104",
            "created_at": "2026-10-05T01:10:00.000Z",
            "content": "<p>Congratulations to Governor Jane Doe on a tremendous win. She has my Complete and Total Endorsement!</p>",
            "language": "en",
            "visibility": "public",
            "account": {
                "username": "ExampleOfficial",
                "display_name": "Example Official (sample)",
                "followers_count": 9800000,
                "verified": True,
                "url": "https://truthsocial.com/@ExampleOfficial",
            },
            "replies_count": 900,
            "reblogs_count": 2100,
            "favourites_count": 11000,
            "media_attachments": [],
            "mentions": [],
            "tags": [],
            "card": None,
            "pinned": False,
        },
        {
            "id": "114900000000000105",
            "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000105",
            "created_at": "2026-10-08T16:30:00.000Z",
            "content": "",
            "language": None,
            "visibility": "public",
            "account": {
                "username": "ExampleOfficial",
                "display_name": "Example Official (sample)",
                "followers_count": 9800000,
                "verified": True,
                "url": "https://truthsocial.com/@ExampleOfficial",
            },
            "replies_count": 1500,
            "reblogs_count": 3900,
            "favourites_count": 19000,
            "media_attachments": [{
                    "type": "video",
                    "url": "https://static.example-cdn.com/media/sample-rally.mp4",
                    "preview_url": "https://static.example-cdn.com/media/sample-rally.jpg",
                }],
            "mentions": [],
            "tags": [],
            "card": None,
            "pinned": False,
        },
        {
            "id": "114900000000000106",
            "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000106",
            "created_at": "2026-10-08T17:02:00.000Z",
            "content": "",
            "language": "en",
            "visibility": "public",
            "account": {
                "username": "ExampleOfficial",
                "display_name": "Example Official (sample)",
                "followers_count": 9800000,
                "verified": True,
                "url": "https://truthsocial.com/@ExampleOfficial",
            },
            "replies_count": 0,
            "reblogs_count": 0,
            "favourites_count": 0,
            "reblog": {
                "id": "114899999999999990",
                "url": "https://example.com/truth-social-sample/@SampleSupporter/114899999999999990",
                "content": "<p>Great rally tonight!</p>",
            },
            "media_attachments": [],
            "mentions": [],
            "tags": [],
            "card": None,
            "pinned": False,
        },
    ],
    "discoveryInput": {},
}

# Run the Actor and wait for it to finish
run = client.actor("rich_minds/truth-social-alerts-ai").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 '{
  "goalDescription": "I trade US-listed semiconductor stocks and EUR/USD; flag tariffs, export controls, the Fed and any company or country named.",
  "maxDiscoveryChargeUsd": 0.5,
  "sourceMode": "list",
  "itemsList": [
    {
      "id": "114900000000000101",
      "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000101",
      "created_at": "2026-10-06T14:05:00.000Z",
      "content": "<p>Effective November 1st, the United States will impose a 25% Tariff on all cars and trucks imported from the European Union. China is next. Reciprocal trade is FAIR trade!</p>",
      "language": "en",
      "visibility": "public",
      "account": {
        "username": "ExampleOfficial",
        "display_name": "Example Official (sample)",
        "followers_count": 9800000,
        "verified": true,
        "url": "https://truthsocial.com/@ExampleOfficial"
      },
      "replies_count": 6200,
      "reblogs_count": 9800,
      "favourites_count": 41000,
      "media_attachments": [],
      "mentions": [],
      "tags": [],
      "card": null,
      "pinned": false
    },
    {
      "id": "114900000000000102",
      "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000102",
      "created_at": "2026-10-04T13:20:00.000Z",
      "content": "<p>The Fed must CUT INTEREST RATES NOW. Powell is TOO LATE, AGAIN. Inflation is DOWN, the economy is BOOMING!</p>",
      "language": "en",
      "visibility": "public",
      "account": {
        "username": "ExampleOfficial",
        "display_name": "Example Official (sample)",
        "followers_count": 9800000,
        "verified": true,
        "url": "https://truthsocial.com/@ExampleOfficial"
      },
      "replies_count": 3100,
      "reblogs_count": 5200,
      "favourites_count": 22000,
      "media_attachments": [],
      "mentions": [],
      "tags": [],
      "card": null,
      "pinned": false
    },
    {
      "id": "114900000000000103",
      "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000103",
      "created_at": "2026-10-07T19:45:00.000Z",
      "content": "<p>Just spoke with the CEO of Nvidia ($NVDA). They will be investing $100 Billion in new chip plants in Arizona and Texas. Great for American workers!</p>",
      "language": "en",
      "visibility": "public",
      "account": {
        "username": "ExampleOfficial",
        "display_name": "Example Official (sample)",
        "followers_count": 9800000,
        "verified": true,
        "url": "https://truthsocial.com/@ExampleOfficial"
      },
      "replies_count": 2400,
      "reblogs_count": 6100,
      "favourites_count": 30500,
      "media_attachments": [],
      "mentions": [],
      "tags": [],
      "card": {
        "url": "https://www.example-news.com/chips-investment",
        "title": "Nvidia plans $100 billion US chip investment",
        "provider_name": "Example News"
      },
      "pinned": false
    },
    {
      "id": "114900000000000104",
      "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000104",
      "created_at": "2026-10-05T01:10:00.000Z",
      "content": "<p>Congratulations to Governor Jane Doe on a tremendous win. She has my Complete and Total Endorsement!</p>",
      "language": "en",
      "visibility": "public",
      "account": {
        "username": "ExampleOfficial",
        "display_name": "Example Official (sample)",
        "followers_count": 9800000,
        "verified": true,
        "url": "https://truthsocial.com/@ExampleOfficial"
      },
      "replies_count": 900,
      "reblogs_count": 2100,
      "favourites_count": 11000,
      "media_attachments": [],
      "mentions": [],
      "tags": [],
      "card": null,
      "pinned": false
    },
    {
      "id": "114900000000000105",
      "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000105",
      "created_at": "2026-10-08T16:30:00.000Z",
      "content": "",
      "language": null,
      "visibility": "public",
      "account": {
        "username": "ExampleOfficial",
        "display_name": "Example Official (sample)",
        "followers_count": 9800000,
        "verified": true,
        "url": "https://truthsocial.com/@ExampleOfficial"
      },
      "replies_count": 1500,
      "reblogs_count": 3900,
      "favourites_count": 19000,
      "media_attachments": [
        {
          "type": "video",
          "url": "https://static.example-cdn.com/media/sample-rally.mp4",
          "preview_url": "https://static.example-cdn.com/media/sample-rally.jpg"
        }
      ],
      "mentions": [],
      "tags": [],
      "card": null,
      "pinned": false
    },
    {
      "id": "114900000000000106",
      "url": "https://example.com/truth-social-sample/@ExampleOfficial/114900000000000106",
      "created_at": "2026-10-08T17:02:00.000Z",
      "content": "",
      "language": "en",
      "visibility": "public",
      "account": {
        "username": "ExampleOfficial",
        "display_name": "Example Official (sample)",
        "followers_count": 9800000,
        "verified": true,
        "url": "https://truthsocial.com/@ExampleOfficial"
      },
      "replies_count": 0,
      "reblogs_count": 0,
      "favourites_count": 0,
      "reblog": {
        "id": "114899999999999990",
        "url": "https://example.com/truth-social-sample/@SampleSupporter/114899999999999990",
        "content": "<p>Great rally tonight!</p>"
      },
      "media_attachments": [],
      "mentions": [],
      "tags": [],
      "card": null,
      "pinned": false
    }
  ],
  "discoveryInput": {}
}' |
apify call rich_minds/truth-social-alerts-ai --silent --output-dataset

```

## MCP server setup

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

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/6lC9MWYPMiNBI1TRV/builds/4ih8QtNNX4LOmWcVd/openapi.json
