Truth Social Scraper - Posts & Profiles, No Login
Pricing
from $1.25 / 1,000 posts
Truth Social Scraper - Posts & Profiles, No Login
Scrape public Truth Social posts and profiles by username with no login. Text, media, link cards, quotes, ReTruths, reply/like counts and follower counts as clean JSON. Date filter, up to 100 accounts per run.
Pricing
from $1.25 / 1,000 posts
Rating
0.0
(0)
Developer
Cliqto Media
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Share
Scrape public Truth Social posts and profiles by username with no login, and get clean JSON rows with post text, media, link cards, quotes, ReTruths, reply/ReTruth/like counts and the author's follower count.
Use it for media monitoring, political and market research, archives or AI pipelines: the smallest run is one username, such as realDonaldTrump, which returns the latest 20 posts in a few seconds for about $0.03 on the Free plan.

Table of contents
- What it does
- Quick start
- Input
- Output
- Pricing
- Use cases
- Scheduling and monitoring
- Switching from another Truth Social scraper
- API, export and integrations
- Limits and partial results
- Troubleshooting
- FAQ
- Learn more
- Related Actors
- Support
What it does
The Actor reads the public Truth Social web API, the same one the website uses for logged-out visitors. For each username you give, it finds the account and saves either its latest posts (newest first) or one profile row. It works on many accounts in one run, stops at a date you choose, and tells you clearly when an account does not exist, is private or is not a valid username.
Good fit
- Follow what a list of public accounts posted today or in the last week.
- Build a dataset of posts with text, media links and engagement counts.
- Get follower counts, bios and join dates of many accounts at once.
- Feed fresh posts to an AI agent, a spreadsheet or a news alert flow.
Not a fit / limits
- No search, trends, groups, comments by other people, followers lists or DMs: only posts and profiles of the usernames you give.
- Only public accounts. Private (locked) accounts are reported as
privatewith no posts. - Truth Social allows only a few requests per minute, and the Actor respects that limit. It saves about 60–100 posts per minute, so 1,000 posts take about 14 minutes.
- At most 100 usernames per run and 2,000 posts per account. 100 accounts with 20 posts each take about 40 minutes.
Quick start
- Open the Input tab.
- Add one or more usernames to Usernames or profile URLs (
handles), for examplerealDonaldTrump. - Keep Max posts per account (
maxPostsPerUser) at 20, or set a higher number. - Click Start.
- Open the Output tab: the Posts view shows date, author, text, link and counts.
Expected result: 20 posts per account, newest first, in a few seconds for one account.
Input
Input fields
| Field | Plain name | Type | Required | Default / prefill | Allowed values | Effect | Example | Recommendation |
|---|---|---|---|---|---|---|---|---|
handles | Usernames or profile URLs | array of strings | yes | prefill ["realDonaldTrump"] | 1–100 items: name, @name or https://truthsocial.com/@name | which accounts to read | ["WhiteHouse", "@TeamTrump"] | Repeats are skipped; invalid items are reported and the rest still run. |
mode | What to scrape | string | no | posts | posts, profiles | posts of each account, or one profile row per account | "profiles" | Use profiles for follower counts and bios only. |
maxPostsPerUser | Max posts per account | integer | no | default 20, prefill 20 | 1–2000 | how many of the newest posts per account | 200 | Keep it small for frequent runs; each 20 posts is one request. |
since | Only posts since | string | no | empty (no date limit) | date 2026-10-01, date-time 2026-10-01T12:00:00Z, or 12 hours, 7 days, 2 weeks | skips older posts and stops reading the account there | "7 days" | Best way to keep monitoring runs short. |
includeReplies | Include replies | boolean | no | false | true / false | adds the account's replies to other posts | true | Leave off for original posts only. |
includeReblogs | Include ReTruths | boolean | no | true | true / false | adds ReTruths (reposts of other people's posts) | false | Turn off for the account's own posts only. |
An empty handles list or a list with no valid username stops the run with an Invalid input message and no charge.
Interacting settings
| When | Input A | Input B | Effective behavior | Example | Cost/result effect |
|---|---|---|---|---|---|
| Both set | maxPostsPerUser | since | reading stops at whichever comes first | 200 and "1 day" | fewer posts and requests |
| Posts mode only | mode: "profiles" | maxPostsPerUser, since, include* | post settings are ignored | profiles of 10 accounts | one row per account |
| Pinned posts | since | — | a pinned post older than since is skipped, newer posts are still read | — | none |
Input examples
Latest posts of one account
{"handles": ["realDonaldTrump"],"maxPostsPerUser": 20}
Expected behavior: one account lookup and one page of posts.
Expected output: 20 posts with createdAt, text, url, media, favouritesCount.
Limit or cost note: a few seconds, about $0.03.
Last 7 days of several accounts, with replies
{"handles": ["WhiteHouse", "TeamTrump", "DonaldJTrumpJr"],"since": "7 days","maxPostsPerUser": 100,"includeReplies": true}
Expected behavior: posts newer than 7 days, at most 100 per account.
Expected output: post rows; each account's status is in RUN_SUMMARY.
Limit or cost note: one request per 20 posts, about 5 requests per minute.
Profiles
{"mode": "profiles","handles": ["realDonaldTrump", "WhiteHouse", "TeamTrump"]}
Expected output: one profile row per account with followersCount, postsCount, bio, createdAt.
Output
Results go to the default Dataset, with two views: Posts and Profiles. A run summary is saved as RUN_SUMMARY in the key-value store, and the Output tab links all three.
Output example
{"type": "post","id": "117435353994630003","url": "https://truthsocial.com/@realDonaldTrump/117435353994630003","inputHandle": "realDonaldTrump","account": {"id": "107780257626128497","username": "realDonaldTrump","displayName": "Donald J. Trump","url": "https://truthsocial.com/@realDonaldTrump","followersCount": 13111621,"followingCount": 69,"postsCount": 37168,"verified": true,"avatarUrl": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg"},"createdAt": "2026-10-13T19:54:55.085Z","editedAt": null,"text": "Don’t ever mess with nature! President DJT","contentHtml": "<p>Don’t ever mess with nature! President DJT</p>","language": "en","repliesCount": 791,"reblogsCount": 1825,"favouritesCount": 7100,"isReply": false,"inReplyToId": null,"inReplyToAccountId": null,"isReblog": false,"reblog": null,"isQuote": false,"quoteId": null,"quote": null,"sensitive": false,"spoilerText": null,"visibility": "public","pinned": false,"mentions": [],"hashtags": [],"media": [{"id": "117435345857080951","type": "video","url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/117/435/345/857/080/951/original/98bf6e8266e6ae0a.mp4","previewUrl": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/thumbnails/117/435/345/857/080/951/original/72433ae574eb1d6c.jpg","width": 1078,"height": 1148,"durationSecs": 41.563719,"description": null}],"card": null,"poll": null,"source": "truthsocial.com","fetchedAt": "2026-10-14T03:59:02Z"}
This is one full post row from the first input example. null means Truth Social has no value for this post (no edit, no quote, no link card).
Post fields
| Field | Meaning | Type | Can be empty? | Example / enum | Source / notes |
|---|---|---|---|---|---|
type | row type | string | no | post | |
id | post ID | string | no | 117435353994630003 | stable, use it to remove duplicates |
url | link to the post | string | no | https://truthsocial.com/@realDonaldTrump/117435353994630003 | |
inputHandle | the username you gave | string | no | realDonaldTrump | |
account | author: id, username, displayName, url, followersCount, followingCount, postsCount, verified, avatarUrl | object | no | see example | counts at fetch time |
createdAt | when it was posted (UTC) | string | no | 2026-10-13T19:54:55.085Z | ISO 8601 |
editedAt | when it was last edited | string | yes | null | null if never edited |
text | plain text of the post | string | can be "" | Don't ever mess with nature! | HTML removed, paragraphs kept; "" for media-only posts |
contentHtml | original post HTML | string | can be "" | <p>…</p> | |
language | language code | string | yes | en | set by Truth Social |
repliesCount, reblogsCount, favouritesCount | replies, ReTruths, likes | integer | no | 791, 1825, 7100 | at fetch time |
isReply, inReplyToId, inReplyToAccountId | reply details | boolean, string | IDs null if not a reply | false | |
isReblog, reblog | ReTruth flag and the original post (id, url, createdAt, text, account, counts, media) | boolean, object | reblog null if not a ReTruth | ||
isQuote, quoteId, quote | quoted post | boolean, string, object | null if no quote | ||
sensitive, spoilerText | content warning | boolean, string | spoilerText null | false | |
visibility | post visibility | string | no | public | |
pinned | pinned on the profile | boolean | no | false | |
mentions | mentioned accounts (id, username, url) | array | can be [] | ||
hashtags | hashtags without # | array | can be [] | ["news"] | |
media | images and videos: id, type, url, previewUrl, width, height, durationSecs, description | array | can be [] | type: image, video, gifv | direct file URLs |
card | link preview: url, title, description, type, providerName, imageUrl | object | yes | null if the post has no link card | |
poll | poll options and votes | object | yes | null if no poll | |
source | data source | string | no | truthsocial.com | |
fetchedAt | when the run read it (UTC) | string | no | 2026-10-14T03:59:02Z |
Profile fields
type (profile), id, username, url, inputHandle, displayName, bio (plain text), website, location, followersCount, followingCount, postsCount, verified, bot, locked, createdAt (join date), lastPostAt (date only, as Truth Social gives it), avatarUrl, headerUrl, fields (profile links: name, value), source, fetchedAt. website, location and lastPostAt can be null.
Run summary (RUN_SUMMARY)
| Field | Meaning |
|---|---|
status | COMPLETE, PARTIAL (stopped early, rows kept), ERROR (source failed, nothing saved) or INVALID_INPUT |
reason | why it stopped early: CHARGE_LIMIT, TIME_LIMIT, SOURCE_ERROR, ABORTED, or null |
message | the same text as the run status message |
handles[] | one entry per input (invalid usernames first, then the rest in input order): input, status (complete, partial, not_found, private, invalid, error, skipped), username, accountId, saved, newestPostAt, oldestPostAt, message |
postsSaved, profilesSaved, accountsChecked, statusCounts | counts |
settings, http | the settings used and request counters |
Output entities and surfaces
| Situation | Where | Result shape | User action |
|---|---|---|---|
| Normal | Dataset (Posts / Profiles view) | post or profile rows | open, export or call the API |
| Account not found, private or invalid | RUN_SUMMARY.handles[] | not_found, private, invalid with a message | check the username |
| No posts in the period | RUN_SUMMARY.handles[] | complete, saved: 0, message No posts in the selected period. | widen since |
| Stopped early | Dataset + RUN_SUMMARY | rows kept, PARTIAL with reason | raise the limit or timeout |
| Truth Social not answering | RUN_SUMMARY, run FAILED | ERROR or PARTIAL with SOURCE_ERROR | try again later |
Pricing
Pricing unit
You pay per event (Free plan prices; paid plans get lower post prices):
- Post — $0.0015 per saved post ($1.50 per 1,000). Bronze $0.0014, Silver $0.0013, Gold $0.00125.
- Account checked — $0.0025 per username that Truth Social answered about: found, not found or private. In profiles mode this is the price of the profile row.
Invalid usernames and skipped accounts are not charged, and neither is an account whose lookup failed because Truth Social did not answer. An account that was found is charged once even if reading its posts fails later. There is no start or finish fee. Platform usage is included.
Cost examples (Free plan prices)
| Scenario | Input scope | Events | Charge | Time |
|---|---|---|---|---|
| One account, latest posts | 1 username, 20 posts | 1 account + 20 posts | $0.0325 | a few seconds |
| Weekly check of 5 accounts | 5 usernames, since: "7 days", ~150 posts | 5 + 150 | about $0.24 | about 2 minutes |
| Deep history | 1 username, 1,000 posts | 1 + 1,000 | $1.5025 | about 14 minutes |
| Profiles | 10 usernames | 10 accounts | $0.025 | about 1–2 minutes |
| Nothing new | 5 usernames, no posts in the period | 5 accounts | $0.0125 | under a minute |
| Wrong usernames | 3 not found | 3 accounts | $0.0075 | under a minute |
Use cases
| Buyer job | Input path | Output entity | Key fields | Next integration |
|---|---|---|---|---|
| Daily monitoring of a few accounts | handles + since: "1 day" | post | createdAt, text, url, media | Schedule + webhook, Google Sheets |
| Engagement research | handles + maxPostsPerUser | post | favouritesCount, reblogsCount, repliesCount | CSV / Excel export |
| Account directory | mode: "profiles" | profile | followersCount, postsCount, bio, createdAt | API, spreadsheet |
| AI agent context | handles (small) | post | text, createdAt, url | MCP |
Scheduling and monitoring
Create a schedule (for example every hour) with since: "1 day" and a small maxPostsPerUser. Each run returns only recent posts; use id to remove posts you already have. An account with nothing new costs only the account check ($0.0025). If an account's last post is from a day before since, the Actor skips its timeline and makes only one request. Add a webhook or an integration to send new rows to Slack, a sheet or your own API when the run finishes.
Switching from another Truth Social scraper
Many Truth Social scrapers return the raw Mastodon-style JSON (created_at, favourites_count, media_attachments). This Actor returns the same data in camelCase with a few clean-ups:
| Raw field | This Actor |
|---|---|
content (HTML) | text (plain) and contentHtml |
created_at, replies_count, reblogs_count, favourites_count | createdAt, repliesCount, reblogsCount, favouritesCount |
media_attachments[] | media[] with url, previewUrl, durationSecs |
account{...} (40+ fields) | account{} with 9 useful fields |
tags[], mentions[] | hashtags[] (names), mentions[] |
in_reply_to_id, reblog, quote_id | isReply / inReplyToId, isReblog / reblog, isQuote / quoteId / quote |
Fields only useful to a logged-in user (favourited, bookmarked, muted, emojis and similar) are not included. One run can read up to 100 accounts.
API, export and integrations
- API: start the run with
POST https://api.apify.com/v2/acts/cliqtomedia~truth-social-scraper/runsand the input JSON; read rows from the run's Dataset (?view=postsor?view=profiles). - Export: JSON, CSV, Excel, XML or RSS from the Dataset.
- Webhooks / no-code: Apify integrations (Make, Zapier, Google Sheets, Slack) can send new rows when a run finishes.
Use with AI agents (MCP)
- MCP server with only this Actor:
https://mcp.apify.com?tools=cliqtomedia/truth-social-scraper. - Smallest useful input:
{"handles": ["realDonaldTrump"], "maxPostsPerUser": 20}. - Key fields:
text(what was posted),createdAt(when),url(link to cite),account.username(who),favouritesCount(engagement). - One account with 20 posts takes a few seconds and costs about $0.03. Larger requests are slow: about 5 requests (up to 100 posts) per minute.
Limits and partial results
Spending limit
If you set a maximum cost per run, the Actor stops before it goes over it: rows already saved stay in the Dataset, the run ends as SUCCEEDED with PARTIAL / CHARGE_LIMIT in RUN_SUMMARY, and the rest of the accounts are skipped.
Limits
- Up to 100 usernames per run, up to 2,000 posts per account (20 posts per request). 100 usernames with 20 posts each take about 40 minutes, within the default 1-hour timeout.
- About 5 requests per minute, as Truth Social allows; the Actor waits when Truth Social asks it to slow down.
- The default run timeout is 1 hour, enough for about 3,000–4,000 posts. If the timeout comes first, saved rows stay and the run is
PARTIAL/TIME_LIMIT.
Troubleshooting
The run takes long
Symptom: the run log shows Rate limited by truthsocial.com; waiting 60 s.
Reason: Truth Social allows only a few requests per minute, and the Actor waits instead of going around the limit.
Action: lower maxPostsPerUser or use since; split large lists into scheduled runs.
An account returns no posts
Check the account's entry in RUN_SUMMARY.handles: not_found (wrong username), private (locked account), invalid (not a username), or complete with No posts in the selected period. (widen since).
The run ends as PARTIAL with skipped accounts
Read reason: TIME_LIMIT (raise the run timeout or lower maxPostsPerUser), CHARGE_LIMIT (raise the maximum cost) or ABORTED. Saved rows stay in the Dataset.
The run fails with SOURCE_ERROR
Truth Social did not answer several requests (two in a row, or three in the whole run). Rows saved before the error stay in the Dataset. Try again later.
FAQ
Do I need a Truth Social account or cookies?
No. The Actor reads only public data that Truth Social shows to logged-out visitors.
Why can't it go faster?
Truth Social limits how often a visitor can ask for data. The Actor stays under that limit, about 5 requests (up to 100 posts) per minute, and waits when Truth Social asks.
Are the counts live?
Likes, ReTruths, replies and follower counts are as they were at fetchedAt. Run again to refresh them.
Is this data complete?
It is what the public API returns for the account's timeline, newest first, up to 2,000 posts. Deleted posts and posts of private accounts are not available.
Is scraping Truth Social allowed?
The Actor reads only public pages without login, at the rate Truth Social allows, and does not bypass any login or CAPTCHA. Truth Social's terms restrict automated collection and commercial use; you are responsible for how you collect, store and reuse the content, including personal data and authors' rights.
Learn more
- Truth Social: the source.
- Truth Social Terms of Service.
- Mastodon API: account statuses: the format Truth Social's public API follows.
- Apify pay-per-event pricing.
Related Actors
- Bluesky Scraper — the same kind of posts and profiles from Bluesky, also with no login.
Support
Use the Issues tab of this Actor for bugs, questions and feature requests. Include the run ID, the input and the error text. Never post tokens, cookies or private data.