LurkAPI
Docs · Tweet

Tweet

One tweet: text, author, likes, replies, reposts, quotes, bookmarks, views, media and the tweet it quotes.

1 credit per callFresh within 5 minutesMCP tool: twitter_tweet
GEThttps://api.lurkapi.com/v1/twitter/tweet

Example responseView as markdown

When to use this

Use it to check how a post performed or to pull its text and media. Pass the tweet's URL (x.com or twitter.com) or its id. Videos come with playable MP4 files in media[].variants, best quality first.

text is what x.com shows: long posts in full and t.co links expanded. For a retweet, retweeted_tweet holds the original; for a quote, quoted_tweet holds the quoted tweet. views is null on tweets from before 2023.

When X's main source is busy we answer from its embed data instead: then retweets, quotes, bookmarks, views and author.followers are null, and long posts are cut to 280 characters.

Deleted tweets, tweets from protected accounts and age-restricted tweets return 404 not_found.

Parameters

All parameters go in the query string.

ParameterDescription
url
stringrequired
The tweet's URL, e.g. https://x.com/NASA/status/2104593672624886205 (twitter.com links work too), or its numeric id.
Example
https://x.com/NASA/status/2104593672624886205

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 (2 KB)
{
  "success": true,
  "credits_remaining": 999999,
  "credits_charged": 1,
  "id": "2104593672624886205",
  "url": "https://x.com/NASA/status/2104593672624886205",
  "text": "How do we respond when we detect an asteroid that could pose a threat to…",
  "created_at": "2026-09-28T15:26:47.000Z",
  "lang": "en",
  "source": "Sprinklr",
  "author": {
    "id": "11348282",
    "handle": "NASA",
    "name": "NASA",
    "avatar": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_400x400.jpg",
    "verified": true,
    "verified_type": "Government",
    "followers": 92377447
  },
  "counts": {
    "likes": 3228,
    "replies": 210,
    "retweets": 538,
    "quotes": 40,
    "bookmarks": 267,
    "views": 676901
  },
  "media": [
    {
      "type": "video",
      "url": "https://pbs.twimg.com/media/HTUEyn0XkAALVB_.png",
      "width": 405,
      "height": 720,
      "duration_ms": 38605,
      "variants": [
        {
          "url": "https://video.twimg.com/amplify_video/2104593621043314689/vid/avc1/608x1…",
          "content_type": "video/mp4",
          "bitrate": 2176000
        },
        {
          "url": "https://video.twimg.com/amplify_video/2104593621043314689/vid/avc1/480x8…",
          "content_type": "video/mp4",
          "bitrate": 950000
        },
        {
          "url": "https://video.twimg.com/amplify_video/2104593621043314689/vid/avc1/320x5…",
          "content_type": "video/mp4",
          "bitrate": 632000
        },
        {
          "url": "https://video.twimg.com/amplify_video/2104593621043314689/pl/iMMWqCJ1OZowER7i.m3u8?tag=16&v=2b3",
          "content_type": "application/x-mpegURL",
          "bitrate": null
        }
      ]
    }
  ],
  "hashtags": [],
  "mentions": [],
  "links": [
    "https://go.nasa.gov/4AUCQ3Z"
  ],
  "reply_to_id": null,
  "reply_to_handle": null,
  "conversation_id": "2104593672624886205",
  "quoted_id": null,
  "possibly_sensitive": false,
  "quoted_tweet": null,
  "retweeted_tweet": null
}

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 122 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).
idstringTweet id, e.g. 2104593672624886205.
urlstringThe tweet on x.com.
textstringThe text as x.com shows it: long posts in full, t.co links expanded, without a reply's leading @mentions or the trailing media link. Empty for media-only tweets.
created_atstringWhen it was posted, ISO 8601.
langstringnullableLanguage as X detects it, e.g. en (und when it can't tell); null if unknown.
sourcestringnullableThe app it was posted from, e.g. Twitter for iPhone; null if X doesn't say.
authorobjectWho posted it.
author.idstringNumeric user id. It stays the same when the handle changes.
author.handlestringUsername (handle), without @.
author.namestringDisplay name.
author.avatarstringnullableProfile picture URL, 400×400; null if none.
author.verifiedbooleanHas the blue check (X Premium).
author.verified_typestringnullableBusiness (gold check, a verified organization) or Government (grey check); null otherwise.
author.followersnumbernullableFollowers when fetched; null when X's main source was busy and the tweet came from its embed data.
countsobjectEngagement when fetched. Exact numbers, not rounded.
counts.likesnumberLikes.
counts.repliesnumberReplies.
counts.retweetsnumbernullableReposts (retweets); null when X's main source was busy and the tweet came from its embed data.
counts.quotesnumbernullableQuote posts; null when X's main source was busy and the tweet came from its embed data.
counts.bookmarksnumbernullableBookmarks; null when X's main source was busy and the tweet came from its embed data.
counts.viewsnumbernullableViews; null on tweets from before 2023 (X didn't count them then), and null when X's main source was busy and the tweet came from its embed data.
mediaobject[]Attached photos, videos and GIFs, in order. Empty if none.
media[].typestringphoto, video or gif (X plays GIFs as silent looping MP4s).
media[].urlstringThe image; for videos and GIFs, the poster (thumbnail) image.
media[].widthnumberOriginal width in pixels.
media[].heightnumberOriginal height in pixels.
media[].duration_msnumbernullableVideo length in milliseconds; null for photos and GIFs.
media[].variantsobject[]Playable files for videos and GIFs: MP4s from highest to lowest bitrate, then the HLS playlist. Empty for photos.
media[].variants[].urlstringFile URL on video.twimg.com.
media[].variants[].content_typestringvideo/mp4, or application/x-mpegURL for the HLS playlist.
media[].variants[].bitratenumbernullableBits per second; null for the HLS playlist.
hashtagsstring[]Hashtags in the text, without #.
mentionsstring[]Usernames @mentioned, including the ones a reply is addressed to.
linksstring[]Links in the text, expanded (not t.co). The tweet's own photos and videos aren't included.
reply_to_idstringnullableId of the tweet this replies to; null if it isn't a reply.
reply_to_handlestringnullableUsername of the account this replies to; null if it isn't a reply.
conversation_idstringnullableId of the thread's first tweet (its own id if it starts one); null if X doesn't say.
quoted_idstringnullableId of the tweet this one quotes; null if it isn't a quote.
possibly_sensitivebooleanX marks the media as possibly sensitive.
quoted_tweetobjectnullableThe tweet this one quotes (without its own quoted or retweeted tweet); null if none or it's no longer available.
quoted_tweet.idstringTweet id, e.g. 2104593672624886205.
quoted_tweet.urlstringThe tweet on x.com.
quoted_tweet.textstringThe text as x.com shows it: long posts in full, t.co links expanded, without a reply's leading @mentions or the trailing media link. Empty for media-only tweets.
quoted_tweet.created_atstringWhen it was posted, ISO 8601.
quoted_tweet.langstringnullableLanguage as X detects it, e.g. en (und when it can't tell); null if unknown.
quoted_tweet.sourcestringnullableThe app it was posted from, e.g. Twitter for iPhone; null if X doesn't say.
quoted_tweet.authorobjectWho posted it.
quoted_tweet.author.idstringNumeric user id. It stays the same when the handle changes.
quoted_tweet.author.handlestringUsername (handle), without @.
quoted_tweet.author.namestringDisplay name.
quoted_tweet.author.avatarstringnullableProfile picture URL, 400×400; null if none.
quoted_tweet.author.verifiedbooleanHas the blue check (X Premium).
quoted_tweet.author.verified_typestringnullableBusiness (gold check, a verified organization) or Government (grey check); null otherwise.
quoted_tweet.author.followersnumbernullableFollowers when fetched; null when X's main source was busy and the tweet came from its embed data.
quoted_tweet.countsobjectEngagement when fetched. Exact numbers, not rounded.
quoted_tweet.counts.likesnumberLikes.
quoted_tweet.counts.repliesnumberReplies.
quoted_tweet.counts.retweetsnumbernullableReposts (retweets); null when X's main source was busy and the tweet came from its embed data.
quoted_tweet.counts.quotesnumbernullableQuote posts; null when X's main source was busy and the tweet came from its embed data.
quoted_tweet.counts.bookmarksnumbernullableBookmarks; null when X's main source was busy and the tweet came from its embed data.
quoted_tweet.counts.viewsnumbernullableViews; null on tweets from before 2023 (X didn't count them then), and null when X's main source was busy and the tweet came from its embed data.
quoted_tweet.mediaobject[]Attached photos, videos and GIFs, in order. Empty if none.
quoted_tweet.media[].typestringphoto, video or gif (X plays GIFs as silent looping MP4s).
quoted_tweet.media[].urlstringThe image; for videos and GIFs, the poster (thumbnail) image.
quoted_tweet.media[].widthnumberOriginal width in pixels.
quoted_tweet.media[].heightnumberOriginal height in pixels.
quoted_tweet.media[].duration_msnumbernullableVideo length in milliseconds; null for photos and GIFs.
quoted_tweet.media[].variantsobject[]Playable files for videos and GIFs: MP4s from highest to lowest bitrate, then the HLS playlist. Empty for photos.
quoted_tweet.media[].variants[].urlstringFile URL on video.twimg.com.
quoted_tweet.media[].variants[].content_typestringvideo/mp4, or application/x-mpegURL for the HLS playlist.
quoted_tweet.media[].variants[].bitratenumbernullableBits per second; null for the HLS playlist.
quoted_tweet.hashtagsstring[]Hashtags in the text, without #.
quoted_tweet.mentionsstring[]Usernames @mentioned, including the ones a reply is addressed to.
quoted_tweet.linksstring[]Links in the text, expanded (not t.co). The tweet's own photos and videos aren't included.
quoted_tweet.reply_to_idstringnullableId of the tweet this replies to; null if it isn't a reply.
quoted_tweet.reply_to_handlestringnullableUsername of the account this replies to; null if it isn't a reply.
quoted_tweet.conversation_idstringnullableId of the thread's first tweet (its own id if it starts one); null if X doesn't say.
quoted_tweet.quoted_idstringnullableId of the tweet this one quotes; null if it isn't a quote.
quoted_tweet.possibly_sensitivebooleanX marks the media as possibly sensitive.
retweeted_tweetobjectnullableFor retweets: the original tweet, with its own text and counts. null for everything else.
retweeted_tweet.idstringTweet id, e.g. 2104593672624886205.
retweeted_tweet.urlstringThe tweet on x.com.
retweeted_tweet.textstringThe text as x.com shows it: long posts in full, t.co links expanded, without a reply's leading @mentions or the trailing media link. Empty for media-only tweets.
retweeted_tweet.created_atstringWhen it was posted, ISO 8601.
retweeted_tweet.langstringnullableLanguage as X detects it, e.g. en (und when it can't tell); null if unknown.
retweeted_tweet.sourcestringnullableThe app it was posted from, e.g. Twitter for iPhone; null if X doesn't say.
retweeted_tweet.authorobjectWho posted it.
retweeted_tweet.author.idstringNumeric user id. It stays the same when the handle changes.
retweeted_tweet.author.handlestringUsername (handle), without @.
retweeted_tweet.author.namestringDisplay name.
retweeted_tweet.author.avatarstringnullableProfile picture URL, 400×400; null if none.
retweeted_tweet.author.verifiedbooleanHas the blue check (X Premium).
retweeted_tweet.author.verified_typestringnullableBusiness (gold check, a verified organization) or Government (grey check); null otherwise.
retweeted_tweet.author.followersnumbernullableFollowers when fetched; null when X's main source was busy and the tweet came from its embed data.
retweeted_tweet.countsobjectEngagement when fetched. Exact numbers, not rounded.
retweeted_tweet.counts.likesnumberLikes.
retweeted_tweet.counts.repliesnumberReplies.
retweeted_tweet.counts.retweetsnumbernullableReposts (retweets); null when X's main source was busy and the tweet came from its embed data.
retweeted_tweet.counts.quotesnumbernullableQuote posts; null when X's main source was busy and the tweet came from its embed data.
retweeted_tweet.counts.bookmarksnumbernullableBookmarks; null when X's main source was busy and the tweet came from its embed data.
retweeted_tweet.counts.viewsnumbernullableViews; null on tweets from before 2023 (X didn't count them then), and null when X's main source was busy and the tweet came from its embed data.
retweeted_tweet.mediaobject[]Attached photos, videos and GIFs, in order. Empty if none.
retweeted_tweet.media[].typestringphoto, video or gif (X plays GIFs as silent looping MP4s).
retweeted_tweet.media[].urlstringThe image; for videos and GIFs, the poster (thumbnail) image.
retweeted_tweet.media[].widthnumberOriginal width in pixels.
retweeted_tweet.media[].heightnumberOriginal height in pixels.
retweeted_tweet.media[].duration_msnumbernullableVideo length in milliseconds; null for photos and GIFs.
retweeted_tweet.media[].variantsobject[]Playable files for videos and GIFs: MP4s from highest to lowest bitrate, then the HLS playlist. Empty for photos.
retweeted_tweet.media[].variants[].urlstringFile URL on video.twimg.com.
retweeted_tweet.media[].variants[].content_typestringvideo/mp4, or application/x-mpegURL for the HLS playlist.
retweeted_tweet.media[].variants[].bitratenumbernullableBits per second; null for the HLS playlist.
retweeted_tweet.hashtagsstring[]Hashtags in the text, without #.
retweeted_tweet.mentionsstring[]Usernames @mentioned, including the ones a reply is addressed to.
retweeted_tweet.linksstring[]Links in the text, expanded (not t.co). The tweet's own photos and videos aren't included.
retweeted_tweet.reply_to_idstringnullableId of the tweet this replies to; null if it isn't a reply.
retweeted_tweet.reply_to_handlestringnullableUsername of the account this replies to; null if it isn't a reply.
retweeted_tweet.conversation_idstringnullableId of the thread's first tweet (its own id if it starts one); null if X doesn't say.
retweeted_tweet.quoted_idstringnullableId of the tweet this one quotes; null if it isn't a quote.
retweeted_tweet.possibly_sensitivebooleanX marks the media as possibly sensitive.

Caching and freshness

Responses are cached for up to 5 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.
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 twitter_tweet tool. Ask in plain English, for example:

Ask Claude
Use LurkAPI's twitter_tweet with url "https://x.com/NASA/status/2104593672624886205" and summarize what you find.

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

Tool arguments
{
  "url": "https://x.com/NASA/status/2104593672624886205"
}

Tool results skip nulls and empty lists to save tokens.