Truth Social Scraper: Tools, Data Fields and a Python Workflow
A Truth Social scraper collects public posts and profiles from Truth Social, which has no public developer API. The main free tool is truthbrush, an open-source Python client whose maintained fork, w2rc/truthbrush, can read some public endpoints without logging in. A hosted API such as ScrapeIO returns profiles, user posts and single posts without a Truth Social account, at 1 credit a call.
Truth Social is built on Mastodon's code. Mastodon said so in October 2021, and Truth Social's public instance endpoint today reports version "3.4.1 (compatible; TruthSocial 1.0.0)". That is why every Truth Social scraper returns the same Mastodon-style fields. For the question of whether an official API exists, see Truth Social API options. This page is about tools, data and a working pipeline.
Truth Social scraper tools compared
| Tool | Language | Login needed | What it reads | Status on 9 November 2026 |
|---|---|---|---|---|
| truthbrush (w2rc fork) | Python, Apache-2.0 | For most commands; --no-auth runs public endpoints only | Users, statuses, search, trends, tags, groups, ads, likes, comments | Active, last push 2 November 2026, 405 stars |
| truthbrush (original) | Python | Same | Same | Archived; points to the fork |
| untruthr | R, MIT | Yes, a Truth Social account | Authenticated access; the README is labeled experimental | Last push December 2022 |
| A hosted data API | Any HTTP client | No | Profiles, user posts, single posts | Maintained by the vendor |
truthbrush's README warns that which endpoints are public is decided by Truth Social and may change. Calls that need a login return an error, typically HTTP 401, in public mode.
What data you can collect
Because the platform speaks Mastodon's API, a public post follows Mastodon's Status format and a profile follows its Account format. The fields that matter for research:
| Object | Field | What it holds |
|---|---|---|
| Post | id, url, created_at | Unique id, link, UTC time |
| Post | content | The text, as HTML |
| Post | replies_count, reblogs_count, favourites_count | Replies, ReTruths and likes |
| Post | reblog, in_reply_to_id, quote | Whether it reposts, replies to or quotes another post |
| Post | media_attachments, card, poll | Images and video, link previews, polls |
| Post | mentions, tags, edited_at | Accounts named, hashtags, last edit time |
| Profile | username, display_name, note | Handle, name, bio (HTML) |
| Profile | followers_count, following_count, statuses_count | Audience and output size |
| Profile | created_at, avatar, header | Join date and images |
Truth Social can add or drop fields at any time, so check a live response before you lock a schema.
Sample workflow: a 30-day CSV archive with truthbrush
This script pulls the last 30 days of posts for a list of accounts and writes one clean row per post. It uses truthbrush's pull_statuses, which pages back from the newest post and stops at created_after.
import csv, html, re
from datetime import datetime, timedelta, timezone
from truthbrush import Api
api = Api(require_auth=False) # public endpoints only
since = datetime.now(timezone.utc) - timedelta(days=30)
handles = ["realDonaldTrump"]
def plain(s):
return html.unescape(re.sub(r"<[^>]+>", " ", s or "")).strip()
with open("truth_posts.csv", "w", newline="") as f:
w = csv.writer(f)
w.writerow(["handle", "id", "created_at", "url", "text", "replies",
"retruths", "likes", "is_retruth", "reply_to", "pulled_at"])
for h in handles:
for p in api.pull_statuses(username=h, created_after=since):
w.writerow([h, p["id"], p["created_at"], p.get("url"), plain(p.get("content")),
p.get("replies_count"), p.get("reblogs_count"), p.get("favourites_count"),
p.get("reblog") is not None, p.get("in_reply_to_id"), p.get("_pulled")])
If Truth Social gates the statuses endpoint on the day you run it, truthbrush returns an error in public mode. You can then log in with your own account, as its README describes, or use an API.
Data quality checklist
- Strip HTML from
contentandnotebefore counting words or running sentiment. - Count ReTruths once. A repost carries the original in
reblog; analyze the original's id, not the wrapper's. - Store ids as text. Mastodon ids are strings and too large for some tools' number types.
- Keep UTC.
created_atis UTC; convert only for display. - Record when you pulled. Counts keep changing, so a like count without a capture time is not a fact.
- Track edits. A non-empty
edited_atmeans the text you stored may not be the first version.
The same pipeline as API calls
- Get the account: the Truth Social profile API with
handle. - Backfill posts: the Truth Social user posts API with
handleoruser_id. Passnext_max_idfrom each answer to get the next, older page, and stop when posts fall before your start date. - Re-read single posts by URL with the Truth Social post API, for example to refresh counts a day later.
curl "https://scrapeio.com/v1/truthsocial/user/posts?handle=realDonaldTrump" \
-H "x-api-key: YOUR_KEY"
Budget: calls scale with pages, not posts. One profile call plus one call per page of posts is the whole cost. Ten accounts with five pages each is 60 calls, about $0.11 at the Starter rate of $1.88 per 1,000 credits.
Responsible use
Collect public posts and profiles only, and quote accurately with a link to the original. We could not read Truth Social's terms page today because it needs JavaScript, so read it yourself before you collect. This guide does not cover getting around blocks or rate limits; if a source stops answering, slow down or use a different route.
This is not legal advice. Terms and law change, and the answer depends on where you are and what you do with the data.
Doing it with ScrapeIO
ScrapeIO's three Truth Social endpoints need no Truth Social account and cost 1 credit a call; failed and not-found calls are free. They are listed on the Truth Social platform page, and AI agents can call them through the Truth Social MCP server. For ready-made projects, see the playbooks for crisis monitoring and academic research.
FAQ
Does Truth Social have an API?
Not a public developer API with keys and documentation. Its servers speak a Mastodon-compatible API, which is what open-source scrapers read.
Can I scrape Truth Social without an account?
Partly. truthbrush's --no-auth mode reads whatever Truth Social leaves public, which can change. A hosted API needs only its own key.
What data can a Truth Social scraper collect?
Post text, time, link, replies, ReTruths, likes, media, mentions, hashtags and edit time, plus profile name, bio, follower, following and post counts.
Is scraping Truth Social legal?
It depends on your country, your purpose and Truth Social's terms. Stick to public data and get legal advice for commercial use.
Sources
Checked on 9 November 2026 from each vendor's own pages. Prices and limits change; follow the links before you decide.
- https://github.com/w2rc/truthbrush
- https://github.com/stanfordio/truthbrush
- https://github.com/favstats/untruthr
- https://blog.joinmastodon.org/2021/10/trumps-new-social-media-platform-found-using-mastodon-code/
- https://truthsocial.com/api/v1/instance
- https://docs.joinmastodon.org/entities/Status/
- https://docs.joinmastodon.org/entities/Account/
100 free credits, no card. Credits never expire.
Get API key