Truth Social Scraper icon

Truth Social Scraper

Scrape public Truth Social profiles, posts, media, metrics, author data, and complete source objects using profile URLs, post URLs, or search queries.

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Truth Social Scraper at a glance

Truth Social Scraper is a ready-to-run Apify actor from abotapi for collecting social media data. Its documented output includes type, source url, post id, post url and content, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.20 per 1,000 results on the Apify Free plan and from $1.70 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Social Media, News, Developer Tools
Pricing
$2.20 per 1,000 results (Free plan), from $1.70 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
21 options
Run success
100.0% of completed public runs in the last 30 days

Scrape public Truth Social profiles, posts, media, metrics, author data, and complete source objects using profile URLs, post URLs, or search queries.

What Truth Social Scraper can do

  • URLs or handles, any shape. Add public profile, group or post URLs to the same list -- including the /with_replies and /media profile tabs and public group feeds (/group/) -- or skip URLs entirely and list plain @handle usernames; Profile content then picks profile metadata only, posts only, replies only, or both, per run.
  • Filters that save you money. Keep only posts with media, drop reposts, keep only posts newer than a date (paging stops as soon as it reaches older posts), or continue backwards from a given post.
  • Rich, normalized output across three dataset views. Convenience fields for content, engagement (likes, ReTruths, replies, upvotes and downvotes), author metadata, media, quoted posts, reposts and group posts -- split into posts, profiles and changes dataset views, plus the complete source account/status object so nothing nested is dropped.
  • Resume and scheduled monitoring, without re-paying. Point a new run at a previous run or dataset ID and it skips every post already saved there, or turn on Incremental mode to classify each post NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED against a remembered baseline so a recurring run reports only what changed.
  • Send results onward. Optional MCP connectors push a summary of each record into Notion, Linear, Airtable or Apify as soon as the scrape finishes.

Choose what to collect

These inputs let you configure Truth Social Scraper | Profiles, Posts & Search. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
startUrlsarrayPublic Truth Social profile, group or post URLs, any shape the site itself links to: a profile (https://truthsocial.com/@handle), its posts-and-replies or media tab (.../with_replies.../media), a public group (https://truthsocial.com/group/, returns the group's posts), or a post (.../@handle/posts/.../@handle/.../users//statuses/, or a group post .../group//posts/). A leading www. is accepted, but the https:// (or http://) scheme itself is required here -- Apify's own URL validator rejects a pasted link with no scheme before this Actor ever sees it. For a bare handle with no scheme at all, use Usernames below instead. Tag, search and trending pages, the groups directory and short links (links.truthsocial.com) need a signed-in account or a redirect and are skipped with a warning -- see the README's URL shapes table.
usernamesarrayOptional. Plain Truth Social handles, with or without a leading "@" (for example realDonaldTrump or @realDonaldTrump). Each one is turned into a profile fetch and merged into the same run as Profile or post URLs above -- use whichever is more convenient, or both. If Profile or post URLs holds only the example profile, it is skipped and just your usernames are scraped.
profileContentTypestringFor profile URLs, choose whether to return profile metadata only, posts only, replies only, or both posts and replies. A /with_replies or /media URL tab in the input overrides this setting. Ignored for post and group URLs (a group URL always returns the group's posts).

Choices: profileOnly, postsOnly, repliesOnly, postsAndReplies

maxPostsPerProfileintegerLeave 0 for no per-profile cap; the run stops at Max items. Fewer rows are returned when the profile has fewer public matching records.
onlyMediabooleanKeep only posts and replies that carry their own image or video, like the profile's Media tab. Reposts are left out, as on the site.
includeReblogsbooleanOn by default. Turn off to drop reposts of other people's posts and keep only the profile's own posts and replies.
postsNewerThanstringOptional. Keep only posts published on or after this date (for example 2026-10-01), or within a period counted back from the run start (for example 7 days). The run stops paging a profile as soon as it reaches older posts, so you only pay for what you keep. A repost counts from the moment it was reposted.
Show 14 more inputs
More input fields
InputWhat it controls
startFromIdstringOptional. Return only posts OLDER than this post, to continue backwards through a long history. Paste a post ID (the number at the end of a post URL) or the post URL itself.
maxItemsintegerThe only finite default cap. Maximum matching rows to save across the whole run; fewer rows are returned when selected inputs have fewer public matches.
maxPagesintegerNo page limit by default. Leave 0 for unlimited; the run stops at Max items.
includeRawbooleanKeep complete source account/status objects so no nested public field is dropped.
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a large profile pull without returning or charging for posts already collected there. Use this after an interrupted run, or when continuing a pull in another run. For recurring monitoring of the same profiles, use Incremental mode below instead.
incrementalModebooleanTurn this on for daily or recurring monitoring. The first run returns all matching posts as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED posts. Turn on "Emit unchanged" or "Emit expired" only when you also want those posts returned (and billed). State is kept separately for each startUrls/profile content setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the profile/post URLs and content type settings -- different profile sets then never mix state with each other.
peekbooleanPreview what changed since the last incremental run without saving the new baseline: the next run reports the same changes again. Off by default. Has no effect unless Incremental changes for scheduled runs is on.
emitUnchangedbooleanOff by default. Turn on to also return posts that have not changed since the last run, marked UNCHANGED. This returns -- and bills -- extra rows you already have, so leave it off unless you specifically want the full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return posts that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned every tracked profile -- not when Max items capped it or when Resume was used. This returns -- and bills -- extra synthetic rows, so leave it off unless you need expiry tracking.
ignoreFieldsForChangesarrayOptional. Field names to exclude from UPDATED change detection, in addition to the built-in handling (a poll's vote/voter tallies, each poll option's own vote count, and a closed poll's expired flag never trigger a false UPDATED by themselves -- they drift on their own as people keep voting, not because the post changed; the author's avatar and verified badge and the start URL a row came from are also left out of the diff). Matches a field name at any nesting depth (for example inside poll or inside each item of media). Ignored fields are still returned in the output. Use this if another field in your setup turns out to be noisy.
mcpConnectorsarrayOptionally send a compact summary into configured MCP connectors. The full dataset remains in Apify.
notionParentPageUrlstringRequired only when exporting to Notion.
maxNotifyListingsintegerMaximum items sent to each connector. Does not affect the Apify dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

recordTypeType (text)
sourceQuerySource URL (link)
postIdPost ID (text)
postUrlPost URL (link)
contentContent (text)
createdAtCreated (text)
authorUsernameAuthor (text)
authorDisplayNameAuthor name (text)
usernameUsername (text)
displayNameDisplay name (text)
urlProfile URL (link)
followersCountFollowers (number)
Show 32 more fields
followingCountFollowing (number)
statusesCountPosts (number)
repliesCountReplies (number)
reTruthsCountReTruths (number)
likesCountLikes (number)
upvotesCountUpvotes (number)
downvotesCountDownvotes (number)
pinnedPinned (boolean)
sponsoredSponsored (boolean)
quoteIdQuoted post ID (text)
quotedPostUrlQuoted post URL (link)
rebloggedFromUrlReposted from (link)
groupNameGroup (text)
authorFollowersCountAuthor followers (number)
hasMediaHas media (boolean)
mediaCountMedia count (number)
websiteWebsite (text)
locationLocation (text)
premiumPremium account (boolean)
isGroupAccountGroup account (boolean)
mediaUrlsMedia URLs (array)
tagsTags (array)
scrapedAtScraped at (text)
changeTypeChange type (text)
changedFieldsChanged fields (array)
firstSeenAtFirst seen (text)
lastSeenAtLast seen (text)
languageLanguage (text)
isReblogRepost (boolean)
bioBio (text)
verifiedVerified (boolean)
lockedLocked (boolean)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "recordType": "post",
  "sourceQuery": "https://truthsocial.com/@exampleuser",
  "postId": "113456789012345678",
  "id": "113456789012345678",
  "uri": "https://truthsocial.com/@exampleuser/113456789012345678",
  "postUrl": "https://truthsocial.com/@exampleuser/113456789012345678",
  "content": "Sample post text goes here.",
  "contentHtml": "<p>Sample post text goes here.</p>",
  "createdAt": "2026-08-01T12:00:00.000Z",
  "editedAt": null,
  "language": "en",
  "repliesCount": 42,
  "reTruthsCount": 15,
  "likesCount": 320,
  "favouritesCount": 320,
  "quotesCount": null,
  "inReplyToId": null,
  "sensitive": false,
  "visibility": "public",
  "isReblog": false,
  "rebloggedByAcct": null,
  "mediaUrls": [],
  "tags": [
    "sample"
  ],
  "mentions": [],
  "poll": null,
  "cardTitle": null,
  "cardUrl": null,
  "authorId": "900000000000000001",
  "authorUsername": "exampleuser",
  "authorAcct": "exampleuser",
  "authorDisplayName": "Example User",
  "authorUrl": "https://truthsocial.com/@exampleuser",
  "upvotesCount": 320,
  "downvotesCount": 4,
  "pinned": false,
  "sponsored": false,
  "quoteId": null,
  "authorAvatarUrl": "https://static-assets.truthsocial.com/avatar.jpg",
  "authorFollowersCount": 1200,
  "authorFollowingCount": 85,
  "authorPostsCount": 640,
  "authorVerified": false,
  "authorCreatedAt": "2022-02-01T00:00:00.000Z",
  "rebloggedFromUrl": null,
  "mediaCount": 0,
  "hasMedia": false,
  "mediaTypes": [],
  "mediaAttachments": [],
  "quotedPostUrl": null,
  "quotedPostContent": null,
  "quotedAuthorUsername": null,
  "groupId": null,
  "groupName": null,
  "groupUrl": null,
  "inReplyToUsername": null,
  "title": null,
  "version": "1",
  "editable": false,
  "rawStatus": {},
  "scrapedAt": "2026-09-29T00:00:00.000Z"
}

Ways to use this data

  • Political and public-figure monitoring: track a public account's posts, edits and removed content over time.
  • Media and journalism: pull post content, media and engagement metrics for reporting and fact-checking.
  • Brand and reputation monitoring: watch a brand or organization's Truth Social activity on a schedule.
  • Academic and social research: build datasets of public posts, engagement patterns and account metadata.
  • Content archiving: keep a running record of a profile's posts, including ones later edited or removed.
  • Competitive and market research: monitor announcements from organizations or public figures as they post.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Truth Social Scraper return?

The documented output for Truth Social Scraper includes type, source url, post id, post url, content, created, author and author name. Availability of each field depends on the source page and the selected mode.

How much does Truth Social Scraper cost?

It costs $2.20 per 1,000 results on the Apify Free plan and from $1.70 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Can I get only new or changed posts on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental changes for scheduled runs. Each run then returns only NEW and UPDATED posts by default (plus REAPPEARED once an earlier run with Emit expired posts on has marked one missing); UNCHANGED ones are suppressed and not billed unless emitUnchanged is on.

What's the difference between Resume and Incremental mode?

Resume (resumeFromRunId) continues one specific interrupted run using a pasted run or dataset ID. Incremental mode remembers its own baseline and is meant for running the same profile/post set repeatedly on a schedule. Combining the two is allowed only the first time you turn Incremental mode on for a state key; once that key has tracked state, a run using both fails instead of mixing the two mechanisms.

Is there a clean-text option?

You get both on every post: content is already plain text, and contentHtml keeps the original HTML. There is no "include muted" option either, because muting only exists for a signed-in account and never applies to anonymous scraping.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of each record into Notion, Linear or Airtable as soon as the run finishes.

Ready to collect with Truth Social Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.