{"openapi":"3.0.3","info":{"title":"Probe Uranus","version":"1.2.1","description":"Profiles, posts, and search for X. Authenticate with an API key. Plan limits are per wallet account."},"servers":[{"url":"http://api.probeuranus.fun"}],"components":{"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string","example":"not_found"},"message":{"type":"string","example":"User not found"}}},"NormalizedUser":{"type":"object","properties":{"id":{"type":"string"},"userName":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"followers":{"type":"integer"},"following":{"type":"integer"},"verified":{"type":"boolean"},"isBlueVerified":{"type":"boolean"},"profileImageUrl":{"type":"string","nullable":true}}},"NormalizedTweet":{"type":"object","properties":{"id":{"type":"string"},"text":{"type":"string"},"createdAt":{"type":"string","nullable":true},"isRetweet":{"type":"boolean"},"favoriteCount":{"type":"integer"},"retweetCount":{"type":"integer"},"replyCount":{"type":"integer"},"media":{"type":"array","items":{"type":"object"}},"author":{"type":"object","properties":{"id":{"type":"string"},"userName":{"type":"string"},"name":{"type":"string"}}}}},"ListEnvelope":{"type":"object","required":["data","next_cursor","cursor","meta"],"properties":{"data":{"type":"array","items":{}},"next_cursor":{"type":"string","nullable":true},"cursor":{"type":"string","nullable":true},"meta":{"type":"object","properties":{"has_next_page":{"type":"boolean"},"result_count":{"type":"integer"}},"additionalProperties":true}}},"ItemEnvelope":{"type":"object","required":["data","meta"],"properties":{"data":{},"meta":{"type":"object","additionalProperties":true}}}},"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","description":"API key from POST /v1/admin/keys"},"AdminSecret":{"type":"apiKey","in":"header","name":"X-Admin-Secret"}}},"paths":{"/health":{"get":{"operationId":"health","summary":"Health check","description":"Health check.","tags":["none"],"parameters":[],"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1":{"get":{"operationId":"catalog","summary":"List available API commands","description":"Full list of available commands.","tags":["none"],"parameters":[],"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/openapi.json":{"get":{"operationId":"openapi","summary":"Schema for API tools","description":"Command list in a format API tools understand.","tags":["none"],"parameters":[],"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/me":{"get":{"operationId":"me","summary":"Current account plan and usage","description":"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.","tags":["api_key"],"parameters":[],"responses":{"200":{"description":"Single item or batch payload","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ItemEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NormalizedUser"}}}]},"example":{"data":{"id":"12","userName":"jack","name":"jack","followers":1000000},"meta":{"cached":false,"fetched_at":1700000000000}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/user/info":{"get":{"operationId":"user_info","summary":"Get user profile and stats","description":"Returns profile fields, follower/following counts, statuses, media counts, etc.","tags":["api_key"],"parameters":[{"name":"userName","in":"query","required":true,"description":"X handle without @ (alias: username)","schema":{"type":"string"},"example":"elonmusk"},{"name":"fresh","in":"query","required":false,"description":"Bypass cache when 1/true/yes","schema":{"type":"string"},"example":"1"}],"responses":{"200":{"description":"Single item or batch payload","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ItemEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NormalizedUser"}}}]},"example":{"data":{"id":"12","userName":"jack","name":"jack","followers":1000000},"meta":{"cached":false,"fetched_at":1700000000000}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/user/tweets":{"get":{"operationId":"user_tweets","summary":"Get latest tweets for a user","description":"User timeline with cursor pagination. Tweets include media[] and isRetweet.","tags":["api_key"],"parameters":[{"name":"userName","in":"query","required":true,"description":"X handle without @","schema":{"type":"string"},"example":"elonmusk"},{"name":"limit","in":"query","required":false,"description":"Page size (1-40, default 20)","schema":{"type":"number"},"example":20},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.","schema":{"type":"string"}},{"name":"include_replies","in":"query","required":false,"description":"Include reply tweets (default false on /user/tweets, true elsewhere)","schema":{"type":"string"},"example":"0"},{"name":"include_retweets","in":"query","required":false,"description":"Include retweets (default true)","schema":{"type":"string"},"example":"1"},{"name":"media_only","in":"query","required":false,"description":"Only tweets that have media[] (default false)","schema":{"type":"string"},"example":"1"},{"name":"since_id","in":"query","required":false,"description":"Keep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)","schema":{"type":"string"}},{"name":"until_id","in":"query","required":false,"description":"Keep tweets with id strictly less than this snowflake (exclusive)","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ListEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NormalizedTweet"}}}}]},"example":{"data":[{"id":"20","text":"just setting up my twttr","isRetweet":false,"author":{"id":"12","userName":"jack","name":"jack"}}],"next_cursor":"cursor-example","cursor":"cursor-example","meta":{"has_next_page":true,"result_count":1}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/user/tweets-and-replies":{"get":{"operationId":"user_tweets_and_replies","summary":"Get tweets and replies for a user","description":"Timeline including the user's replies (UserTweetsAndReplies). Cursor-paginated.","tags":["api_key"],"parameters":[{"name":"userName","in":"query","required":true,"description":"X handle without @","schema":{"type":"string"},"example":"elonmusk"},{"name":"limit","in":"query","required":false,"description":"Page size (1-40, default 20)","schema":{"type":"number"},"example":20},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.","schema":{"type":"string"}},{"name":"include_replies","in":"query","required":false,"description":"Include reply tweets (default false on /user/tweets, true elsewhere)","schema":{"type":"string"},"example":"0"},{"name":"include_retweets","in":"query","required":false,"description":"Include retweets (default true)","schema":{"type":"string"},"example":"1"},{"name":"media_only","in":"query","required":false,"description":"Only tweets that have media[] (default false)","schema":{"type":"string"},"example":"1"},{"name":"since_id","in":"query","required":false,"description":"Keep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)","schema":{"type":"string"}},{"name":"until_id","in":"query","required":false,"description":"Keep tweets with id strictly less than this snowflake (exclusive)","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ListEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NormalizedTweet"}}}}]},"example":{"data":[{"id":"20","text":"just setting up my twttr","isRetweet":false,"author":{"id":"12","userName":"jack","name":"jack"}}],"next_cursor":"cursor-example","cursor":"cursor-example","meta":{"has_next_page":true,"result_count":1}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/search/tweets":{"get":{"operationId":"search_tweets","summary":"Search tweets","description":"Latest/Top search over X posts.","tags":["api_key"],"parameters":[{"name":"query","in":"query","required":true,"description":"Search query (alias: q). Supports X operators.","schema":{"type":"string"},"example":"solana"},{"name":"product","in":"query","required":false,"description":"Latest or Top (default Latest)","schema":{"type":"string"},"example":"Latest"},{"name":"limit","in":"query","required":false,"description":"Page size (1-40, default 20)","schema":{"type":"number"},"example":5},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.","schema":{"type":"string"}},{"name":"include_replies","in":"query","required":false,"description":"Include reply tweets (default false on /user/tweets, true elsewhere)","schema":{"type":"string"},"example":"0"},{"name":"include_retweets","in":"query","required":false,"description":"Include retweets (default true)","schema":{"type":"string"},"example":"1"},{"name":"media_only","in":"query","required":false,"description":"Only tweets that have media[] (default false)","schema":{"type":"string"},"example":"1"},{"name":"since_id","in":"query","required":false,"description":"Keep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)","schema":{"type":"string"}},{"name":"until_id","in":"query","required":false,"description":"Keep tweets with id strictly less than this snowflake (exclusive)","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ListEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NormalizedTweet"}}}}]},"example":{"data":[{"id":"20","text":"just setting up my twttr","isRetweet":false,"author":{"id":"12","userName":"jack","name":"jack"}}],"next_cursor":"cursor-example","cursor":"cursor-example","meta":{"has_next_page":true,"result_count":1}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/search/users":{"get":{"operationId":"search_users","summary":"Search users","description":"People search over X accounts via SearchTimeline (product=People). Cursor-paginated.","tags":["api_key"],"parameters":[{"name":"query","in":"query","required":true,"description":"Search query (alias: q)","schema":{"type":"string"},"example":"solana"},{"name":"limit","in":"query","required":false,"description":"Page size (1-40, default 20)","schema":{"type":"number"},"example":20},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ListEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NormalizedUser"}}}}]},"example":{"data":[{"id":"20","text":"just setting up my twttr","isRetweet":false,"author":{"id":"12","userName":"jack","name":"jack"}}],"next_cursor":"cursor-example","cursor":"cursor-example","meta":{"has_next_page":true,"result_count":1}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/user/likes":{"get":{"operationId":"user_likes","summary":"Get tweets a user liked","description":"Likes timeline for a public X account. X often returns an empty shell for scraper sessions even when favouritesCount > 0.","tags":["api_key"],"parameters":[{"name":"userName","in":"query","required":true,"description":"X handle without @ (alias: username)","schema":{"type":"string"},"example":"jack"},{"name":"limit","in":"query","required":false,"description":"Page size (1-40, default 20)","schema":{"type":"number"},"example":20},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.","schema":{"type":"string"}},{"name":"include_replies","in":"query","required":false,"description":"Include reply tweets (default false on /user/tweets, true elsewhere)","schema":{"type":"string"},"example":"0"},{"name":"include_retweets","in":"query","required":false,"description":"Include retweets (default true)","schema":{"type":"string"},"example":"1"},{"name":"media_only","in":"query","required":false,"description":"Only tweets that have media[] (default false)","schema":{"type":"string"},"example":"1"},{"name":"since_id","in":"query","required":false,"description":"Keep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)","schema":{"type":"string"}},{"name":"until_id","in":"query","required":false,"description":"Keep tweets with id strictly less than this snowflake (exclusive)","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ListEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NormalizedTweet"}}}}]},"example":{"data":[{"id":"20","text":"just setting up my twttr","isRetweet":false,"author":{"id":"12","userName":"jack","name":"jack"}}],"next_cursor":"cursor-example","cursor":"cursor-example","meta":{"has_next_page":true,"result_count":1}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/user/media":{"get":{"operationId":"user_media","summary":"Get media tweets for a user","description":"Media tab timeline (photos/videos/gifs). Cursor-paginated; tweets include media[].","tags":["api_key"],"parameters":[{"name":"userName","in":"query","required":true,"description":"X handle without @ (alias: username)","schema":{"type":"string"},"example":"nasa"},{"name":"limit","in":"query","required":false,"description":"Page size (1-40, default 20)","schema":{"type":"number"},"example":20},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.","schema":{"type":"string"}},{"name":"include_replies","in":"query","required":false,"description":"Include reply tweets (default false on /user/tweets, true elsewhere)","schema":{"type":"string"},"example":"0"},{"name":"include_retweets","in":"query","required":false,"description":"Include retweets (default true)","schema":{"type":"string"},"example":"1"},{"name":"media_only","in":"query","required":false,"description":"Only tweets that have media[] (default false)","schema":{"type":"string"},"example":"1"},{"name":"since_id","in":"query","required":false,"description":"Keep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)","schema":{"type":"string"}},{"name":"until_id","in":"query","required":false,"description":"Keep tweets with id strictly less than this snowflake (exclusive)","schema":{"type":"string"}}],"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/list/{id}/tweets":{"get":{"operationId":"list_tweets","summary":"Get tweets from an X list","description":"Latest tweets from a list by numeric list id. May return empty for some sessions; falls back to search list:id.","tags":["api_key"],"parameters":[{"name":"id","in":"path","required":true,"description":"Numeric list id","schema":{"type":"string"},"example":"1539453138322673664"},{"name":"limit","in":"query","required":false,"description":"Page size (1-40, default 20)","schema":{"type":"number"},"example":20},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.","schema":{"type":"string"}},{"name":"include_replies","in":"query","required":false,"description":"Include reply tweets (default false on /user/tweets, true elsewhere)","schema":{"type":"string"},"example":"0"},{"name":"include_retweets","in":"query","required":false,"description":"Include retweets (default true)","schema":{"type":"string"},"example":"1"},{"name":"media_only","in":"query","required":false,"description":"Only tweets that have media[] (default false)","schema":{"type":"string"},"example":"1"},{"name":"since_id","in":"query","required":false,"description":"Keep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)","schema":{"type":"string"}},{"name":"until_id","in":"query","required":false,"description":"Keep tweets with id strictly less than this snowflake (exclusive)","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ListEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NormalizedTweet"}}}}]},"example":{"data":[{"id":"20","text":"just setting up my twttr","isRetweet":false,"author":{"id":"12","userName":"jack","name":"jack"}}],"next_cursor":"cursor-example","cursor":"cursor-example","meta":{"has_next_page":true,"result_count":1}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/community/{id}/tweets":{"get":{"operationId":"community_tweets","summary":"Get tweets from an X community","description":"Community timeline (CommunityTweetsTimeline). Cursor-paginated.","tags":["api_key"],"parameters":[{"name":"id","in":"path","required":true,"description":"Numeric community id","schema":{"type":"string"},"example":"1489422448332197888"},{"name":"ranking","in":"query","required":false,"description":"Relevance (default) or Recency (alias: rankingMode)","schema":{"type":"string"},"example":"Relevance"},{"name":"limit","in":"query","required":false,"description":"Page size (1-40, default 20)","schema":{"type":"number"},"example":20},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.","schema":{"type":"string"}},{"name":"include_replies","in":"query","required":false,"description":"Include reply tweets (default false on /user/tweets, true elsewhere)","schema":{"type":"string"},"example":"0"},{"name":"include_retweets","in":"query","required":false,"description":"Include retweets (default true)","schema":{"type":"string"},"example":"1"},{"name":"media_only","in":"query","required":false,"description":"Only tweets that have media[] (default false)","schema":{"type":"string"},"example":"1"},{"name":"since_id","in":"query","required":false,"description":"Keep tweets with id strictly greater than this snowflake (page filter; keep paging with cursor)","schema":{"type":"string"}},{"name":"until_id","in":"query","required":false,"description":"Keep tweets with id strictly less than this snowflake (exclusive)","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ListEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NormalizedTweet"}}}}]},"example":{"data":[{"id":"20","text":"just setting up my twttr","isRetweet":false,"author":{"id":"12","userName":"jack","name":"jack"}}],"next_cursor":"cursor-example","cursor":"cursor-example","meta":{"has_next_page":true,"result_count":1}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/tweet/{id}":{"get":{"operationId":"tweet_by_id","summary":"Get a tweet by id","description":"Returns a single post with author, media[], and engagement counts (likes, replies, retweets, quotes, bookmarks, views).","tags":["api_key"],"parameters":[{"name":"id","in":"path","required":true,"description":"Numeric tweet/status id","schema":{"type":"string"},"example":"20"}],"responses":{"200":{"description":"Single item or batch payload","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ItemEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NormalizedTweet"}}}]},"example":{"data":{"id":"12","userName":"jack","name":"jack","followers":1000000},"meta":{"cached":false,"fetched_at":1700000000000}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/tweet/by-url":{"get":{"operationId":"tweet_by_url","summary":"Get a tweet by X/Twitter URL","description":"Accepts an x.com or twitter.com status URL (or raw numeric id) and returns the same shape as tweet-by-id.","tags":["api_key"],"parameters":[{"name":"url","in":"query","required":true,"description":"Status URL (alias: u)","schema":{"type":"string"},"example":"https://x.com/jack/status/20"}],"responses":{"200":{"description":"Single item or batch payload","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ItemEnvelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NormalizedTweet"}}}]},"example":{"data":{"id":"12","userName":"jack","name":"jack","followers":1000000},"meta":{"cached":false,"fetched_at":1700000000000}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/tweet/{id}/replies":{"get":{"operationId":"tweet_replies","summary":"Get replies to a tweet","description":"Conversation replies for a post (commenters + engagement). Cursor-paginated.","tags":["api_key"],"parameters":[{"name":"id","in":"path","required":true,"description":"Numeric tweet/status id","schema":{"type":"string"},"example":"20"},{"name":"limit","in":"query","required":false,"description":"Page size (1-40, default 20)","schema":{"type":"number"},"example":20},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ListEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NormalizedTweet"}}}}]},"example":{"data":[{"id":"20","text":"just setting up my twttr","isRetweet":false,"author":{"id":"12","userName":"jack","name":"jack"}}],"next_cursor":"cursor-example","cursor":"cursor-example","meta":{"has_next_page":true,"result_count":1}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/tweet/{id}/retweeters":{"get":{"operationId":"tweet_retweeters","summary":"List users who retweeted a tweet","description":"Retweeters for a post. Cursor-paginated.","tags":["api_key"],"parameters":[{"name":"id","in":"path","required":true,"description":"Numeric tweet/status id","schema":{"type":"string"},"example":"20"},{"name":"limit","in":"query","required":false,"description":"Page size (1-40, default 20)","schema":{"type":"number"},"example":20},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ListEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NormalizedUser"}}}}]},"example":{"data":[{"id":"20","text":"just setting up my twttr","isRetweet":false,"author":{"id":"12","userName":"jack","name":"jack"}}],"next_cursor":"cursor-example","cursor":"cursor-example","meta":{"has_next_page":true,"result_count":1}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/tweets":{"post":{"operationId":"tweets_batch","summary":"Batch fetch tweets by id","description":"Fetch up to 25 tweets in one request. Partial failures return in errors[].","tags":["api_key"],"parameters":[],"responses":{"200":{"description":"Single item or batch payload","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ItemEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NormalizedTweet"}}}}]},"example":{"data":{"id":"12","userName":"jack","name":"jack","followers":1000000},"meta":{"cached":false,"fetched_at":1700000000000}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"string","description":"Array of tweet ids or status URLs (alias: tweetIds), max 25","example":"20"}},"required":["ids"]},"example":{"ids":["20","https://x.com/jack/status/20"]}}}}}},"/v1/users":{"post":{"operationId":"users_batch","summary":"Batch fetch user profiles","description":"Fetch up to 25 profiles in one request. Partial failures return in errors[].","tags":["api_key"],"parameters":[],"responses":{"200":{"description":"Single item or batch payload","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ItemEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NormalizedUser"}}}}]},"example":{"data":{"id":"12","userName":"jack","name":"jack","followers":1000000},"meta":{"cached":false,"fetched_at":1700000000000}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userNames":{"type":"string","description":"Array of handles without @ (alias: usernames), max 25","example":"jack"}},"required":["userNames"]},"example":{"userNames":["jack","elonmusk"]}}}}}},"/v1/user/followers":{"get":{"operationId":"user_followers","summary":"List followers for a user","description":"Followers of an X account. Cursor-paginated.","tags":["api_key"],"parameters":[{"name":"userName","in":"query","required":true,"description":"X handle without @ (alias: username)","schema":{"type":"string"},"example":"elonmusk"},{"name":"limit","in":"query","required":false,"description":"Page size (1-40, default 20)","schema":{"type":"number"},"example":20},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ListEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NormalizedUser"}}}}]},"example":{"data":[{"id":"20","text":"just setting up my twttr","isRetweet":false,"author":{"id":"12","userName":"jack","name":"jack"}}],"next_cursor":"cursor-example","cursor":"cursor-example","meta":{"has_next_page":true,"result_count":1}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/user/following":{"get":{"operationId":"user_following","summary":"List accounts a user follows","description":"Following list for an X account. Cursor-paginated.","tags":["api_key"],"parameters":[{"name":"userName","in":"query","required":true,"description":"X handle without @ (alias: username)","schema":{"type":"string"},"example":"elonmusk"},{"name":"limit","in":"query","required":false,"description":"Page size (1-40, default 20)","schema":{"type":"number"},"example":20},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor. Pass next_cursor (or cursor) from the previous response unchanged.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ListEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NormalizedUser"}}}}]},"example":{"data":[{"id":"20","text":"just setting up my twttr","isRetweet":false,"author":{"id":"12","userName":"jack","name":"jack"}}],"next_cursor":"cursor-example","cursor":"cursor-example","meta":{"has_next_page":true,"result_count":1}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/admin/seed-plans":{"post":{"operationId":"admin_seed_plans","summary":"Seed plan tiers","description":"Creates starter/pro/unlimited plans if missing.","tags":["admin"],"parameters":[],"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"AdminSecret":[]}]}},"/v1/admin/keys":{"post":{"operationId":"admin_create_key","summary":"Create an API key","description":"Returns the raw API key once. Store it securely.","tags":["admin"],"parameters":[],"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"AdminSecret":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Key label","example":"owner"},"planName":{"type":"string","description":"starter | pro | unlimited","example":"unlimited"}}},"example":{"name":"owner","planName":"unlimited"}}}}},"get":{"operationId":"admin_list_keys","summary":"List API keys","description":"Does not return raw key secrets.","tags":["admin"],"parameters":[],"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"AdminSecret":[]}]}},"/v1/admin/sessions":{"post":{"operationId":"admin_add_session","summary":"Add connection","description":"Register a connection for API capacity.","tags":["admin"],"parameters":[],"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"AdminSecret":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string","description":"Human label"},"authToken":{"type":"string","description":"Primary token"},"ct0":{"type":"string","description":"Secondary token"},"maxRpm":{"type":"number","description":"Per-connection requests per minute (default 25)"}},"required":["authToken","ct0"]}}}}},"get":{"operationId":"admin_list_sessions","summary":"List connection health","description":"Status, cooldown, and usage only. No secrets.","tags":["admin"],"parameters":[],"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"AdminSecret":[]}]}},"/v1/admin/sessions/{id}":{"patch":{"operationId":"admin_patch_session","summary":"Update connection status","description":"Set healthy | cooling | dead | disabled.","tags":["admin"],"parameters":[{"name":"id","in":"path","required":true,"description":"Connection id","schema":{"type":"string"}}],"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"AdminSecret":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","description":"healthy | cooling | dead | disabled"}},"required":["status"]}}}}},"put":{"operationId":"admin_rotate_session","summary":"Rotate connection","description":"Replace connection tokens and mark healthy.","tags":["admin"],"parameters":[{"name":"id","in":"path","required":true,"description":"Connection id","schema":{"type":"string"}}],"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"AdminSecret":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"authToken":{"type":"string","description":"New primary token"},"ct0":{"type":"string","description":"New secondary token"}},"required":["authToken","ct0"]}}}}}},"/v1/admin/query-ids/refresh":{"post":{"operationId":"admin_refresh_query_ids","summary":"Refresh operation IDs","description":"Refresh cached operation identifiers.","tags":["admin"],"parameters":[],"responses":{"200":{"description":"Success"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"AdminSecret":[]}]}}}}