/healthPublicHealth check
Service liveness plus scraper session pool status (operational | degraded | down).
Node.js
const res = await fetch(`${BASE}/health`);
const data = await res.json();
console.log(data);Docs
Profiles, posts, and search for X. Authenticate with an API key. Plan limits are per account. Base: https://api.probeuranus.fun
Sign in with Google on the dashboard. First login creates your API key (shown once). Use Rotate when you need a new secret; the old one stops working immediately. Send the key with every request.
Authorization: Bearer <api_key> (or X-API-Key)Setup
const BASE = "https://api.probeuranus.fun"; const API_KEY = "probe_...";
Quota lives on your account and your key inherits it. An account with no active subscription gets 402 subscription_required on every call — the key stays valid and starts working again the moment you subscribe. Check GET /v1/me for remaining quota and reset times, or read these response headers:
X-RateLimit-Limit / X-RateLimit-Remaining / X-RateLimit-Reset · per minuteX-RateLimit-Limit-Daily / X-RateLimit-Remaining-Daily / X-RateLimit-Reset-Daily · daily (when set)X-RateLimit-Limit-Monthly / X-RateLimit-Remaining-Monthly / X-RateLimit-Reset-Monthly · monthly (when set)X-Plan · your plan nameRetry-After · wait time when limitedList responses use { data, next_cursor, cursor, meta }. Pass next_cursor back as ?cursor=. Timelines accept since_id, until_id, include_replies, include_retweets, and media_only.
Plan defaults are on /pricing.
JSON body shape:
Error shape
{ "error": "code", "message": "optional detail" }401: missing_api_key, invalid_key, inactive, unauthorized402: subscription_required — the key is valid but the account has no active subscription. Nothing to rotate; it works again once you subscribe.429: rate_limited, daily_quota, monthly_quota — body includes message, retryAfterSec, and limitType. Honor Retry-After (seconds). Example:429 example
{
"error": "rate_limited",
"message": "RPM limit reached. Wait 12s, then retry. Check X-RateLimit-* headers and GET /v1/me.",
"retryAfterSec": 12,
"limitType": "rpm"
}404: not_found503: x_sessions_exhausted, auth_fail (temporary capacity)502: temporary request failureNo API key required.
/healthPublicService liveness plus scraper session pool status (operational | degraded | down).
Node.js
const res = await fetch(`${BASE}/health`);
const data = await res.json();
console.log(data);/v1PublicFull list of available commands.
Node.js
const res = await fetch(`${BASE}/v1`);
const data = await res.json();
console.log(data);/v1/openapi.jsonPublicCommand list in a format API tools understand.
Node.js
const res = await fetch(`${BASE}/v1/openapi.json`);
const data = await res.json();
console.log(data);Needs your API key. Profile lookups may be briefly cached. Add fresh=1 if you need the newest data.
/v1/meAPI keyReturns plan limits, remaining RPM/daily/monthly quota, and reset timestamps for the account that owns this API key.
Node.js
const res = await fetch(`${BASE}/v1/me`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/user/infoAPI keyReturns profile fields, follower/following counts, statuses, media counts, etc. Lookup by handle or numeric rest id.
Parameters
userName · query · stringX handle without @ (alias: username). Provide userName or userId.
userId · query · stringNumeric rest id (alias: user_id). Use when you store ids instead of handles.
fresh · query · booleanBypass cache when 1/true/yes
include_space · query · booleanLook up whether the account is in a live Space (default true). Set 0/false/no to skip.
include_broadcast · query · booleanLook up whether the account is running a live video broadcast (default true). Set 0/false/no to skip.
Node.js
const res = await fetch(`${BASE}/v1/user/info?userName=elonmusk&userId=44196397&fresh=1&include_space=1&include_broadcast=1`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/user/tweetsAPI keyUser timeline with cursor pagination. Tweets include media[] (url, previewUrl, width/height, durationMs, altText, variants[] with contentType/url/bitrate).
Parameters
userName · query · required · stringX handle without @
limit · query · numberPage size (1-40, default 20)
cursor · query · stringOpaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.
include_replies · query · booleanInclude reply tweets (default false on /user/tweets, true elsewhere)
include_retweets · query · booleanInclude retweets (default true)
media_only · query · booleanOnly tweets that have media[] (default false)
since_id · query · stringKeep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)
until_id · query · stringKeep tweets with id strictly less than this snowflake (exclusive)
Node.js
const res = await fetch(`${BASE}/v1/user/tweets?userName=elonmusk&limit=20&include_replies=0&include_retweets=1&media_only=1`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/user/tweets-and-repliesAPI keyTimeline including the user's replies (UserTweetsAndReplies). Cursor-paginated.
Parameters
userName · query · required · stringX handle without @
limit · query · numberPage size (1-40, default 20)
cursor · query · stringOpaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.
include_replies · query · booleanInclude reply tweets (default false on /user/tweets, true elsewhere)
include_retweets · query · booleanInclude retweets (default true)
media_only · query · booleanOnly tweets that have media[] (default false)
since_id · query · stringKeep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)
until_id · query · stringKeep tweets with id strictly less than this snowflake (exclusive)
Node.js
const res = await fetch(`${BASE}/v1/user/tweets-and-replies?userName=elonmusk&limit=20&include_replies=0&include_retweets=1&media_only=1`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/user/mentionsAPI keyTweets that mention an account (SearchTimeline `@handle -from:handle`). Cursor-paginated. Not the authenticated user's notification inbox.
Parameters
userName · query · required · stringX handle without @ (alias: username)
product · query · stringLatest or Top (default Latest)
limit · query · numberPage size (1-40, default 20)
cursor · query · stringOpaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.
include_replies · query · booleanInclude reply tweets (default false on /user/tweets, true elsewhere)
include_retweets · query · booleanInclude retweets (default true)
media_only · query · booleanOnly tweets that have media[] (default false)
since_id · query · stringKeep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)
until_id · query · stringKeep tweets with id strictly less than this snowflake (exclusive)
Node.js
const res = await fetch(`${BASE}/v1/user/mentions?userName=elonmusk&product=Latest&limit=20&include_replies=0&include_retweets=1&media_only=1`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/search/tweetsAPI keyLatest/Top search over X posts.
Parameters
query · query · required · stringSearch query (alias: q). Supports X operators.
product · query · stringLatest or Top (default Latest)
limit · query · numberPage size (1-40, default 20)
cursor · query · stringOpaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.
include_replies · query · booleanInclude reply tweets (default false on /user/tweets, true elsewhere)
include_retweets · query · booleanInclude retweets (default true)
media_only · query · booleanOnly tweets that have media[] (default false)
since_id · query · stringKeep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)
until_id · query · stringKeep tweets with id strictly less than this snowflake (exclusive)
Node.js
const res = await fetch(`${BASE}/v1/search/tweets?query=solana&product=Latest&limit=5&include_replies=0&include_retweets=1&media_only=1`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/search/usersAPI keyPeople search over X accounts via SearchTimeline (product=People). Cursor-paginated.
Parameters
query · query · required · stringSearch query (alias: q)
limit · query · numberPage size (1-40, default 20)
cursor · query · stringOpaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.
Node.js
const res = await fetch(`${BASE}/v1/search/users?query=solana&limit=20`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/user/mediaAPI keyMedia tab timeline (photos/videos/gifs). Cursor-paginated; tweets include media[] (altText and video variants[]).
Parameters
userName · query · required · stringX handle without @ (alias: username)
limit · query · numberPage size (1-40, default 20)
cursor · query · stringOpaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.
include_replies · query · booleanInclude reply tweets (default false on /user/tweets, true elsewhere)
include_retweets · query · booleanInclude retweets (default true)
media_only · query · booleanOnly tweets that have media[] (default false)
since_id · query · stringKeep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)
until_id · query · stringKeep tweets with id strictly less than this snowflake (exclusive)
Node.js
const res = await fetch(`${BASE}/v1/user/media?userName=nasa&limit=20&include_replies=0&include_retweets=1&media_only=1`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/list/{id}/tweetsAPI keyLatest tweets from a public list by numeric list id. Cursor-paginated.
Parameters
id · path · required · stringNumeric list id
limit · query · numberPage size (1-40, default 20)
cursor · query · stringOpaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.
include_replies · query · booleanInclude reply tweets (default false on /user/tweets, true elsewhere)
include_retweets · query · booleanInclude retweets (default true)
media_only · query · booleanOnly tweets that have media[] (default false)
since_id · query · stringKeep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)
until_id · query · stringKeep tweets with id strictly less than this snowflake (exclusive)
Node.js
const res = await fetch(`${BASE}/v1/list/1539453138322673664/tweets?limit=20&include_replies=0&include_retweets=1&media_only=1`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/community/{id}/tweetsAPI keyCommunity timeline (CommunityTweetsTimeline). Cursor-paginated.
Parameters
id · path · required · stringNumeric community id
ranking · query · stringRelevance (default) or Recency (alias: rankingMode)
limit · query · numberPage size (1-40, default 20)
cursor · query · stringOpaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.
include_replies · query · booleanInclude reply tweets (default false on /user/tweets, true elsewhere)
include_retweets · query · booleanInclude retweets (default true)
media_only · query · booleanOnly tweets that have media[] (default false)
since_id · query · stringKeep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)
until_id · query · stringKeep tweets with id strictly less than this snowflake (exclusive)
Node.js
const res = await fetch(`${BASE}/v1/community/1489422448332197888/tweets?ranking=Relevance&limit=20&include_replies=0&include_retweets=1&media_only=1`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/community/{id}API keyCommunity name, description, member count, join policy (CommunityQuery).
Parameters
id · path · required · stringNumeric community id
Node.js
const res = await fetch(`${BASE}/v1/community/1489422448332197888`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/space/{id}API keyTitle, state, start time, listener counts, host/admins/speakers, and a listener sample (AudioSpaceById).
Parameters
id · path · required · stringSpace id from x.com/i/spaces/{id} (e.g. 1wxWjlvBZynJQ). Full space URLs are also accepted.
Node.js
const res = await fetch(`${BASE}/v1/space/1wxWjlvBZynJQ`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/space/{id}/usersAPI keyHosts, on-stage speakers, and a listener sample for a Space. Filter with role=admins|speakers|listeners|on_stage|all.
Parameters
id · path · required · stringSpace id (same as /v1/space/{id})
role · query · stringall (default), admins, speakers, listeners, or on_stage (admins+speakers)
Node.js
const res = await fetch(`${BASE}/v1/space/1wxWjlvBZynJQ/users?role=on_stage`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/broadcast/{id}API keyTitle, state, host, viewer counts, thumbnail, and start time for a live or replayable video broadcast.
Parameters
id · path · required · stringBroadcast id from x.com/i/broadcasts/{id} (e.g. 1nxeLMkBVgYJX). Full broadcast URLs are also accepted.
Node.js
const res = await fetch(`${BASE}/v1/broadcast/1nxeLMkBVgYJX`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/trendsAPI keyTrending topics for a Yahoo WOEID via X trends/place. 1 = Worldwide. Tweet volumes are what X returns (often null).
Parameters
woeid · query · numberYahoo WOEID (alias: id). Default 1 (Worldwide). US = 23424977.
Node.js
const res = await fetch(`${BASE}/v1/trends?woeid=1`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/tweet/{id}API keyReturns a single post with author, media[] (including altText and video variants[]), and engagement counts (likes, replies, retweets, quotes, bookmarks, views).
Parameters
id · path · required · stringNumeric tweet/status id
Node.js
const res = await fetch(`${BASE}/v1/tweet/20`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/tweet/by-urlAPI keyAccepts an x.com or twitter.com status URL (or raw numeric id) and returns the same shape as tweet-by-id.
Parameters
url · query · required · stringStatus URL (alias: u)
Node.js
const res = await fetch(`${BASE}/v1/tweet/by-url?url=https%3A%2F%2Fx.com%2Fjack%2Fstatus%2F20`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/tweet/{id}/repliesAPI keyConversation replies for a post (commenters + engagement). Cursor-paginated.
Parameters
id · path · required · stringNumeric tweet/status id
limit · query · numberPage size (1-40, default 20)
cursor · query · stringOpaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.
Node.js
const res = await fetch(`${BASE}/v1/tweet/20/replies?limit=20`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/tweet/{id}/threadAPI keyParent chain (ancestors, oldest first), the focal tweet, and first-page replies from TweetDetail.
Parameters
id · path · required · stringNumeric tweet/status id (any tweet in the thread)
limit · query · numberPage size (1-40, default 20)
cursor · query · stringOpaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.
Node.js
const res = await fetch(`${BASE}/v1/tweet/20/thread?limit=20`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/tweet/{id}/retweetersAPI keyRetweeters for a post. Cursor-paginated.
Parameters
id · path · required · stringNumeric tweet/status id
limit · query · numberPage size (1-40, default 20)
cursor · query · stringOpaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.
Node.js
const res = await fetch(`${BASE}/v1/tweet/20/retweeters?limit=20`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/tweet/{id}/likesAPI keyReturns how many times a post was liked. X does not expose who liked it to these sessions. Same number as favoriteCount on GET /v1/tweet/{id}.
Parameters
id · path · required · stringNumeric tweet/status id
Node.js
const res = await fetch(`${BASE}/v1/tweet/20/likes`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/tweet/{id}/quotesAPI keyQuote posts for a status via search (quoted_tweet_id). Cursor-paginated.
Parameters
id · path · required · stringNumeric tweet/status id
limit · query · numberPage size (1-40, default 20)
cursor · query · stringOpaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.
Node.js
const res = await fetch(`${BASE}/v1/tweet/20/quotes?limit=20`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/tweet/{id}/quotersAPI keyUnique authors of quote tweets. Cursor-paginated (same cursor as /quotes).
Parameters
id · path · required · stringNumeric tweet/status id
limit · query · numberPage size (1-40, default 20)
cursor · query · stringOpaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.
Node.js
const res = await fetch(`${BASE}/v1/tweet/20/quoters?limit=20`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/tweet/{id}/engagersAPI keyPages retweeters, reply authors, and/or quoters into a deduped pool. Optional random winners (TwitterPicker-style). Like identities are not available; use GET /v1/tweet/{id}/likes for the count.
Parameters
id · path · required · stringNumeric tweet/status id
types · query · stringComma list: retweet,reply,quote (default retweet,reply,quote). like is accepted but skipped — identities are unavailable
mode · query · stringunion (any selected type) or intersect (all selected types)
max_pages · query · numberPages to pull per type (1-10, default 3)
limit · query · numberPage size (1-40, default 20)
winners · query · numberIf set, data is a random sample of this size from the pool
seed · query · numberOptional RNG seed for reproducible winner picks
Node.js
const res = await fetch(`${BASE}/v1/tweet/20/engagers?types=retweet%2Creply%2Cquote&mode=union&max_pages=3&limit=20&winners=5&seed=42`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/tweetsAPI keyFetch up to 25 tweets in one request. Partial failures return in errors[].
Parameters
ids · body · required · stringArray of tweet ids or status URLs (alias: tweetIds), max 25
Node.js
const res = await fetch(`${BASE}/v1/tweets`, {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"ids": [
"20",
"https://x.com/jack/status/20"
]
}),
});
const data = await res.json();
console.log(data);/v1/usersAPI keyFetch up to 25 profiles in one request by handle and/or numeric rest id. Partial failures return in errors[].
Parameters
userNames · body · stringArray of handles without @ (alias: usernames)
userIds · body · stringArray of numeric rest ids (alias: ids)
Node.js
const res = await fetch(`${BASE}/v1/users`, {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"userNames": [
"jack"
],
"userIds": [
"44196397"
]
}),
});
const data = await res.json();
console.log(data);/v1/user/followersAPI keyFollowers of an X account. Cursor-paginated.
Parameters
userName · query · required · stringX handle without @ (alias: username)
limit · query · numberPage size (1-40, default 20)
cursor · query · stringOpaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.
Node.js
const res = await fetch(`${BASE}/v1/user/followers?userName=elonmusk&limit=20`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/user/followingAPI keyFollowing list for an X account. Cursor-paginated.
Parameters
userName · query · required · stringX handle without @ (alias: username)
limit · query · numberPage size (1-40, default 20)
cursor · query · stringOpaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.
Node.js
const res = await fetch(`${BASE}/v1/user/following?userName=elonmusk&limit=20`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/user/verified-followersAPI keyBlue-verified followers only (BlueVerifiedFollowers). Cursor-paginated.
Parameters
userName · query · required · stringX handle without @ (alias: username)
limit · query · numberPage size (1-40, default 20)
cursor · query · stringOpaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.
Node.js
const res = await fetch(`${BASE}/v1/user/verified-followers?userName=elonmusk&limit=20`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);/v1/user/relationshipAPI keyWhether source follows target and vice versa, via X friendships/show. Not scoped to the cookie owner.
Parameters
sourceUserName · query · stringSource handle (alias: source). Provide handle or sourceUserId.
targetUserName · query · stringTarget handle (alias: target). Provide handle or targetUserId.
sourceUserId · query · stringSource numeric rest id (alias: sourceId)
targetUserId · query · stringTarget numeric rest id (alias: targetId)
Node.js
const res = await fetch(`${BASE}/v1/user/relationship?sourceUserName=jack&targetUserName=elonmusk&sourceUserId=12&targetUserId=44196397`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
const data = await res.json();
console.log(data);