Search interest in a Truth Social API is a request for profiles and posts as JSON. SocialScrape serves that with two GET routes. This is not an official Truth Social developer product. You send a SocialScrape key in the x-api-key header. Keys are described in authentication.
Profile
GET /v1/truthsocial/profile requires handle, with or without @. username is an alias. Accounts that do not exist answer not_found. A bad parameter is invalid_params. Neither is retryable.
The recorded request uses a handle.
1curl -G "https://api.socialscrape.dev/v1/truthsocial/profile" \2 -H "x-api-key: $SOCIALSCRAPE_API_KEY" \3 --data-urlencode "handle=realDonaldTrump"1import os2import requests34params = {5 "handle": "realDonaldTrump",6}7res = requests.get(8 "https://api.socialscrape.dev/v1/truthsocial/profile",9 headers={"x-api-key": os.environ["SOCIALSCRAPE_API_KEY"]},10 params=params,11)12body = res.json()1314if body["ok"]:15 print(body["data"])16else:17 print(body["error"]["code"], body["error"]["message"])1const url = new URL("https://api.socialscrape.dev/v1/truthsocial/profile");2url.search = new URLSearchParams({3 "handle": "realDonaldTrump"4}).toString();5const res = await fetch(url, {6 headers: { "x-api-key": process.env.SOCIALSCRAPE_API_KEY! },7});8const body = await res.json();910if (body.ok) {11 console.log(body.data);12} else {13 console.error(body.error.code, body.error.message);14}data- is a profile.
platformistruthsocial. The shared fields areid,handle,name,headline,url,bio,avatar_url,banner_url,verified,is_private,external_url,links,location,categoryandcreated_at. Null means the page did not include that value. stats.followers,stats.followingandstats.posts- are the counts.
stats.likesandstats.viewsare null when the profile has no such numbers. Do not store null as zero. extra- on the recorded profile includes
accepting_messages,acct,is_bot,is_group,is_premium,is_tv_accountandlast_status_at.idon the profile is the numeric user id. Keep it. The posts endpoint can take that id and skip a second lookup.
Sample. The recorded response is shortened. Counts in it are the sample.
Posts
GET /v1/truthsocial/profile/posts lists the account's own posts, newest first. ReTruths are left out. Send handle or id. One of them is required. id is the numeric user id from the profile. user_id aliases id. cursor pages.
1curl -G "https://api.socialscrape.dev/v1/truthsocial/profile/posts" \2 -H "x-api-key: $SOCIALSCRAPE_API_KEY" \3 --data-urlencode "handle=realDonaldTrump"1import os2import requests34params = {5 "handle": "realDonaldTrump",6}7res = requests.get(8 "https://api.socialscrape.dev/v1/truthsocial/profile/posts",9 headers={"x-api-key": os.environ["SOCIALSCRAPE_API_KEY"]},10 params=params,11)12body = res.json()1314if body["ok"]:15 print(body["data"])16else:17 print(body["error"]["code"], body["error"]["message"])1const url = new URL("https://api.socialscrape.dev/v1/truthsocial/profile/posts");2url.search = new URLSearchParams({3 "handle": "realDonaldTrump"4}).toString();5const res = await fetch(url, {6 headers: { "x-api-key": process.env.SOCIALSCRAPE_API_KEY! },7});8const body = await res.json();910if (body.ok) {11 console.log(body.data);12} else {13 console.error(body.error.code, body.error.message);14}Each item is a post: id, url, text, published_at, author, media, stats. stats.likes, stats.comments and stats.shares are filled when the post has them. stats.views and stats.saves are null when absent.
Truth Social's own votes are not squeezed into likes. They are extra.upvotes and extra.downvotes. extra also has card, links and visibility.
data.cursor and data.has_more, and the same fields on the envelope, control paging. Pass cursor back unchanged until has_more is false. Each page is 1 credit. The loop is in pagination. parent is the account.
One post by URL is GET /v1/truthsocial/post. The parameter is url, shaped like truthsocial.com/@user/<id>. That response is a single post with the same stat and extra fields. Use it when you already have a link and do not need the feed.
Cost
Profile: 1 credit. Each page of posts: 1 credit. A single post: 1 credit. All three are cacheable for 30 days. Send max_age_days (0 to 30) to take a cached copy for 0 credits.
Failures cost 0. New accounts get 100 credits once, no card. Pack and plan prices are on pricing. How plan credits and pack credits are spent is in credits.
Limits
You get posts the account published, without ReTruths. You do not get a private account, a follower list, or a full-text search of the network from these two routes. If the profile is not_found, stop.
Paging stops when has_more is false. That means this feed ended, not that every historical post on the internet was collected.
visibility in extra is the value the payload carries. Do not infer a second privacy model on top of it.
Packs and plans have no rate limits; free accounts have a lower one. 429 rate_limited is free and retryable. See rate limits and errors.
The shape may gain fields. Missing fields stay null.
Next
Profile: Truth Social profile API, tutorial, reference. Posts: profile posts API, tutorial, reference. The hub is the Truth Social API.
The same profile-then-feed pattern on Bluesky is Get a Bluesky profile and its posts. On Threads it is Get Threads profiles, posts and search.