# Probe Uranus — full API reference > Profiles, posts, and search for X. Authenticate with an API key. Plan limits are per account. Version: 1.11.0 Base URL: https://api.probeuranus.fun Human docs: https://www.probeuranus.fun/docs OpenAPI: https://api.probeuranus.fun/v1/openapi.json Machine catalog: https://api.probeuranus.fun/v1 Probe Uranus is an independent, read-only HTTP API for public X (Twitter) data. It is not the official X API and is not affiliated with X Corp. There are no write endpoints: you cannot post, like, retweet, follow, or send DMs through it. ## Authentication Send `Authorization: Bearer `. Or send the key in `X-API-Key`. Keys are created from the dashboard at https://www.probeuranus.fun/dashboard after signing in with Google. A key with no active subscription answers `402`. ## Quotas and errors Limits are per account, not per key, and apply as requests per minute, per day, and per calendar month. `GET /v1/me` reports the remaining budget in each window. Over-limit requests answer `429`; an unknown or revoked key answers `401`; a valid key with no entitlement answers `402`. ## Pricing One plan, billed monthly, with a free trial to start. Current amounts and limits: https://www.probeuranus.fun/pricing ## Endpoints ### GET /health Health check Service liveness plus scraper session pool status (operational | degraded | down). Auth: none (public) ### GET /v1 List available API commands Full list of available commands. Auth: none (public) Notes: - Also available at GET / and GET /v1/commands - Also available for API tools at GET /v1/openapi.json ### GET /v1/openapi.json Schema for API tools Command list in a format API tools understand. Auth: none (public) ### GET /v1/me Current account plan and usage Returns plan limits, remaining RPM/daily/monthly quota, and reset timestamps for the account that owns this API key. Auth: API key Notes: - 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 } ### GET /v1/user/info Get user profile and stats Returns profile fields, follower/following counts, statuses, media counts, etc. Lookup by handle or numeric rest id. Auth: API key Parameters: - `userName` (query, string) — X handle without @ (alias: username). Provide userName or userId. Example: `elonmusk` - `userId` (query, string) — Numeric rest id (alias: user_id). Use when you store ids instead of handles. Example: `44196397` - `fresh` (query, boolean) — Bypass cache when 1/true/yes Example: `1` - `include_space` (query, boolean) — Look up whether the account is in a live Space (default true). Set 0/false/no to skip. Example: `1` - `include_broadcast` (query, boolean) — Look up whether the account is running a live video broadcast (default true). Set 0/false/no to skip. Example: `1` Notes: - 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 - userName takes precedence if both are sent - data.currentSpace is live (fleets), not from the profile cache. Pass include_space=0 to skip. - data.currentBroadcast is the live video stream they are hosting, or null. X does not expose watchers. Pass include_broadcast=0 to skip. ### GET /v1/user/tweets Get latest tweets for a user User timeline with cursor pagination. Tweets include media[] (url, previewUrl, width/height, durationMs, altText, variants[] with contentType/url/bitrate). Auth: API key Parameters: - `userName` (query, string, required) — X handle without @ Example: `elonmusk` - `limit` (query, number) — Page size (1-40, default 20) Example: `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) Example: `0` - `include_retweets` (query, boolean) — Include retweets (default true) Example: `1` - `media_only` (query, boolean) — Only tweets that have media[] (default false) Example: `1` - `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) Notes: - 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 - Posts include createdAt (X date string), createdAtMs (unix ms), and createdAtIso (ISO-8601). On a retweet, createdAt is when it was reposted; retweetedStatus is the original post. Quotes expose quotedStatus the same way. ### GET /v1/user/tweets-and-replies Get tweets and replies for a user Timeline including the user's replies (UserTweetsAndReplies). Cursor-paginated. Auth: API key Parameters: - `userName` (query, string, required) — X handle without @ Example: `elonmusk` - `limit` (query, number) — Page size (1-40, default 20) Example: `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) Example: `0` - `include_retweets` (query, boolean) — Include retweets (default true) Example: `1` - `media_only` (query, boolean) — Only tweets that have media[] (default false) Example: `1` - `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) Notes: - 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 - Posts include createdAt (X date string), createdAtMs (unix ms), and createdAtIso (ISO-8601). On a retweet, createdAt is when it was reposted; retweetedStatus is the original post. Quotes expose quotedStatus the same way. ### GET /v1/user/mentions Get tweets mentioning a user Tweets that mention an account (SearchTimeline `@handle -from:handle`). Cursor-paginated. Not the authenticated user's notification inbox. Auth: API key Parameters: - `userName` (query, string, required) — X handle without @ (alias: username) Example: `elonmusk` - `product` (query, string) — Latest or Top (default Latest) Example: `Latest` - `limit` (query, number) — Page size (1-40, default 20) Example: `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) Example: `0` - `include_retweets` (query, boolean) — Include retweets (default true) Example: `1` - `media_only` (query, boolean) — Only tweets that have media[] (default false) Example: `1` - `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) Notes: - 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 - Posts include createdAt (X date string), createdAtMs (unix ms), and createdAtIso (ISO-8601). On a retweet, createdAt is when it was reposted; retweetedStatus is the original post. Quotes expose quotedStatus the same way. - meta.query is the search string used; equivalent to GET /v1/search/tweets?query=@handle%20-from:handle ### GET /v1/search/tweets Search tweets Latest/Top search over X posts. Auth: API key Parameters: - `query` (query, string, required) — Search query (alias: q). Supports X operators. Example: `solana` - `product` (query, string) — Latest or Top (default Latest) Example: `Latest` - `limit` (query, number) — Page size (1-40, default 20) Example: `5` - `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) Example: `0` - `include_retweets` (query, boolean) — Include retweets (default true) Example: `1` - `media_only` (query, boolean) — Only tweets that have media[] (default false) Example: `1` - `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) Notes: - 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 - Posts include createdAt (X date string), createdAtMs (unix ms), and createdAtIso (ISO-8601). On a retweet, createdAt is when it was reposted; retweetedStatus is the original post. Quotes expose quotedStatus the same way. ### GET /v1/search/users Search users People search over X accounts via SearchTimeline (product=People). Cursor-paginated. Auth: API key Parameters: - `query` (query, string, required) — Search query (alias: q) Example: `solana` - `limit` (query, number) — Page size (1-40, default 20) Example: `20` - `cursor` (query, string) — Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged. Notes: - 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 - Posts include createdAt (X date string), createdAtMs (unix ms), and createdAtIso (ISO-8601). On a retweet, createdAt is when it was reposted; retweetedStatus is the original post. Quotes expose quotedStatus the same way. ### GET /v1/user/media Get media tweets for a user Media tab timeline (photos/videos/gifs). Cursor-paginated; tweets include media[] (altText and video variants[]). Auth: API key Parameters: - `userName` (query, string, required) — X handle without @ (alias: username) Example: `nasa` - `limit` (query, number) — Page size (1-40, default 20) Example: `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) Example: `0` - `include_retweets` (query, boolean) — Include retweets (default true) Example: `1` - `media_only` (query, boolean) — Only tweets that have media[] (default false) Example: `1` - `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) Notes: - 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 - Posts include createdAt (X date string), createdAtMs (unix ms), and createdAtIso (ISO-8601). On a retweet, createdAt is when it was reposted; retweetedStatus is the original post. Quotes expose quotedStatus the same way. ### GET /v1/list/{id}/tweets Get tweets from an X list Latest tweets from a public list by numeric list id. Cursor-paginated. Auth: API key Parameters: - `id` (path, string, required) — Numeric list id Example: `1539453138322673664` - `limit` (query, number) — Page size (1-40, default 20) Example: `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) Example: `0` - `include_retweets` (query, boolean) — Include retweets (default true) Example: `1` - `media_only` (query, boolean) — Only tweets that have media[] (default false) Example: `1` - `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) Notes: - 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 - Posts include createdAt (X date string), createdAtMs (unix ms), and createdAtIso (ISO-8601). On a retweet, createdAt is when it was reposted; retweetedStatus is the original post. Quotes expose quotedStatus the same way. ### GET /v1/community/{id}/tweets Get tweets from an X community Community timeline (CommunityTweetsTimeline). Cursor-paginated. Auth: API key Parameters: - `id` (path, string, required) — Numeric community id Example: `1489422448332197888` - `ranking` (query, string) — Relevance (default) or Recency (alias: rankingMode) Example: `Relevance` - `limit` (query, number) — Page size (1-40, default 20) Example: `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) Example: `0` - `include_retweets` (query, boolean) — Include retweets (default true) Example: `1` - `media_only` (query, boolean) — Only tweets that have media[] (default false) Example: `1` - `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) Notes: - 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 - Posts include createdAt (X date string), createdAtMs (unix ms), and createdAtIso (ISO-8601). On a retweet, createdAt is when it was reposted; retweetedStatus is the original post. Quotes expose quotedStatus the same way. ### GET /v1/community/{id} Get community metadata Community name, description, member count, join policy (CommunityQuery). Auth: API key Parameters: - `id` (path, string, required) — Numeric community id Example: `1489422448332197888` Notes: - Response envelope: { data, meta } ### GET /v1/space/{id} Get an X Space Title, state, start time, listener counts, host/admins/speakers, and a listener sample (AudioSpaceById). Auth: API key Parameters: - `id` (path, string, required) — Space id from x.com/i/spaces/{id} (e.g. 1wxWjlvBZynJQ). Full space URLs are also accepted. Example: `1wxWjlvBZynJQ` Notes: - Response envelope: { data, meta } - state is running | ended | scheduled | canceled | unknown - listeners[] is a sample; compare listeners.length to listenerCount. Silent listeners are not a complete roster. - admins = hosts/co-hosts, speakers = on-stage guests ### GET /v1/space/{id}/users Get users in an X Space Hosts, on-stage speakers, and a listener sample for a Space. Filter with role=admins|speakers|listeners|on_stage|all. Auth: API key Parameters: - `id` (path, string, required) — Space id (same as /v1/space/{id}) Example: `1wxWjlvBZynJQ` - `role` (query, string) — all (default), admins, speakers, listeners, or on_stage (admins+speakers) Example: `on_stage` Notes: - Response envelope: { data, next_cursor, cursor, meta } — snapshot, not cursor-paged - Each row: id, userName, name, profileImageUrl, isBlueVerified, role, joinedAt* - meta.listener_sample is true when listeners.length < listenerCount ### GET /v1/broadcast/{id} Get an X broadcast (live video) Title, state, host, viewer counts, thumbnail, and start time for a live or replayable video broadcast. Auth: API key Parameters: - `id` (path, string, required) — Broadcast id from x.com/i/broadcasts/{id} (e.g. 1nxeLMkBVgYJX). Full broadcast URLs are also accepted. Example: `1nxeLMkBVgYJX` Notes: - Response envelope: { data, meta } - state is running | ended | scheduled | canceled | unknown - X does not expose a watcher roster — only watchingCount / watchedCount - host is the account running the stream ### GET /v1/trends Trending topics by location Trending topics for a Yahoo WOEID via X trends/place. 1 = Worldwide. Tweet volumes are what X returns (often null). Auth: API key Parameters: - `woeid` (query, number) — Yahoo WOEID (alias: id). Default 1 (Worldwide). US = 23424977. Example: `1` Notes: - Response envelope: { data, next_cursor, cursor, meta } — next_cursor is always null - Each trend: name, query, url, tweetVolume - This is not a tweet-volume time series (X tweets/counts/recent). Use search for that. ### GET /v1/tweet/{id} Get a tweet by id Returns a single post with author, media[] (including altText and video variants[]), and engagement counts (likes, replies, retweets, quotes, bookmarks, views). Auth: API key Parameters: - `id` (path, string, required) — Numeric tweet/status id Example: `20` Notes: - 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 ### GET /v1/tweet/by-url 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. Auth: API key Parameters: - `url` (query, string, required) — Status URL (alias: u) Example: `https://x.com/jack/status/20` Notes: - 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 ### GET /v1/tweet/{id}/replies Get replies to a tweet Conversation replies for a post (commenters + engagement). Cursor-paginated. Auth: API key Parameters: - `id` (path, string, required) — Numeric tweet/status id Example: `20` - `limit` (query, number) — Page size (1-40, default 20) Example: `20` - `cursor` (query, string) — Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged. Notes: - 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 - Posts include createdAt (X date string), createdAtMs (unix ms), and createdAtIso (ISO-8601). On a retweet, createdAt is when it was reposted; retweetedStatus is the original post. Quotes expose quotedStatus the same way. - Parent tweet (when available) is in meta.tweet ### GET /v1/tweet/{id}/thread Get thread context for a tweet Parent chain (ancestors, oldest first), the focal tweet, and first-page replies from TweetDetail. Auth: API key Parameters: - `id` (path, string, required) — Numeric tweet/status id (any tweet in the thread) Example: `20` - `limit` (query, number) — Page size (1-40, default 20) Example: `20` - `cursor` (query, string) — Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged. Notes: - Response envelope: { data, meta } with data.tweet, data.ancestors, data.replies - Pass meta.next_cursor as ?cursor= to page more replies - Missing parents are fetched up the inReplyTo chain (bounded) ### GET /v1/tweet/{id}/retweeters List users who retweeted a tweet Retweeters for a post. Cursor-paginated. Auth: API key Parameters: - `id` (path, string, required) — Numeric tweet/status id Example: `20` - `limit` (query, number) — Page size (1-40, default 20) Example: `20` - `cursor` (query, string) — Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged. Notes: - 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 - Posts include createdAt (X date string), createdAtMs (unix ms), and createdAtIso (ISO-8601). On a retweet, createdAt is when it was reposted; retweetedStatus is the original post. Quotes expose quotedStatus the same way. - createdAt is the account join date. X does not expose when each user retweeted. ### GET /v1/tweet/{id}/likes Like count for a tweet Returns 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}. Auth: API key Parameters: - `id` (path, string, required) — Numeric tweet/status id Example: `20` Notes: - Response envelope: { data, meta } - data: { id, likes } ### GET /v1/tweet/{id}/quotes List quote tweets of a tweet Quote posts for a status via search (quoted_tweet_id). Cursor-paginated. Auth: API key Parameters: - `id` (path, string, required) — Numeric tweet/status id Example: `20` - `limit` (query, number) — Page size (1-40, default 20) Example: `20` - `cursor` (query, string) — Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged. Notes: - 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 - Posts include createdAt (X date string), createdAtMs (unix ms), and createdAtIso (ISO-8601). On a retweet, createdAt is when it was reposted; retweetedStatus is the original post. Quotes expose quotedStatus the same way. ### GET /v1/tweet/{id}/quoters List users who quoted a tweet Unique authors of quote tweets. Cursor-paginated (same cursor as /quotes). Auth: API key Parameters: - `id` (path, string, required) — Numeric tweet/status id Example: `20` - `limit` (query, number) — Page size (1-40, default 20) Example: `20` - `cursor` (query, string) — Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged. Notes: - 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 - Posts include createdAt (X date string), createdAtMs (unix ms), and createdAtIso (ISO-8601). On a retweet, createdAt is when it was reposted; retweetedStatus is the original post. Quotes expose quotedStatus the same way. - quotedAt / quotedAtMs / quotedAtIso is when that user posted the quote tweet. ### GET /v1/tweet/{id}/engagers Build an engager pool / pick winners Pages 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. Auth: API key Parameters: - `id` (path, string, required) — Numeric tweet/status id Example: `20` - `types` (query, string) — Comma list: retweet,reply,quote (default retweet,reply,quote). like is accepted but skipped — identities are unavailable Example: `retweet,reply,quote` - `mode` (query, string) — union (any selected type) or intersect (all selected types) Example: `union` - `max_pages` (query, number) — Pages to pull per type (1-10, default 3) Example: `3` - `limit` (query, number) — Page size (1-40, default 20) Example: `20` - `winners` (query, number) — If set, data is a random sample of this size from the pool Example: `5` - `seed` (query, number) — Optional RNG seed for reproducible winner picks Example: `42` Notes: - Response envelope: { data, meta } - meta.counts has per-type and pool sizes; meta.notes explains skipped like identities - Without winners, data is the full deduped pool ### POST /v1/tweets Batch fetch tweets by id Fetch up to 25 tweets in one request. Partial failures return in errors[]. Auth: API key Body (application/json): - `ids` (body, string, required) — Array of tweet ids or status URLs (alias: tweetIds), max 25 Example: `20` ```json { "ids": [ "20", "https://x.com/jack/status/20" ] } ``` Notes: - Response envelope: { data, meta } with meta.errors / meta.max ### POST /v1/users Batch fetch user profiles Fetch up to 25 profiles in one request by handle and/or numeric rest id. Partial failures return in errors[]. Auth: API key Body (application/json): - `userNames` (body, string) — Array of handles without @ (alias: usernames) Example: `jack` - `userIds` (body, string) — Array of numeric rest ids (alias: ids) Example: `44196397` ```json { "userNames": [ "jack" ], "userIds": [ "44196397" ] } ``` Notes: - Response envelope: { data, meta } with meta.errors / meta.max - Each user includes currentSpace and currentBroadcast (live fleets lookup) or null ### GET /v1/user/followers List followers for a user Followers of an X account. Cursor-paginated. Auth: API key Parameters: - `userName` (query, string, required) — X handle without @ (alias: username) Example: `elonmusk` - `limit` (query, number) — Page size (1-40, default 20) Example: `20` - `cursor` (query, string) — Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged. Notes: - 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 - Posts include createdAt (X date string), createdAtMs (unix ms), and createdAtIso (ISO-8601). On a retweet, createdAt is when it was reposted; retweetedStatus is the original post. Quotes expose quotedStatus the same way. ### GET /v1/user/following List accounts a user follows Following list for an X account. Cursor-paginated. Auth: API key Parameters: - `userName` (query, string, required) — X handle without @ (alias: username) Example: `elonmusk` - `limit` (query, number) — Page size (1-40, default 20) Example: `20` - `cursor` (query, string) — Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged. Notes: - 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 - Posts include createdAt (X date string), createdAtMs (unix ms), and createdAtIso (ISO-8601). On a retweet, createdAt is when it was reposted; retweetedStatus is the original post. Quotes expose quotedStatus the same way. ### GET /v1/user/verified-followers List verified followers for a user Blue-verified followers only (BlueVerifiedFollowers). Cursor-paginated. Auth: API key Parameters: - `userName` (query, string, required) — X handle without @ (alias: username) Example: `elonmusk` - `limit` (query, number) — Page size (1-40, default 20) Example: `20` - `cursor` (query, string) — Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged. Notes: - 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 - Posts include createdAt (X date string), createdAtMs (unix ms), and createdAtIso (ISO-8601). On a retweet, createdAt is when it was reposted; retweetedStatus is the original post. Quotes expose quotedStatus the same way. ### GET /v1/user/relationship Check follow relationship between two users Whether source follows target and vice versa, via X friendships/show. Not scoped to the cookie owner. Auth: API key Parameters: - `sourceUserName` (query, string) — Source handle (alias: source). Provide handle or sourceUserId. Example: `jack` - `targetUserName` (query, string) — Target handle (alias: target). Provide handle or targetUserId. Example: `elonmusk` - `sourceUserId` (query, string) — Source numeric rest id (alias: sourceId) Example: `12` - `targetUserId` (query, string) — Target numeric rest id (alias: targetId) Example: `44196397` Notes: - Response envelope: { data, meta } - data.source.following is true when source follows target - meta.source_follows_target / meta.target_follows_source mirror those flags ## Other pages - https://www.probeuranus.fun/ — overview and FAQ - https://www.probeuranus.fun/compare — cost per 1,000 calls against the official X API and TwitterAPI.io - https://www.probeuranus.fun/giveaway — free giveaway winner picker built on `GET /v1/tweet/{id}/engagers` - https://www.probeuranus.fun/blog — guides on X API pricing and alternatives - https://www.probeuranus.fun/privacy — data collected and how to delete it - https://www.probeuranus.fun/terms — API, trial, and billing rules