Truth Social Scraper - Posts & Profiles, No Login avatar

Truth Social Scraper - Posts & Profiles, No Login

Pricing

from $1.25 / 1,000 posts

Go to Apify Store
Truth Social Scraper - Posts & Profiles, No Login

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

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

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.

Truth Social Scraper: usernames, profile URLs and a date filter in; full post data and clean rows out. No login.

Table of contents

What it does

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

Good fit

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

Not a fit / limits

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

Quick start

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

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

Input

Input fields

FieldPlain nameTypeRequiredDefault / prefillAllowed valuesEffectExampleRecommendation
handlesUsernames or profile URLsarray of stringsyesprefill ["realDonaldTrump"]1–100 items: name, @name or https://truthsocial.com/@namewhich accounts to read["WhiteHouse", "@TeamTrump"]Repeats are skipped; invalid items are reported and the rest still run.
modeWhat to scrapestringnopostsposts, profilesposts of each account, or one profile row per account"profiles"Use profiles for follower counts and bios only.
maxPostsPerUserMax posts per accountintegernodefault 20, prefill 201–2000how many of the newest posts per account200Keep it small for frequent runs; each 20 posts is one request.
sinceOnly posts sincestringnoempty (no date limit)date 2026-10-01, date-time 2026-10-01T12:00:00Z, or 12 hours, 7 days, 2 weeksskips older posts and stops reading the account there"7 days"Best way to keep monitoring runs short.
includeRepliesInclude repliesbooleannofalsetrue / falseadds the account's replies to other poststrueLeave off for original posts only.
includeReblogsInclude ReTruthsbooleannotruetrue / falseadds ReTruths (reposts of other people's posts)falseTurn 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

WhenInput AInput BEffective behaviorExampleCost/result effect
Both setmaxPostsPerUsersincereading stops at whichever comes first200 and "1 day"fewer posts and requests
Posts mode onlymode: "profiles"maxPostsPerUser, since, include*post settings are ignoredprofiles of 10 accountsone row per account
Pinned postssince—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

FieldMeaningTypeCan be empty?Example / enumSource / notes
typerow typestringnopost
idpost IDstringno117435353994630003stable, use it to remove duplicates
urllink to the poststringnohttps://truthsocial.com/@realDonaldTrump/117435353994630003
inputHandlethe username you gavestringnorealDonaldTrump
accountauthor: id, username, displayName, url, followersCount, followingCount, postsCount, verified, avatarUrlobjectnosee examplecounts at fetch time
createdAtwhen it was posted (UTC)stringno2026-10-13T19:54:55.085ZISO 8601
editedAtwhen it was last editedstringyesnullnull if never edited
textplain text of the poststringcan be ""Don't ever mess with nature!HTML removed, paragraphs kept; "" for media-only posts
contentHtmloriginal post HTMLstringcan be ""<p>…</p>
languagelanguage codestringyesenset by Truth Social
repliesCount, reblogsCount, favouritesCountreplies, ReTruths, likesintegerno791, 1825, 7100at fetch time
isReply, inReplyToId, inReplyToAccountIdreply detailsboolean, stringIDs null if not a replyfalse
isReblog, reblogReTruth flag and the original post (id, url, createdAt, text, account, counts, media)boolean, objectreblog null if not a ReTruth
isQuote, quoteId, quotequoted postboolean, string, objectnull if no quote
sensitive, spoilerTextcontent warningboolean, stringspoilerText nullfalse
visibilitypost visibilitystringnopublic
pinnedpinned on the profilebooleannofalse
mentionsmentioned accounts (id, username, url)arraycan be []
hashtagshashtags without #arraycan be []["news"]
mediaimages and videos: id, type, url, previewUrl, width, height, durationSecs, descriptionarraycan be []type: image, video, gifvdirect file URLs
cardlink preview: url, title, description, type, providerName, imageUrlobjectyesnull if the post has no link card
pollpoll options and votesobjectyesnull if no poll
sourcedata sourcestringnotruthsocial.com
fetchedAtwhen the run read it (UTC)stringno2026-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)

FieldMeaning
statusCOMPLETE, PARTIAL (stopped early, rows kept), ERROR (source failed, nothing saved) or INVALID_INPUT
reasonwhy it stopped early: CHARGE_LIMIT, TIME_LIMIT, SOURCE_ERROR, ABORTED, or null
messagethe 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, statusCountscounts
settings, httpthe settings used and request counters

Output entities and surfaces

SituationWhereResult shapeUser action
NormalDataset (Posts / Profiles view)post or profile rowsopen, export or call the API
Account not found, private or invalidRUN_SUMMARY.handles[]not_found, private, invalid with a messagecheck the username
No posts in the periodRUN_SUMMARY.handles[]complete, saved: 0, message No posts in the selected period.widen since
Stopped earlyDataset + RUN_SUMMARYrows kept, PARTIAL with reasonraise the limit or timeout
Truth Social not answeringRUN_SUMMARY, run FAILEDERROR or PARTIAL with SOURCE_ERRORtry 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)

ScenarioInput scopeEventsChargeTime
One account, latest posts1 username, 20 posts1 account + 20 posts$0.0325a few seconds
Weekly check of 5 accounts5 usernames, since: "7 days", ~150 posts5 + 150about $0.24about 2 minutes
Deep history1 username, 1,000 posts1 + 1,000$1.5025about 14 minutes
Profiles10 usernames10 accounts$0.025about 1–2 minutes
Nothing new5 usernames, no posts in the period5 accounts$0.0125under a minute
Wrong usernames3 not found3 accounts$0.0075under a minute

Use cases

Buyer jobInput pathOutput entityKey fieldsNext integration
Daily monitoring of a few accountshandles + since: "1 day"postcreatedAt, text, url, mediaSchedule + webhook, Google Sheets
Engagement researchhandles + maxPostsPerUserpostfavouritesCount, reblogsCount, repliesCountCSV / Excel export
Account directorymode: "profiles"profilefollowersCount, postsCount, bio, createdAtAPI, spreadsheet
AI agent contexthandles (small)posttext, createdAt, urlMCP

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 fieldThis Actor
content (HTML)text (plain) and contentHtml
created_at, replies_count, reblogs_count, favourites_countcreatedAt, 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_idisReply / inReplyToId, isReblog / reblog, isQuote / quoteId / quote

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

API, export and integrations

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

Use with AI agents (MCP)

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

Limits and partial results

Spending limit

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

Limits

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

Troubleshooting

The run takes long

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

An account returns no posts

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

The run ends as PARTIAL with skipped accounts

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

The run fails with SOURCE_ERROR

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

FAQ

Do I need a Truth Social account or cookies?

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

Why can't it go faster?

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

Are the counts live?

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

Is this data complete?

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

Is scraping Truth Social allowed?

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

Learn more

  • 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.