Truth Social Posts Scraper avatar

Truth Social Posts Scraper

Pricing

from $2.00 / 1,000 results

Go to Apify Store
Truth Social Posts Scraper

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

Farhan Febrian Nauval

Maintained by Community

Actor 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

FieldTypeDefaultDescription
profilesarrayrequiredrealDonaldTrump, @realDonaldTrump, or https://truthsocial.com/@realDonaldTrump
maxPostsPerProfileinteger100Posts per account; costs about this ÷ 20 requests
excludeRepliesbooleanfalseDrop posts replying to someone else
onlyMediabooleanfalseKeep 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.

_errorMeaning
invalid_inputNot a Truth Social handle or profile URL
profile_not_found404 — no account with that handle
no_postsThe account exists but returned no public posts
page_failedA page failed mid-timeline; earlier posts are still in the dataset
blockedEvery TLS profile was refused
unexpected_shapeLookup 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.