Truth Social

How to scrape Truth Social data with an API (2026)

DIY scrapers vs Truth Social's app vs a data API for public profiles and posts — tradeoffs and runnable code.

Social FetchUpdated

How to scrape Truth Social data with an API (2026)

DIY scrapers vs Truth Social's app vs a data API for public profiles and posts — tradeoffs and runnable code.

There are three ways to pull public Truth Social data into a product: run your own HTTP or browser scraper, use Truth Social's first-party app for account workflows, or call a Truth Social data API that hands back normalized JSON. Truth Social's app is for posting and account management — not a general "look up this public handle from my backend" tool. A DIY client is a maintenance treadmill of auth, pagination, and field drift. For most teams, a data API is the pragmatic way to get public profiles and posts as clean JSON. This guide compares all three — what each one really costs, where it breaks, and which one fits your project — with runnable code for the Social Fetch path.

The shortest path is a single request:

Request
curl -sS \
  -H "x-api-key: $SOCIALFETCH_API_KEY" \
  "https://api.socialfetch.dev/v1/truthsocial/profiles/realDonaldTrump"

You'll need an API key and curl or the TypeScript SDK. New to the API? Start with the Quickstart.

The three ways to get Truth Social data

Every approach is some version of these three. The right one depends on volume, who's using the data, and how much maintenance you want to own.

ApproachBest whenThe real cost
DIY (HTTP / Playwright)A one-off research pull, internal tooling, or you specifically want to own the pipelineSession babysitting, field drift, and re-fixing every time public pages change
Truth Social first-partyYou need to publish, DM, or manage an accountApp UX only — not a metered enrichment API for arbitrary public handles
Data API (Social Fetch)You need profiles and posts in product code now, ideally across more than one platformMetered per completed lookup; you depend on a provider to keep the scrapers working

For most production apps that need public Truth Social data on demand, the data API is the fastest route to reliable JSON — one REST surface across Truth Social, Instagram, X, and Telegram, with the same auth header and the same data + meta envelope. DIY is genuinely worth it for a weekend research scrape or to learn the internals. First-party is the right call when you're posting or managing an account.

Why DIY clients turn into a maintenance project

A plain fetch() to a public Truth Social URL can work until it doesn't — login walls, rate limits, and response shape changes show up without a changelog. Homegrown clients can get you through a weekend research pull, but your product still needs typed misses, a stable error envelope, and a support id when a customer files a ticket.

Around a DIY client you're standing up:

  • Auth and session handling if you lean on logged-in surfaces instead of public pages.
  • Pagination quirks that differ from the rest of your marketplace parsers.
  • Field drift when presentation or metrics keys move.
  • A second vendor story if everything else already runs through one Social Fetch key.

The build is the easy part. The maintenance is worse: a scraper that looked solid in staging drifts in production. For a one-off pull that's a fine weekend. For anything customer-facing, you've signed up for a maintenance subscription paid in your own evenings. For the broader build-vs-buy math, see Social Fetch vs DIY scraping.

Why the official app won't cover enrichment

Truth Social's own product is the right answer when your workflow lives inside the app — publishing, notifications, DMs, or account settings. None of these are a general "look up this public handle from my CRM" tool:

  • Posting and account management require a user session and Truth Social's product surface.
  • Partner or first-party APIs (when available) are for authorized write and account flows — not arbitrary public enrichment for every handle in your database.
  • Browser automation against the logged-in UI reintroduces the DIY maintenance tax.

So if you need web-parity public data in a generic backend, the official app leaves a gap by design. Reach for first-party tools when your use case maps to writing or owning an account; reach for a data API when it doesn't.

Using the Social Fetch API

Social Fetch exposes Truth Social under documented /v1/truthsocial/** routes — profile by handle, cursor-paginated profile posts, and a single post by public status URL. One header authenticates every call, and responses share the same data + meta envelope across platforms, so your Truth Social code looks identical to your Instagram or Telegram code.

Request
TypeScript
const = await client.tiktok.({
handle: "charlidamelio",
});
if (result.ok) {
const { profile } = result.value.data;
}
Response
JSON
{
"data": {
"lookupStatus": ,
"profile": {
"handle": "charlidamelio",
"displayName": "Charli D'Amelio",
},
"metrics": {
"followers": 155200000
}
},
"meta": {
"creditsCharged":
}
}

Hover underlined tokens for details.

Get a profile

The same lookup in cURL, the TypeScript SDK, Python, and more — switch tabs to match your stack:

Request
const response = await fetch(
  "https://api.socialfetch.dev/v1/truthsocial/profiles/realDonaldTrump",
  {
    headers: {
      "x-api-key": process.env.SOCIALFETCH_API_KEY,
    },
  }
);

const body = await response.json();

console.log(response.status, body);

Truth Social profile lookups are credit-metered when the lookup completes (including not_found outcomes that still return HTTP 200). Trust meta.creditsCharged on every response. Pass the public username with or without @.

List a profile's posts

Request
const response = await fetch(
  "https://api.socialfetch.dev/v1/truthsocial/profiles/realDonaldTrump/posts",
  {
    headers: {
      "x-api-key": process.env.SOCIALFETCH_API_KEY,
    },
  }
);

const body = await response.json();

console.log(response.status, body);

Full parameters live in the reference: Get Truth Social profile and Profile posts. Each completed page is a separate credit charge.

Get a single post by URL

When you already have a public status permalink, hydrate it directly:

Request
const params = new URLSearchParams({"url":"https://truthsocial.com/@realDonaldTrump/posts/114000000000000000"});

const response = await fetch(
  `https://api.socialfetch.dev/v1/truthsocial/posts?${params.toString()}`,
  {
    headers: {
      "x-api-key": process.env.SOCIALFETCH_API_KEY,
    },
  }
);

const body = await response.json();

console.log(response.status, body);

Docs: Get Truth Social post.

Paginate through posts

Profile post list endpoints return one page plus an opaque cursor. To pull older posts, pass the cursor back verbatim until hasMore is false — no decoding, no arithmetic:

Example
typescript
import { SocialFetchClient } from "@socialfetch/sdk";

const client = new SocialFetchClient({
  apiKey: process.env.SOCIALFETCH_API_KEY!,
});

const allPosts = [];
let cursor: string | undefined;

do {
  const result = await client.truthsocial.getProfilePosts({
    handle: "realDonaldTrump",
    cursor,
  });

  if (!result.ok) {
    console.error(result.error.code, result.error.requestId);
    break;
  }

  if (result.value.data.lookupStatus !== "found") {
    console.warn(result.value.data.lookupStatus);
    break;
  }

  allPosts.push(...(result.value.data.posts ?? []));
  cursor = result.value.data.hasMore
    ? (result.value.data.cursor ?? undefined)
    : undefined;
} while (cursor);

Stop when data.hasMore is false or data.cursor is null. Don't invent page numbers. The cursor is the source of truth. Each page is a separate completed lookup for billing.

Reading the response

A successful response wraps the payload alongside billing metadata, so you always know what a call cost:

Response
json
{
  "data": {
    "lookupStatus": "found",
    "profile": {
      "platform": "truthsocial",
      "handle": "realDonaldTrump",
      "displayName": "Donald J. Trump",
      "profileUrl": "https://truthsocial.com/@realDonaldTrump",
      "isVerified": true,
      "isLocked": false,
      "isBot": false,
      "metrics": {
        "followers": 12928913,
        "following": 69,
        "posts": 35171
      }
    }
  },
  "meta": {
    "requestId": "req_01example",
    "creditsCharged": 1,
    "version": "v1"
  }
}

The one gotcha: an HTTP 200 does not guarantee lookupStatus: "found". A missing handle or deleted status can return 200 with not_found — handle it in application logic, not by trusting the status code. Every response also carries meta.requestId, so if a number ever looks wrong, support can trace the exact lookup. See Errors and Credits.

What you can build

  • Political and news monitors — hydrate high-signal Truth Social accounts that often do not mirror the same text on X or Facebook.
  • CRM / enrichment jobs — resolve handles before outreach or brand-safety review, then page posts only for accounts you still care about.
  • Agent and MCP workflows — call the same typed tools from Cursor or Claude with the same credit metering as REST.

For vendor shopping without implementation detail, see Best Truth Social APIs & scrapers in 2026. For listening dashboards across networks, see Social listening dashboard.

FAQ

It depends on your jurisdiction, what you collect, and how you use it. Collecting publicly visible profile and status data for B2B analytics is a common pattern. You remain responsible for Truth Social's terms, applicable privacy law, and your own contracts. This is a technical guide, not legal advice — talk to counsel if you're collecting at scale.

Can't I just use Truth Social's app or scrape the site myself?

Use the official app for posting and account management. DIY HTTP or browser clients can work for personal scripts, but you own maintenance. For public enrichment in a multi-platform backend, a data API is the usual fit. See Why the official app won't cover enrichment.

How fresh is the data?

Each request fetches live at call time — there's no cache returning an hour-old snapshot. If a number looks off, meta.requestId lets support trace that specific lookup.

What happens if a profile doesn't exist?

Check data.lookupStatus. Don't treat a 200 alone as "data is present" — a missing handle returns 200 with not_found. Details in Errors.

How are credits charged?

Credits charge when a lookup completes, including 200 outcomes like not_found. Each Truth Social profile, profile-posts page, and post lookup is credit-metered. Validation failures and upstream lookup_failed / temporary unavailability do not bill the same way — see Credits. Always reconcile against meta.creditsCharged.

How does this compare to other providers?

See Best Truth Social APIs & scrapers in 2026, plus vs Apify, vs Bright Data, and the full compare hub.


Ready to try it? Get an API key — new accounts include 100 free credits. Platform hub: /platforms/truthsocial.