LurkAPI
Docs · User posts

User posts

An account's latest posts and ReTruths, newest first, 20 per page.

1 credit per callFresh within 2 minutesMCP tool: truthsocial_user_posts
GEThttps://api.lurkapi.com/v1/truthsocial/user/posts

Example responseView as markdown

When to use this

Use it to monitor an account: every post with text, media, link previews and reply, ReTruth and like counts. Replies are left out; ReTruths are included, with the original post in reblog.

Pass handle or user_id (from profile). user_id skips a lookup, but both cost 1 credit.

Pagination. Pass the response's next_max_id back as next_max_id (with the same account) for older posts. It's null once a page comes back empty.

Unknown accounts return 404 not_found. Accounts explicitly hidden from logged-out visitors return 403 not_public. When the upstream cannot distinguish a hidden account from a missing one, the response is 404 not_found. Prominent accounts and most other public ones are visible.

Parameters

All parameters go in the query string.

ParameterDescription
handle
stringoptional
Username (e.g. realDonaldTrump), @username or profile URL. Required unless you pass user_id.
Example
realDonaldTrump
user_id
stringoptional
Numeric account id from profile, e.g. 107780257626128497. Used instead of handle when both are given.
next_max_id
stringoptional
The next_max_id from the previous response, to get older posts.
trim
booleanoptional
true omits each post's HTML content (plain text stays) for a smaller response.
One of
truefalse
Default
false

Example request

Replace YOUR_API_KEY with your key, or set LURKAPI_KEY for the code. Get a free key.

Language

Example response

A real response from this endpoint, captured from the live API and trimmed to a couple of items. Strings over 96 characters (mostly signed media URLs) are cut short and end in ….

Show the example response (4 KB)
{
  "success": true,
  "credits_remaining": 999988,
  "credits_charged": 1,
  "posts": [
    {
      "id": "117357090030899348",
      "created_at": "2026-09-30T00:11:21.773Z",
      "url": "https://truthsocial.com/@realDonaldTrump/117357090030899348",
      "content": "<p></p>",
      "text": "",
      "title": null,
      "language": null,
      "visibility": "public",
      "sensitive": false,
      "spoiler_text": "",
      "in_reply_to_id": null,
      "in_reply_to_account_id": null,
      "quote_id": null,
      "replies_count": 1313,
      "reblogs_count": 2788,
      "favourites_count": 9614,
      "upvotes_count": 9614,
      "downvotes_count": 0,
      "edited_at": null,
      "media_attachments": [
        {
          "id": "117357089273579505",
          "type": "image",
          "url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attac…",
          "preview_url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attac…",
          "description": null,
          "meta": {
            "original": {
              "width": 794,
              "height": 1294,
              "aspect": 0.6136012364760433,
              "duration": null
            },
            "small": {
              "width": 626,
              "height": 1021,
              "aspect": 0.6131243878550441,
              "duration": null
            }
          }
        }
      ],
      "card": null,
      "group": null,
      "mentions": [],
      "tags": [],
      "account": {
        "id": "107780257626128497",
        "username": "realDonaldTrump",
        "acct": "realDonaldTrump",
        "display_name": "Donald J. Trump",
        "url": "https://truthsocial.com/@realDonaldTrump",
        "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/av…",
        "verified": true,
        "followers_count": 13086928
      },
      "reblog": null,
      "quote": null
    },
    {
      "id": "117356339820644146",
      "created_at": "2026-09-29T21:00:34.470Z",
      "url": "https://truthsocial.com/@realDonaldTrump/117356339820644146",
      "content": "<p>Iran Has Lost Control of the Strait: <a href=\"https://x.com/Burggrabe…",
      "text": "Iran Has Lost Control of the Strait: https://x.com/BurggrabenH/status/2104361288000221497",
      "title": null,
      "language": "en",
      "visibility": "public",
      "sensitive": false,
      "spoiler_text": "",
      "in_reply_to_id": null,
      "in_reply_to_account_id": null,
      "quote_id": null,
      "replies_count": 727,
      "reblogs_count": 2628,
      "favourites_count": 10171,
      "upvotes_count": 10171,
      "downvotes_count": 0,
      "edited_at": null,
      "media_attachments": [],
      "card": {
        "url": "https://x.com/BurggrabenH/status/2104361288000221497",
        "title": "Alexander Stahel 🌻 (@BurggrabenH) on X",
        "description": "Iran Has Lost Control of The Strait",
        "type": "link",
        "provider_name": "x.com",
        "image": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/cache/previ…"
      },
      "group": null,
      "mentions": [],
      "tags": [],
      "account": {
        "id": "107780257626128497",
        "username": "realDonaldTrump",
        "acct": "realDonaldTrump",
        "display_name": "Donald J. Trump",
        "url": "https://truthsocial.com/@realDonaldTrump",
        "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/av…",
        "verified": true,
        "followers_count": 13086928
      },
      "reblog": null,
      "quote": null
    }
  ],
  "next_max_id": "117356339820644146"
}

Response fields

Every field of a successful response. [] marks a list: a[].b is the b of each item in a. nullable fields can be null; optional fields can be missing.

Show all 205 fields
FieldTypeDescription
successtrueAlways true here; errors have success: false.
credits_remainingnumberYour balance after this call. On anonymous playground calls: free tries left today.
credits_chargednumberCredits this call cost; 0 on free endpoints. On anonymous playground calls: tries used (1).
postsobject[]Posts and ReTruths, newest first.
posts[].idstringPost id, e.g. 117351985093810875.
posts[].created_atstringPosted at, ISO 8601.
posts[].urlstringThe post on truthsocial.com.
posts[].contentstringoptionalPost text as HTML. Omitted with trim=true.
posts[].textstringPost text, plain. Empty for media-only posts and plain reposts.
posts[].titlestringnullableTitle, on group posts that have one; else null.
posts[].languagestringnullableLanguage code (e.g. en) when detected; often null.
posts[].visibilitystringpublic, or group for posts in a group.
posts[].sensitivebooleanMarked sensitive (media hidden behind a warning).
posts[].spoiler_textstringContent warning; empty if none.
posts[].in_reply_to_idstringnullableThe post this replies to; null if not a reply.
posts[].in_reply_to_account_idstringnullableAuthor of the post this replies to.
posts[].quote_idstringnullableThe quoted post's id; null if not a quote.
posts[].replies_countnumberReplies.
posts[].reblogs_countnumberReTruths (reposts).
posts[].favourites_countnumberLikes.
posts[].upvotes_countnumbernullableUpvotes (Truth Social's likes); null if not reported.
posts[].downvotes_countnumbernullableDownvotes; null if not reported.
posts[].edited_atstringnullableLast edit, ISO 8601; null if never edited.
posts[].media_attachmentsobject[]Images and videos, in order.
posts[].media_attachments[].idstringAttachment id.
posts[].media_attachments[].typestringimage, video, gifv, audio or unknown.
posts[].media_attachments[].urlstringnullableThe file (full-size image or MP4).
posts[].media_attachments[].preview_urlstringnullableA smaller image, or the video's thumbnail.
posts[].media_attachments[].descriptionstringnullableAlt text; null if none.
posts[].media_attachments[].metaobjectSizes, as Mastodon reports them.
posts[].media_attachments[].meta.originalobjectnullableSize of the file at url.
posts[].media_attachments[].meta.original.widthnumbernullableWidth in pixels.
posts[].media_attachments[].meta.original.heightnumbernullableHeight in pixels.
posts[].media_attachments[].meta.original.aspectnumbernullableWidth / height; null when not reported (videos).
posts[].media_attachments[].meta.original.durationnumbernullableLength in seconds, for video and audio; else null.
posts[].media_attachments[].meta.smallobjectnullableSize of the image at preview_url.
posts[].media_attachments[].meta.small.widthnumbernullableWidth in pixels.
posts[].media_attachments[].meta.small.heightnumbernullableHeight in pixels.
posts[].media_attachments[].meta.small.aspectnumbernullableWidth / height; null when not reported (videos).
posts[].media_attachments[].meta.small.durationnumbernullableLength in seconds, for video and audio; else null.
posts[].cardobjectnullableLink preview for the first link in the post; null if none.
posts[].card.urlstringThe linked page.
posts[].card.titlestringnullablePage title.
posts[].card.descriptionstringnullablePage description.
posts[].card.typestringnullablelink, video, photo or rich.
posts[].card.provider_namestringnullableSite name, e.g. x.com.
posts[].card.imagestringnullablePreview image URL (hosted by Truth Social).
posts[].groupobjectnullableThe group it was posted in; null for ordinary posts.
posts[].group.idstringGroup id.
posts[].group.display_namestringGroup name.
posts[].group.slugstringnullableURL name, e.g. republicans.
posts[].group.urlstringnullableGroup on truthsocial.com.
posts[].group.members_countnumbernullableMembers.
posts[].mentionsobject[]Accounts mentioned.
posts[].mentions[].idstringAccount id.
posts[].mentions[].usernamestringUsername without @.
posts[].mentions[].acctstringSame as username.
posts[].mentions[].urlstringProfile on truthsocial.com.
posts[].tagsobject[]Hashtags used.
posts[].tags[].namestringHashtag without #.
posts[].tags[].urlstringHashtag page on truthsocial.com.
posts[].accountobjectThe author.
posts[].account.idstringAccount id.
posts[].account.usernamestringUsername without @.
posts[].account.acctstringSame as username.
posts[].account.display_namestringDisplay name.
posts[].account.urlstringProfile on truthsocial.com.
posts[].account.avatarstringnullableProfile picture URL; null if none.
posts[].account.verifiedbooleanHas the verified badge.
posts[].account.followers_countnumberFollowers.
posts[].reblogobjectnullableOn a ReTruth (repost): the original post. null otherwise.
posts[].reblog.idstringPost id, e.g. 117351985093810875.
posts[].reblog.created_atstringPosted at, ISO 8601.
posts[].reblog.urlstringThe post on truthsocial.com.
posts[].reblog.contentstringoptionalPost text as HTML. Omitted with trim=true.
posts[].reblog.textstringPost text, plain. Empty for media-only posts and plain reposts.
posts[].reblog.titlestringnullableTitle, on group posts that have one; else null.
posts[].reblog.languagestringnullableLanguage code (e.g. en) when detected; often null.
posts[].reblog.visibilitystringpublic, or group for posts in a group.
posts[].reblog.sensitivebooleanMarked sensitive (media hidden behind a warning).
posts[].reblog.spoiler_textstringContent warning; empty if none.
posts[].reblog.in_reply_to_idstringnullableThe post this replies to; null if not a reply.
posts[].reblog.in_reply_to_account_idstringnullableAuthor of the post this replies to.
posts[].reblog.quote_idstringnullableThe quoted post's id; null if not a quote.
posts[].reblog.replies_countnumberReplies.
posts[].reblog.reblogs_countnumberReTruths (reposts).
posts[].reblog.favourites_countnumberLikes.
posts[].reblog.upvotes_countnumbernullableUpvotes (Truth Social's likes); null if not reported.
posts[].reblog.downvotes_countnumbernullableDownvotes; null if not reported.
posts[].reblog.edited_atstringnullableLast edit, ISO 8601; null if never edited.
posts[].reblog.media_attachmentsobject[]Images and videos, in order.
posts[].reblog.media_attachments[].idstringAttachment id.
posts[].reblog.media_attachments[].typestringimage, video, gifv, audio or unknown.
posts[].reblog.media_attachments[].urlstringnullableThe file (full-size image or MP4).
posts[].reblog.media_attachments[].preview_urlstringnullableA smaller image, or the video's thumbnail.
posts[].reblog.media_attachments[].descriptionstringnullableAlt text; null if none.
posts[].reblog.media_attachments[].metaobjectSizes, as Mastodon reports them.
posts[].reblog.media_attachments[].meta.originalobjectnullableSize of the file at url.
posts[].reblog.media_attachments[].meta.original.widthnumbernullableWidth in pixels.
posts[].reblog.media_attachments[].meta.original.heightnumbernullableHeight in pixels.
posts[].reblog.media_attachments[].meta.original.aspectnumbernullableWidth / height; null when not reported (videos).
posts[].reblog.media_attachments[].meta.original.durationnumbernullableLength in seconds, for video and audio; else null.
posts[].reblog.media_attachments[].meta.smallobjectnullableSize of the image at preview_url.
posts[].reblog.media_attachments[].meta.small.widthnumbernullableWidth in pixels.
posts[].reblog.media_attachments[].meta.small.heightnumbernullableHeight in pixels.
posts[].reblog.media_attachments[].meta.small.aspectnumbernullableWidth / height; null when not reported (videos).
posts[].reblog.media_attachments[].meta.small.durationnumbernullableLength in seconds, for video and audio; else null.
posts[].reblog.cardobjectnullableLink preview for the first link in the post; null if none.
posts[].reblog.card.urlstringThe linked page.
posts[].reblog.card.titlestringnullablePage title.
posts[].reblog.card.descriptionstringnullablePage description.
posts[].reblog.card.typestringnullablelink, video, photo or rich.
posts[].reblog.card.provider_namestringnullableSite name, e.g. x.com.
posts[].reblog.card.imagestringnullablePreview image URL (hosted by Truth Social).
posts[].reblog.groupobjectnullableThe group it was posted in; null for ordinary posts.
posts[].reblog.group.idstringGroup id.
posts[].reblog.group.display_namestringGroup name.
posts[].reblog.group.slugstringnullableURL name, e.g. republicans.
posts[].reblog.group.urlstringnullableGroup on truthsocial.com.
posts[].reblog.group.members_countnumbernullableMembers.
posts[].reblog.mentionsobject[]Accounts mentioned.
posts[].reblog.mentions[].idstringAccount id.
posts[].reblog.mentions[].usernamestringUsername without @.
posts[].reblog.mentions[].acctstringSame as username.
posts[].reblog.mentions[].urlstringProfile on truthsocial.com.
posts[].reblog.tagsobject[]Hashtags used.
posts[].reblog.tags[].namestringHashtag without #.
posts[].reblog.tags[].urlstringHashtag page on truthsocial.com.
posts[].reblog.accountobjectThe author.
posts[].reblog.account.idstringAccount id.
posts[].reblog.account.usernamestringUsername without @.
posts[].reblog.account.acctstringSame as username.
posts[].reblog.account.display_namestringDisplay name.
posts[].reblog.account.urlstringProfile on truthsocial.com.
posts[].reblog.account.avatarstringnullableProfile picture URL; null if none.
posts[].reblog.account.verifiedbooleanHas the verified badge.
posts[].reblog.account.followers_countnumberFollowers.
posts[].quoteobjectnullableOn a quote post: the quoted post. null otherwise.
posts[].quote.idstringPost id, e.g. 117351985093810875.
posts[].quote.created_atstringPosted at, ISO 8601.
posts[].quote.urlstringThe post on truthsocial.com.
posts[].quote.contentstringoptionalPost text as HTML. Omitted with trim=true.
posts[].quote.textstringPost text, plain. Empty for media-only posts and plain reposts.
posts[].quote.titlestringnullableTitle, on group posts that have one; else null.
posts[].quote.languagestringnullableLanguage code (e.g. en) when detected; often null.
posts[].quote.visibilitystringpublic, or group for posts in a group.
posts[].quote.sensitivebooleanMarked sensitive (media hidden behind a warning).
posts[].quote.spoiler_textstringContent warning; empty if none.
posts[].quote.in_reply_to_idstringnullableThe post this replies to; null if not a reply.
posts[].quote.in_reply_to_account_idstringnullableAuthor of the post this replies to.
posts[].quote.quote_idstringnullableThe quoted post's id; null if not a quote.
posts[].quote.replies_countnumberReplies.
posts[].quote.reblogs_countnumberReTruths (reposts).
posts[].quote.favourites_countnumberLikes.
posts[].quote.upvotes_countnumbernullableUpvotes (Truth Social's likes); null if not reported.
posts[].quote.downvotes_countnumbernullableDownvotes; null if not reported.
posts[].quote.edited_atstringnullableLast edit, ISO 8601; null if never edited.
posts[].quote.media_attachmentsobject[]Images and videos, in order.
posts[].quote.media_attachments[].idstringAttachment id.
posts[].quote.media_attachments[].typestringimage, video, gifv, audio or unknown.
posts[].quote.media_attachments[].urlstringnullableThe file (full-size image or MP4).
posts[].quote.media_attachments[].preview_urlstringnullableA smaller image, or the video's thumbnail.
posts[].quote.media_attachments[].descriptionstringnullableAlt text; null if none.
posts[].quote.media_attachments[].metaobjectSizes, as Mastodon reports them.
posts[].quote.media_attachments[].meta.originalobjectnullableSize of the file at url.
posts[].quote.media_attachments[].meta.original.widthnumbernullableWidth in pixels.
posts[].quote.media_attachments[].meta.original.heightnumbernullableHeight in pixels.
posts[].quote.media_attachments[].meta.original.aspectnumbernullableWidth / height; null when not reported (videos).
posts[].quote.media_attachments[].meta.original.durationnumbernullableLength in seconds, for video and audio; else null.
posts[].quote.media_attachments[].meta.smallobjectnullableSize of the image at preview_url.
posts[].quote.media_attachments[].meta.small.widthnumbernullableWidth in pixels.
posts[].quote.media_attachments[].meta.small.heightnumbernullableHeight in pixels.
posts[].quote.media_attachments[].meta.small.aspectnumbernullableWidth / height; null when not reported (videos).
posts[].quote.media_attachments[].meta.small.durationnumbernullableLength in seconds, for video and audio; else null.
posts[].quote.cardobjectnullableLink preview for the first link in the post; null if none.
posts[].quote.card.urlstringThe linked page.
posts[].quote.card.titlestringnullablePage title.
posts[].quote.card.descriptionstringnullablePage description.
posts[].quote.card.typestringnullablelink, video, photo or rich.
posts[].quote.card.provider_namestringnullableSite name, e.g. x.com.
posts[].quote.card.imagestringnullablePreview image URL (hosted by Truth Social).
posts[].quote.groupobjectnullableThe group it was posted in; null for ordinary posts.
posts[].quote.group.idstringGroup id.
posts[].quote.group.display_namestringGroup name.
posts[].quote.group.slugstringnullableURL name, e.g. republicans.
posts[].quote.group.urlstringnullableGroup on truthsocial.com.
posts[].quote.group.members_countnumbernullableMembers.
posts[].quote.mentionsobject[]Accounts mentioned.
posts[].quote.mentions[].idstringAccount id.
posts[].quote.mentions[].usernamestringUsername without @.
posts[].quote.mentions[].acctstringSame as username.
posts[].quote.mentions[].urlstringProfile on truthsocial.com.
posts[].quote.tagsobject[]Hashtags used.
posts[].quote.tags[].namestringHashtag without #.
posts[].quote.tags[].urlstringHashtag page on truthsocial.com.
posts[].quote.accountobjectThe author.
posts[].quote.account.idstringAccount id.
posts[].quote.account.usernamestringUsername without @.
posts[].quote.account.acctstringSame as username.
posts[].quote.account.display_namestringDisplay name.
posts[].quote.account.urlstringProfile on truthsocial.com.
posts[].quote.account.avatarstringnullableProfile picture URL; null if none.
posts[].quote.account.verifiedbooleanHas the verified badge.
posts[].quote.account.followers_countnumberFollowers.
next_max_idstringnullablePass as next_max_id for older posts. null when this page is empty.

Caching and freshness

Responses are cached for up to 2 minutes, so a repeat call within that window can return the same data. It still costs 1 credit.

Errors

Errors return { success: false, error, code, docs } with the HTTP status below. Validation errors, 401/402/429 rejections and 5xx failures are free; not_found is charged (how charging works). All error codes.

StatusCodeMeaning
401missing_api_keyNo API key. Send it in the x-api-key header.
401invalid_api_keyThe key is unknown or was revoked.
402insufficient_creditsNot enough credits for this call. Buy a pack or wait for tomorrow's top-up.
403not_publicThe platform confirmed this account or content isn't available to logged-out visitors. Use a publicly visible target.
404not_foundThe endpoint, or the thing you asked for (ad, post, subreddit), doesn't exist. Charged when the platform was checked.
405method_not_allowedEndpoints take GET with query params.
429rate_limitedToo many calls at once. Wait for the retry-after seconds, then retry.
500internal_errorSomething broke on our side. Retry; 5xx errors are free.
502upstream_errorThe platform didn't give a usable answer. Retry; 5xx errors are free.
503upstream_busyAll our connections to the platform are busy. Retry in a few seconds; 5xx errors are free.
504upstream_timeoutThe platform took over 30 seconds to answer. Retry; timeouts are free.

Use it in Claude

Once LurkAPI is connected to Claude, this endpoint is the truthsocial_user_posts tool. Ask in plain English, for example:

Ask Claude
Use LurkAPI's truthsocial_user_posts with handle "realDonaldTrump" and summarize what you find.

Claude calls truthsocial_user_posts with arguments like these, and each call costs 1 credit:

Tool arguments
{
  "handle": "realDonaldTrump"
}

Tool results skip nulls and empty lists to save tokens, and trim defaults to true.