Truth Social Posts Scraper
Pricing
from $2.00 / 1,000 results
Truth Social Posts Scraper
Scrape public posts from any Truth Social account by handle: text, media, reply and repost links, and engagement counts. No login, no browser.
Pricing
from $2.00 / 1,000 results
Rating
0.0
(0)
Developer
Farhan Febrian Nauval
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
21 hours ago
Last modified
Categories
Share
Truth Social Posts Scraper — Timelines, Media & Engagement by Handle
Scrape any public Truth Social account's posts: text, media, quote/repost links, hashtags and engagement counts, plus the author's profile on every row. HTTP-only, no account, no browser.
Input
| Field | Type | Default | Description |
|---|---|---|---|
profiles | array | required | realDonaldTrump, @realDonaldTrump, or https://truthsocial.com/@realDonaldTrump |
maxPostsPerProfile | integer | 100 | Posts per account; costs about this ÷ 20 requests |
excludeReplies | boolean | false | Drop posts replying to someone else |
onlyMedia | boolean | false | Keep only posts with an image or video |
Output
One row per post. The author block repeats on every row so the dataset stands on its own.
{"_input": "https://truthsocial.com/@realDonaldTrump","_source": "S1-mastodon-api","_scrapedAt": "2026-09-09T09:41:02Z","postId": "117238707792033610","url": "https://truthsocial.com/@realDonaldTrump/117238707792033610","createdAt": "2026-09-09T02:25:12.159Z","contentHtml": "<p>…</p>","text": "…", // plain text; "" on an image-only post"language": "en", "visibility": "public", "sensitive": false,"repliesCount": 480, "reblogsCount": 1431,"favouritesCount": 6399, "upvotesCount": 6399, "downvotesCount": 0,"isReply": false, "inReplyToId": null, "inReplyToAccountId": null,"isRepost": false, "repostOfId": null, "repostOfHandle": null,"quoteId": null,"mediaAttachments": [{ "type": "image", "url": "…", "previewUrl": "…", "description": null }],"mediaCount": 1,"cardUrl": "…", "cardTitle": "…","tags": [], // as the API reports it — see below"hashtags": ["NYSE", "YorkvilleAmerica"], // read from the text"mentions": ["someone"],"authorId": "107780257626128497", "authorHandle": "realDonaldTrump","authorDisplayName": "Donald J. Trump", "authorVerified": true,"authorFollowers": 13040677, "authorFollowing": 71, "authorStatusesCount": 36517,"authorNote": "…", "authorAvatar": "…", "authorWebsite": "www.DonaldJTrump.com","authorLocation": "", "authorCreatedAt": "…"}
Three things worth knowing
tags is unreliable, so hashtags is derived separately. A post reading
#NYSE #YorkvilleAmerica came back with tags: [] while another populated tags correctly — two
of the three tagged posts in one sample disagreed with their own text. Both fields ship: tags
exactly as the API reports it, hashtags read out of the post text. Use hashtags unless you
specifically want the site's own answer.
Page sizes vary, and a short page does not mean the end. One account returned 18, then 9, then 20, then 14 items per page — the server drops items after paginating. Treating a short page as the end of the timeline silently truncates: on that account it stopped at 18 posts out of 1368. This actor pages until a page comes back empty or the cursor stops advancing.
Empty text is data. Image-only posts have a body of literally <p></p>. That is a real post
with no words, not a parse failure — check mediaCount rather than assuming a blank row is broken.
Scope
Truth Social runs a Mastodon fork, and only part of that API is open anonymously. Available:
account lookup by handle, and an account's own posts. Not available (all answer 401):
followers, following, /api/v1/trends, trending truths and search. Hashtag timelines answer 200
with an empty list for every tag tried, so they are treated as closed too.
Errors
Every input yields at least one row, so a join against your input list stays aligned.
_error | Meaning |
|---|---|
invalid_input | Not a Truth Social handle or profile URL |
profile_not_found | 404 — no account with that handle |
no_posts | The account exists but returned no public posts |
page_failed | A page failed mid-timeline; earlier posts are still in the dataset |
blocked | Every TLS profile was refused |
unexpected_shape | Lookup returned 200 with no account id — the API contract changed |
If every input fails, the run itself fails rather than reporting success over an empty dataset.
Proxies and rate limits
Residential proxies are required. Apify's shared datacenter pool was refused with HTTP 403 on
all four TLS profiles; residential succeeds. The input schema defaults to residential accordingly.
Truth Social limits per IP hard — roughly ten plain requests earns a 429 carrying
retry-after: 9. The actor paces its calls, honours that header exactly rather than guessing, and
takes a fresh proxy exit IP per request so a run spreads across addresses instead of walking one
into the limit. A 429 retries the same TLS fingerprint rather than burning a rung of the ladder,
since a rate limit says nothing about the fingerprint.