Docs

API reference

Profiles, posts, and search for X. Authenticate with an API key. Plan limits are per wallet account. Base: https://api.probeuranus.fun

Authentication

Sign in with a Solana wallet on the dashboard. First login creates a starter API key (shown once). Use Rotate when you need a new secret; the old one stops working immediately. Send the key with every request.

  • API key: Authorization: Bearer <api_key> (or X-API-Key)

Setup

const BASE = "https://api.probeuranus.fun";
const API_KEY = "probe_...";

Plans & limits

Your wallet is on a plan (starter, pro, or unlimited). Quota is shared across that account's keys. 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 minute
  • X-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 name
  • Retry-After · wait time when limited

List 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 the homepage.

Errors

JSON body shape:

Error shape

{ "error": "code", "message": "optional detail" }
  • 401: missing_api_key, invalid_key, inactive, unauthorized
  • 429: rate_limited, daily_quota, monthly_quota
  • 404: not_found
  • 503: x_sessions_exhausted, auth_fail (temporary capacity)
  • 502: temporary request failure

Public

No API key required.

GET/healthPublic

Health check

Health check.

Node.js

const res = await fetch(`${BASE}/health`);
const data = await res.json();
console.log(data);
GET/v1Public

List available API commands

Full list of available commands.

  • Also available at GET / and GET /v1/commands
  • Also available for API tools at GET /v1/openapi.json

Node.js

const res = await fetch(`${BASE}/v1`);
const data = await res.json();
console.log(data);
GET/v1/openapi.jsonPublic

Schema for API tools

Command 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);

API

Needs your API key. Profile lookups may be briefly cached. Add fresh=1 if you need the newest data.

GET/v1/meAPI key

Current account plan and usage

Returns plan limits, remaining RPM/daily/monthly quota, and reset timestamps for the wallet account that owns this API key. Quota is shared across the account's keys.

  • Counts as one request against your account quota
  • Also mirrored on every keyed response via X-RateLimit-* and X-RateLimit-Reset* headers
  • Response envelope: { data, meta }

Node.js

const res = await fetch(`${BASE}/v1/me`, {
  headers: {
    Authorization: `Bearer ${API_KEY}`,
  },
});
const data = await res.json();
console.log(data);
GET/v1/user/infoAPI key

Get user profile and stats

Returns profile fields, follower/following counts, statuses, media counts, etc.

Parameters

  • userName · query · required · string

    X handle without @ (alias: username)

  • fresh · query · boolean

    Bypass cache when 1/true/yes

  • Response envelope: { data, meta } with meta.cached / meta.fetched_at
  • Cache-Control: private, max-age=60 (or CACHE_TTL_MS capped); weak ETag from user id + fetched_at; 304 on If-None-Match

Node.js

const res = await fetch(`${BASE}/v1/user/info?userName=elonmusk&fresh=1`, {
  headers: {
    Authorization: `Bearer ${API_KEY}`,
  },
});
const data = await res.json();
console.log(data);
GET/v1/user/tweetsAPI key

Get latest tweets for a user

User timeline with cursor pagination. Tweets include media[] and isRetweet.

Parameters

  • userName · query · required · string

    X handle without @

  • limit · query · number

    Page size (1-40, default 20)

  • cursor · query · string

    Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.

  • include_replies · query · boolean

    Include reply tweets (default false on /user/tweets, true elsewhere)

  • include_retweets · query · boolean

    Include retweets (default true)

  • media_only · query · boolean

    Only tweets that have media[] (default false)

  • since_id · query · string

    Keep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)

  • until_id · query · string

    Keep tweets with id strictly less than this snowflake (exclusive)

  • Response envelope: { data, next_cursor, cursor, meta }
  • meta.has_next_page mirrors next_cursor; extra context (user, filters, query) lives in meta
  • Pass next_cursor back as ?cursor=. Do not invent or parse cursors

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);
GET/v1/user/tweets-and-repliesAPI key

Get tweets and replies for a user

Timeline including the user's replies (UserTweetsAndReplies). Cursor-paginated.

Parameters

  • userName · query · required · string

    X handle without @

  • limit · query · number

    Page size (1-40, default 20)

  • cursor · query · string

    Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.

  • include_replies · query · boolean

    Include reply tweets (default false on /user/tweets, true elsewhere)

  • include_retweets · query · boolean

    Include retweets (default true)

  • media_only · query · boolean

    Only tweets that have media[] (default false)

  • since_id · query · string

    Keep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)

  • until_id · query · string

    Keep tweets with id strictly less than this snowflake (exclusive)

  • Response envelope: { data, next_cursor, cursor, meta }
  • meta.has_next_page mirrors next_cursor; extra context (user, filters, query) lives in meta
  • Pass next_cursor back as ?cursor=. Do not invent or parse cursors

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);
GET/v1/search/tweetsAPI key

Search tweets

Latest/Top search over X posts.

Parameters

  • query · query · required · string

    Search query (alias: q). Supports X operators.

  • product · query · string

    Latest or Top (default Latest)

  • limit · query · number

    Page size (1-40, default 20)

  • cursor · query · string

    Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.

  • include_replies · query · boolean

    Include reply tweets (default false on /user/tweets, true elsewhere)

  • include_retweets · query · boolean

    Include retweets (default true)

  • media_only · query · boolean

    Only tweets that have media[] (default false)

  • since_id · query · string

    Keep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)

  • until_id · query · string

    Keep tweets with id strictly less than this snowflake (exclusive)

  • Response envelope: { data, next_cursor, cursor, meta }
  • meta.has_next_page mirrors next_cursor; extra context (user, filters, query) lives in meta
  • Pass next_cursor back as ?cursor=. Do not invent or parse cursors

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);
GET/v1/search/usersAPI key

Search users

People search over X accounts via SearchTimeline (product=People). Cursor-paginated.

Parameters

  • query · query · required · string

    Search query (alias: q)

  • limit · query · number

    Page size (1-40, default 20)

  • cursor · query · string

    Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.

  • Response envelope: { data, next_cursor, cursor, meta }
  • meta.has_next_page mirrors next_cursor; extra context (user, filters, query) lives in meta
  • Pass next_cursor back as ?cursor=. Do not invent or parse cursors

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);
GET/v1/user/likesAPI key

Get tweets a user liked

Likes timeline for a public X account. X often returns an empty shell for scraper sessions even when favouritesCount > 0.

Parameters

  • userName · query · required · string

    X handle without @ (alias: username)

  • limit · query · number

    Page size (1-40, default 20)

  • cursor · query · string

    Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.

  • include_replies · query · boolean

    Include reply tweets (default false on /user/tweets, true elsewhere)

  • include_retweets · query · boolean

    Include retweets (default true)

  • media_only · query · boolean

    Only tweets that have media[] (default false)

  • since_id · query · string

    Keep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)

  • until_id · query · string

    Keep tweets with id strictly less than this snowflake (exclusive)

  • Response envelope: { data, next_cursor, cursor, meta }
  • meta.has_next_page mirrors next_cursor; extra context (user, filters, query) lives in meta
  • Pass next_cursor back as ?cursor=. Do not invent or parse cursors
  • Empty data with meta.note means X hid likes from this session. Not necessarily a bug

Node.js

const res = await fetch(`${BASE}/v1/user/likes?userName=jack&limit=20&include_replies=0&include_retweets=1&media_only=1`, {
  headers: {
    Authorization: `Bearer ${API_KEY}`,
  },
});
const data = await res.json();
console.log(data);
GET/v1/user/mediaAPI key

Get media tweets for a user

Media tab timeline (photos/videos/gifs). Cursor-paginated; tweets include media[].

Parameters

  • userName · query · required · string

    X handle without @ (alias: username)

  • limit · query · number

    Page size (1-40, default 20)

  • cursor · query · string

    Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.

  • include_replies · query · boolean

    Include reply tweets (default false on /user/tweets, true elsewhere)

  • include_retweets · query · boolean

    Include retweets (default true)

  • media_only · query · boolean

    Only tweets that have media[] (default false)

  • since_id · query · string

    Keep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)

  • until_id · query · string

    Keep tweets with id strictly less than this snowflake (exclusive)

  • Response envelope: { data, next_cursor, cursor, meta }
  • meta.has_next_page mirrors next_cursor; extra context (user, filters, query) lives in meta
  • Pass next_cursor back as ?cursor=. Do not invent or parse cursors

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);
GET/v1/list/{id}/tweetsAPI key

Get tweets from an X list

Latest tweets from a list by numeric list id. May return empty for some sessions; falls back to search list:id.

Parameters

  • id · path · required · string

    Numeric list id

  • limit · query · number

    Page size (1-40, default 20)

  • cursor · query · string

    Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.

  • include_replies · query · boolean

    Include reply tweets (default false on /user/tweets, true elsewhere)

  • include_retweets · query · boolean

    Include retweets (default true)

  • media_only · query · boolean

    Only tweets that have media[] (default false)

  • since_id · query · string

    Keep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)

  • until_id · query · string

    Keep tweets with id strictly less than this snowflake (exclusive)

  • Response envelope: { data, next_cursor, cursor, meta }
  • meta.has_next_page mirrors next_cursor; extra context (user, filters, query) lives in meta
  • Pass next_cursor back as ?cursor=. Do not invent or parse cursors

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);
GET/v1/community/{id}/tweetsAPI key

Get tweets from an X community

Community timeline (CommunityTweetsTimeline). Cursor-paginated.

Parameters

  • id · path · required · string

    Numeric community id

  • ranking · query · string

    Relevance (default) or Recency (alias: rankingMode)

  • limit · query · number

    Page size (1-40, default 20)

  • cursor · query · string

    Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.

  • include_replies · query · boolean

    Include reply tweets (default false on /user/tweets, true elsewhere)

  • include_retweets · query · boolean

    Include retweets (default true)

  • media_only · query · boolean

    Only tweets that have media[] (default false)

  • since_id · query · string

    Keep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)

  • until_id · query · string

    Keep tweets with id strictly less than this snowflake (exclusive)

  • Response envelope: { data, next_cursor, cursor, meta }
  • meta.has_next_page mirrors next_cursor; extra context (user, filters, query) lives in meta
  • Pass next_cursor back as ?cursor=. Do not invent or parse cursors

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);
GET/v1/tweet/{id}API key

Get a tweet by id

Returns a single post with author, media[], and engagement counts (likes, replies, retweets, quotes, bookmarks, views).

Parameters

  • id · path · required · string

    Numeric tweet/status id

  • Response envelope: { data, meta }
  • Cache-Control: private, max-age=60 (or CACHE_TTL_MS capped); weak ETag from tweet id; 304 on If-None-Match

Node.js

const res = await fetch(`${BASE}/v1/tweet/20`, {
  headers: {
    Authorization: `Bearer ${API_KEY}`,
  },
});
const data = await res.json();
console.log(data);
GET/v1/tweet/by-urlAPI key

Get a tweet by X/Twitter URL

Accepts 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 · string

    Status URL (alias: u)

  • Response envelope: { data, meta }
  • Cache-Control: private, max-age=60 (or CACHE_TTL_MS capped); weak ETag from tweet id; 304 on If-None-Match

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);
GET/v1/tweet/{id}/repliesAPI key

Get replies to a tweet

Conversation replies for a post (commenters + engagement). Cursor-paginated.

Parameters

  • id · path · required · string

    Numeric tweet/status id

  • limit · query · number

    Page size (1-40, default 20)

  • cursor · query · string

    Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.

  • Response envelope: { data, next_cursor, cursor, meta }
  • meta.has_next_page mirrors next_cursor; extra context (user, filters, query) lives in meta
  • Pass next_cursor back as ?cursor=. Do not invent or parse cursors
  • Parent tweet (when available) is in meta.tweet

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);
GET/v1/tweet/{id}/retweetersAPI key

List users who retweeted a tweet

Retweeters for a post. Cursor-paginated.

Parameters

  • id · path · required · string

    Numeric tweet/status id

  • limit · query · number

    Page size (1-40, default 20)

  • cursor · query · string

    Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.

  • Response envelope: { data, next_cursor, cursor, meta }
  • meta.has_next_page mirrors next_cursor; extra context (user, filters, query) lives in meta
  • Pass next_cursor back as ?cursor=. Do not invent or parse cursors

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);
POST/v1/tweetsAPI key

Batch fetch tweets by id

Fetch up to 25 tweets in one request. Partial failures return in errors[].

Parameters

  • ids · body · required · string

    Array of tweet ids or status URLs (alias: tweetIds), max 25

  • Response envelope: { data, meta } with meta.errors / meta.max

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);
POST/v1/usersAPI key

Batch fetch user profiles

Fetch up to 25 profiles in one request. Partial failures return in errors[].

Parameters

  • userNames · body · required · string

    Array of handles without @ (alias: usernames), max 25

  • Response envelope: { data, meta } with meta.errors / meta.max

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",
      "elonmusk"
    ]
  }),
});
const data = await res.json();
console.log(data);
GET/v1/user/followersAPI key

List followers for a user

Followers of an X account. Cursor-paginated.

Parameters

  • userName · query · required · string

    X handle without @ (alias: username)

  • limit · query · number

    Page size (1-40, default 20)

  • cursor · query · string

    Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.

  • Response envelope: { data, next_cursor, cursor, meta }
  • meta.has_next_page mirrors next_cursor; extra context (user, filters, query) lives in meta
  • Pass next_cursor back as ?cursor=. Do not invent or parse cursors

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);
GET/v1/user/followingAPI key

List accounts a user follows

Following list for an X account. Cursor-paginated.

Parameters

  • userName · query · required · string

    X handle without @ (alias: username)

  • limit · query · number

    Page size (1-40, default 20)

  • cursor · query · string

    Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.

  • Response envelope: { data, next_cursor, cursor, meta }
  • meta.has_next_page mirrors next_cursor; extra context (user, filters, query) lives in meta
  • Pass next_cursor back as ?cursor=. Do not invent or parse cursors

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);

More formats