# cheapxapi: full API reference > Twitter/X API for reading public data and acting as X accounts you log in with. $0.0006 per request ($0.60 per 1,000 requests) on every read and account action; logging in to an X account is $0.10. Pay as you go, no monthly plan, and the balance never expires. This file is the complete reference in one document. The short index is https://cheapxapi.com/llms.txt and the OpenAPI document is https://cheapxapi.com/openapi.json. ## API overview Base URL: https://api.cheapxapi.com API for public X (Twitter) data and account actions. **Authentication** — send your API key in the `x-api-key` request header. Keys in the URL are rejected. **Pricing (data endpoints)** — $0.0006 per request, pay as you go. Every request is charged except when the failure is on our side: charged: successful responses, "not found" style responses (e.g. user does not exist), invalid parameters, unknown endpoints; not charged: rate-limited requests (429), insufficient balance (402), invalid key (401), items reported as not found with HTTP 404, and service errors (503). Each charged response carries `x-balance-remaining` (USD); every response carries `x-request-id`. **Rate limits** — 2 requests per second for new accounts, 10 per second for paid accounts; at most 10 requests in flight per account. **Not found results** — most endpoints report a missing user, tweet or list as HTTP 200 with `"status": "error"` (charged). Always check the `status` field, not only the HTTP status code. Exceptions: the search endpoints and *Get retweeters* return results directly without `status`; no matches means an empty list. **Pagination** — paginated endpoints return `has_next_page` and `next_cursor`. Pass `next_cursor` as `cursor` to get the next page. Stop when `has_next_page` is `false` or `next_cursor` is empty; the API sets both when the end is reached. Use `has_next_page` (some endpoints also return a legacy `has_next` field; ignore it). **Timeouts** — most requests return in under a second, some take several seconds; set your client timeout to at least 75 seconds. **Account actions** — post, like, retweet, follow, message and more as an X account you control. First call *Log in to an X account* to get `login_cookies`, then send `login_cookies` and the same `proxy` with every action. We pass these values through for the request only and never store or log your password, two-factor secret, `login_cookies` or proxy credentials. Pricing: login $0.1 per request, every other action $0.0006 per request. HTTP 200 is charged, including when X rejects the action (`"status": "error"`, the reason is in `message`); invalid fields (400), rate limits and service errors are not. Do not retry an action automatically after a timeout: it may already have been applied on X. X limits how often each account may act; we cap posts and messages at 5 per minute and follows at 15 per minute per X account to protect it. ## Pricing - Price per request: $0.0006 on every read endpoint and every account action - Logging in to an X account: $0.10 per login (returns login_cookies, reused for later actions) - Price per 1,000 requests: $0.60 - Price per 1,000 tweets: about $0.03 (search and timeline calls return up to 20 tweets each) - Billing: prepaid balance, pay as you go, no subscription - Balance expiry: none (promotional credits expire 60 days after they are granted) - Refunds: payments from the last 30 days, up to the unused balance - Paginated results: each page is one request - For reference, the official X API pay-per-usage plan charges per resource returned ($0.01 per user, $0.01 per follower); cheapxapi charges per request ## Scope - Read: tweets, user profiles, relationship graph, Lists, Communities, trends - Account actions as an X account you log in with: post or reply, delete, like, retweet, pin, bookmark, follow, mute, block, direct messages, media upload, profile updates - X password, two-factor secret, login_cookies and proxy are used for the request only, never stored or logged - Followers endpoint: up to 100 full user profiles per page, cursor pagination - Follower IDs endpoint: up to 200 user IDs per request, cursor pagination ## Users ### Get user profile `GET https://api.cheapxapi.com/twitter/user/info` · $0.0006 per request · https://cheapxapi.com/docs/user-info Public profile of a user by screen name. When to use it: - Look up an account before working with it: follower and following counts, bio, location, website, verification and when it joined. - Turn a screen name into the numeric `id` that endpoints such as *Get user's tweet timeline* and *Get verified followers* require. - Check `protected` and `canDm` before you try to read an account's posts or message it. Tip: Screen names can change; the numeric `id` never does. Store the `id` if you track accounts over time. Related: Get users by IDs (refresh up to 20 known accounts in one request); Get user 'about' details (username history and verification details) Parameters: - `userName` (query, string, required): Screen name without the @, e.g. `NASA`. Example request: ```bash curl "https://api.cheapxapi.com/twitter/user/info?userName=NASA" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `data` (UserInfo) - `type` ("user") - `userName` (string) - `url` (string) - `id` (string) - `name` (string) - `isBlueVerified` (boolean) - `protected` (boolean) - `verifiedType` (string) - `profilePicture` (string) - `coverPicture` (string) - `description` (string) - `location` (string) - `followers` (integer) - `following` (integer) - `canDm` (boolean) - `createdAt` (string) - `favouritesCount` (integer) - `hasCustomTimelines` (boolean) - `isTranslator` (boolean) - `mediaCount` (integer) - `statusesCount` (integer) - `withheldInCountries` (array of string) - `affiliatesHighlightedLabel` (object) - `possiblySensitive` (boolean) - `pinnedTweetIds` (array of string) - `isAutomated` (boolean) - `automatedBy` (string) - `unavailable` (boolean) - `message` (string) - `unavailableReason` (string) - `profile_bio` (object) - `status` ("success" | "error") - `msg` (string) Example response: ```json { "status": "success", "msg": "success", "data": { "id": "11348282", "name": "NASA", "userName": "NASA", "location": "Pale Blue Dot", "url": "https://t.co/9NkQJKAnuU", "description": "Making the seemingly impossible, possible. ✨", "entities": { "description": {}, "url": { "urls": [ { "display_url": "nasa.gov", "expanded_url": "http://www.nasa.gov/", "indices": [ 0, 23 ], "url": "https://t.co/9NkQJKAnuU" } ] } }, "protected": false, "isVerified": false, "isBlueVerified": true, "verifiedType": "Government", "followers": 92309786, "following": 115, "favouritesCount": 17048, "statusesCount": 74468, "mediaCount": 28216, "createdAt": "2007-12-19T20:20:32.000000Z", "coverPicture": "https://pbs.twimg.com/profile_banners/11348282/1788992290", "profilePicture": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_normal.jpg", "canDm": false, "affiliatesHighlightedLabel": {}, "isAutomated": false, "automatedBy": null, "pinnedTweetIds": [ "2115753332958433574" ], "profile_interstitial_type": "" } } ``` ### Get user 'about' details `GET https://api.cheapxapi.com/twitter/user_about` · $0.0006 per request · https://cheapxapi.com/docs/user-about Extra profile details of a user (account location, creation info, verification details). When to use it: - See how many times an account changed its username (`about_profile.username_changes`), a quick signal for impersonators and resold accounts. - Read the verification details X shows on the profile's About page (`verification_info`). Tip: This response has no follower or post counts. Use *Get user profile* for those. Related: Get user profile (follower counts, bio and the rest of the public profile) Parameters: - `userName` (query, string, required): Screen name without the @, e.g. `NASA`. Example request: ```bash curl "https://api.cheapxapi.com/twitter/user_about?userName=NASA" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `data` (UserAbout) - `id` (string) - `name` (string) - `userName` (string) - `createdAt` (string) - `isBlueVerified` (boolean) - `protected` (boolean) - `affiliates_highlighted_label` (object) - `about_profile` (object) - `identity_profile_labels_highlighted_label` (object) - `status` ("success" | "error") - `msg` (string) Example response: ```json { "status": "success", "msg": "success", "data": { "id": "11348282", "name": "NASA", "userName": "NASA", "createdAt": "2007-12-19T20:20:32.000000Z", "profilePicture": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_normal.jpg", "isBlueVerified": true, "isVerified": false, "protected": false, "affiliates_highlighted_label": {}, "identity_profile_labels_highlighted_label": {}, "about_profile": { "learn_more_url": "https://help.twitter.com/managing-your-account/about-twitter-verified-accounts", "location_accurate": true, "username_changes": { "count": "0" } }, "verification_info": { "id": "VXNlclZlcmlmaWNhdGlvbkluZm86MTEzNDgyODI=", "is_identity_verified": false, "reason": { "verified_since_msec": "1249674830941" } } } } ``` ### Get users by IDs `GET https://api.cheapxapi.com/twitter/user/batch_info_by_ids` · $0.0006 per request · https://cheapxapi.com/docs/user-batch-info-by-ids Profiles of up to 20 users in one request. When to use it: - Refresh the profiles of accounts you already track: 20 accounts cost one request instead of 20. - Turn the IDs from *Get follower IDs* into full profiles. Tip: Profiles for 1,000 IDs take 50 requests, $0.03. Only numeric IDs are accepted; to look up by screen name use *Get user profile*. Related: Get follower IDs (200 follower IDs per request); Get user profile (look up one account by screen name) Parameters: - `userIds` (query, string, required): 1 to 20 numeric user IDs separated by commas, e.g. `11348282,44196397`. Example request: ```bash curl "https://api.cheapxapi.com/twitter/user/batch_info_by_ids?userIds=11348282%2C44196397" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `users` (array of UserInfo) - `type` ("user") - `userName` (string) - `url` (string) - `id` (string) - `name` (string) - `isBlueVerified` (boolean) - `protected` (boolean) - `verifiedType` (string) - `profilePicture` (string) - `coverPicture` (string) - `description` (string) - `location` (string) - `followers` (integer) - `following` (integer) - `canDm` (boolean) - `createdAt` (string) - `favouritesCount` (integer) - `hasCustomTimelines` (boolean) - `isTranslator` (boolean) - `mediaCount` (integer) - `statusesCount` (integer) - `withheldInCountries` (array of string) - `affiliatesHighlightedLabel` (object) - `possiblySensitive` (boolean) - `pinnedTweetIds` (array of string) - `isAutomated` (boolean) - `automatedBy` (string) - `unavailable` (boolean) - `message` (string) - `unavailableReason` (string) - `profile_bio` (object) - `status` ("success" | "error") - `msg` (string) Example response: ```json { "status": "success", "msg": "success", "users": [ { "id": "11348282", "name": "NASA", "userName": "NASA", "location": "Pale Blue Dot", "url": "https://t.co/9NkQJKAnuU", "description": "Making the seemingly impossible, possible. ✨", "entities": { "description": {}, "url": { "urls": [ { "display_url": "nasa.gov", "expanded_url": "http://www.nasa.gov/", "indices": [ 0, 23 ], "url": "https://t.co/9NkQJKAnuU" } ] } }, "protected": false, "isVerified": false, "isBlueVerified": true, "verifiedType": "Government", "followers": 92309787, "following": 115, "favouritesCount": 17048, "statusesCount": 74468, "mediaCount": 28216, "createdAt": "2007-12-19T20:20:32.000000Z", "coverPicture": "https://pbs.twimg.com/profile_banners/11348282/1788992290", "profilePicture": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_normal.jpg", "canDm": false, "affiliatesHighlightedLabel": {}, "isAutomated": false, "automatedBy": null, "pinnedTweetIds": [ "2115753332958433574" ], "profile_interstitial_type": "" } ] } ``` ### Search users `GET https://api.cheapxapi.com/twitter/user/search` · $0.0006 per request · https://cheapxapi.com/docs/user-search Search users by keyword. Paginated: use `cursor` / `next_cursor`. When to use it: - Find accounts for a keyword, brand or name, the way the People tab of X search does. - Build a prospect list in a niche, then pull each account's profile and posts. Tip: Every page is one billed request. Stop when `has_next_page` is false or `next_cursor` is empty. Related: Advanced search (find accounts by what they post rather than who they are); Get user profile (the full profile of an account you found) Parameters: - `query` (query, string, required): Search query. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/user/search?query=nasa" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `users` (array of UserProfileSnake) - `id` (string) - `name` (string) - `screen_name` (string) - `userName` (string) - `username` (string) - `location` (string) - `url` (string) - `description` (string) - `email` (string) - `protected` (boolean) - `verified` (boolean) - `isBlueVerified` (boolean) - `followers_count` (integer) - `following_count` (integer) - `friends_count` (integer) - `favourites_count` (integer) - `statuses_count` (integer) - `media_tweets_count` (integer) - `created_at` (string) - `profile_banner_url` (string) - `profile_image_url_https` (string) - `can_dm` (boolean) - `has_next_page` (boolean) - `next_cursor` (string) Example response: ```json { "users": [ { "id": "11348282", "name": "NASA", "screen_name": "NASA", "username": "NASA", "location": "Pale Blue Dot", "url": "https://t.co/9NkQJKAnuU", "description": "Making the seemingly impossible, possible. ✨", "email": null, "protected": false, "verified": false, "followers_count": 92309785, "following_count": 115, "friends_count": 115, "favourites_count": 17048, "statuses_count": 74468, "media_tweets_count": 28216, "created_at": "Wed Dec 19 20:20:32 +0000 2007", "profile_banner_url": "https://pbs.twimg.com/profile_banners/11348282/1788992290", "profile_image_url_https": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_normal.jpg", "can_dm": false, "isBlueVerified": true } ], "has_next_page": true, "next_cursor": "DAAFCgABHV0B7xc__z8LAAIAAADwRW1QQzZ3QUFBZlEvZ0dKTjB2R3AvQUFBQUJRQUFBQUFKYkRRQVFBQUFBQUE1MmcxRVJ1NTByT1ZBQUFBQUFBQUFjRzRJd0FBQUFBQlpxRk5BQUFBQUFFVktzUUFBQUFBQ1lNZ2FBQUFBQUFCZkQ5UUFBQUFBQUIra3FBQUFBQUFBTmNEVXdBQUFBQUJMaXIvQUFBQUFBRG5hRDRBQUFBQUFQeitnZ0FBQUFBSktvOVdBQUFBQUFFUFVhMEFB…" } ``` ### Get user's latest tweets `GET https://api.cheapxapi.com/twitter/user/last_tweets` · $0.0006 per request · https://cheapxapi.com/docs/user-last-tweets Latest tweets of a user, newest first. The list is inside `data.tweets`. Pass either `userName` or `userId`. Paginated: use `cursor` / `next_cursor`. When to use it: - Monitor an account for new posts: poll the first page and stop at the first tweet ID you have already stored. - Read an account's recent posts by screen name or numeric ID, with the pinned post in `data.pin_tweet`. Tip: Results come newest first, so a monitor rarely needs more than the first page. Set `includeReplies=true` to include the account's replies. Related: Get user's tweet timeline (the same job by numeric ID, with the parent of each reply); Advanced search (older posts in a date range with `from:` and `since:`) Parameters: - `userId` (query, string): Numeric user ID, e.g. `11348282`. - `userName` (query, string): Screen name without the @, e.g. `NASA`. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. - `includeReplies` (query, boolean): Include replies (`true` / `false`). Example request: ```bash curl "https://api.cheapxapi.com/twitter/user/last_tweets" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `status` ("success" | "error") - `code` (integer) - `msg` (string) - `data` (object) - `pin_tweet` (any) - `tweets` (array of Tweet) - `has_next_page` (boolean) - `next_cursor` (string) Example response: ```json { "status": "success", "code": 0, "msg": "success", "data": { "pin_tweet": null, "tweets": [ { "type": "tweet", "id": "2115753332958433574", "url": "https://x.com/NASA/status/2115753332958433574", "twitterUrl": "https://twitter.com/NASA/status/2115753332958433574", "text": "LIVE: NASA's Anil Menon and @csa_asc's Joshua Kutryk are setting up a new solar array outside the @Space_Station. Today's spacewalk is scheduled to start around 8am ET (1200 UTC) and run for about six and a half hours. https://t.co/xoJPYWty9Z", "source": "", "retweetCount": 434, "replyCount": 173, "likeCount": 2309, "quoteCount": 66, "viewCount": 702039, "createdAt": "Thu Oct 29 10:31:18 +0000 2026", "lang": "en", "bookmarkCount": 123, "isReply": false, "inReplyToId": null, "conversationId": "2115753332958433574", "displayTextRange": [ 0, 242 ], "inReplyToUserId": null, "inReplyToUsername": null, "author": { "type": "user", "userName": "NASA", "url": "https://x.com/NASA", "twitterUrl": "https://twitter.com/NASA", "id": "11348282", "name": "NASA", "isVerified": false, "isBlueVerified": true, "verifiedType": "Government", "profilePicture": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_normal.jpg", "coverPicture": "https://pbs.twimg.com/profile_banners/11348282/1788992290", "description": "", "location": "Pale Blue Dot", "followers": 92309785, "following": 115, "status": "", "canDm": false, "canMediaTag": true, "createdAt": "Wed Dec 19 20:20:32 +0000 2007", "entities": { "description": { "urls": [] }, "url": {} }, "fastFollowersCount": 0, "favouritesCount": 17048, "hasCustomTimelines": true, "isTranslator": true, "mediaCount": 28216, "statusesCount": 74468, "withheldInCountries": [], "affiliatesHighlightedLabel": {}, "possiblySensitive": false, "pinnedTweetIds": [ "2115753332958433574" ], "profile_bio": { "description": "Making the seemingly impossible, possible. ✨", "entities": { "description": {}, "url": { "urls": [ { "display_url": "nasa.gov", "expanded_url": "http://www.nasa.gov/", "indices": [ 0, 23 ], "url": "https://t.co/9NkQJKAnuU" } ] } } }, "isAutomated": false, "automatedBy": null, "protected": false }, "extendedEntities": {}, "card": { "binding_values": [ { "key": "broadcast_url", "value": { "string_value": "https://x.com/i/broadcasts/1rxmqpBDDpWxy" } } ], "card_platform": { "platform": { "audience": { "name": "production" }, "device": { "name": "iPhone", "version": "13" } } }, "name": "745291183405076480:broadcast", "url": "https://t.co/xoJPYWty9Z", "user_refs_results": [ { "rest_id": "11348282", "result": { "__typename": "User", "action_counts": { "favorites_count": 17048 }, "avatar": { "image_url": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_normal.jpg" }, "banner": { "image_url": "https://pbs.twimg.com/profile_banners/11348282/1788992290" }, "core": { "created_at": "Wed Dec 19 20:20:32 +0000 2007", "name": "NASA", "screen_name": "NASA" }, "dm_permissions": { "can_dm": false }, "exclusive_tweet_following": false, "follow_request_sent": false, "identity_profile_labels_highlighted_label": {}, "location": { "location": "Pale Blue Dot" }, "media_permissions": { "can_media_tag": true }, "notifications_settings": { "notifications_enabled": false }, "pinned_items": { "tweet_ids_str": [ "2115753332958433574" ] }, "privacy": { "protected": false, "suspended": false }, "private_super_following": false, "profile_bio": { "description": "Making the seemingly impossible, possible. ✨", "entities": { "description": {}, "url": { "urls": [ { "display_url": "nasa.gov", "expanded_url": "http://www.nasa.gov/", "indices": [ 0, 23 ], "url": "https://t.co/9NkQJKAnuU" } ] } } }, "profile_image_shape": "Square", "profile_metadata": { "profile_interstitial_type": "", "profile_link_color": "205BA7" }, "profile_translation": { "translator_type_enum": "Regular" }, "properties": { "has_extended_profile": true, "has_no_screen_name": false }, "relationship_counts": { "followers": 92309785, "following": 115 }, "relationship_perspectives": { "blocked_by": false, "blocking": false, "followed_by": false, "following": false, "live_following": false, "muting": false }, "rest_id": "11348282", "smart_blocked_by": false, "smart_blocking": false, "super_follow_eligible": false, "super_followed_by": false, "super_following": false, "tweet_counts": { "media_tweets": 28216, "tweets": 74468 }, "verification": { "is_blue_verified": true, "verified": false, "verified_type": "Government" }, "website": { "url": "https://t.co/9NkQJKAnuU" } } } ] }, "place": {}, "entities": { "urls": [ { "display_url": "x.com/i/broadcasts/1…", "expanded_url": "https://x.com/i/broadcasts/1rxmqpBDDpWxy", "indices": [ 219, 242 ], "url": "https://t.co/xoJPYWty9Z" } ], "user_mentions": [ { "id_str": "93714983", "indices": [ 28, 36 ], "name": "Canadian Space Agency", "screen_name": "csa_asc" } ] }, "quoted_tweet": null, "retweeted_tweet": null, "isLimitedReply": false, "communityInfo": null, "article": null } ] }, "has_next_page": true, "next_cursor": "DAADDAABCgABHVyqclNWESYKAAIdUXrw8BaRUAAIAAIAAAACCAADAAAAAAgABAAAAAAKAAUdXQHwVcAnEAoABh1dAfBVv9jwCwAHAAAA8EVtUEM2d0FBQWZRL2dHSk4wdkdwL0FBQUFCUWRWWmpsOEJvdzRoMVVLQWdCMWlHSUhWRjY4UEFXa1ZBZFZWajFGWmJ3MlIxVnBQVFcxc0dTSFZmODNTT2JNREVkWEtweVUxWVJKaDFZRk9rOWxnQjdIVnhzb3J0V1lOVWRVcjJiYzlZ…" } ``` ### Get user's tweet timeline `GET https://api.cheapxapi.com/twitter/user/tweet_timeline` · $0.0006 per request · https://cheapxapi.com/docs/user-tweet-timeline Tweet timeline of a user by numeric user ID. The list is inside `data.tweets`. Paginated: use `cursor` / `next_cursor`. When to use it: - Read an account's posts when you already store numeric user IDs. - Read replies in context: `includeParentTweet=true` also returns the tweet each reply answers. Tip: Only `userId` is accepted. Get it once from *Get user profile* and keep it. Related: Get user's latest tweets (the same job by screen name, with the pinned post); Get thread context (the whole conversation around one post) Parameters: - `userId` (query, string): Numeric user ID, e.g. `11348282`. - `includeReplies` (query, boolean): Include replies (`true` / `false`). - `includeParentTweet` (query, boolean): Include the parent tweet of replies (`true` / `false`). - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/user/tweet_timeline" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `status` (string) - `msg` (string) - `code` (integer) - `data` (object) - `tweets` (array of Tweet) - `has_next_page` (boolean) - `next_cursor` (string) Example response: ```json { "status": "success", "code": 0, "msg": "success", "data": { "tweets": [ { "type": "tweet", "id": "2115753332958433574", "url": "https://x.com/NASA/status/2115753332958433574", "twitterUrl": "https://twitter.com/NASA/status/2115753332958433574", "text": "LIVE: NASA's Anil Menon and @csa_asc's Joshua Kutryk are setting up a new solar array outside the @Space_Station. Today's spacewalk is scheduled to start around 8am ET (1200 UTC) and run for about six and a half hours. https://t.co/xoJPYWty9Z", "source": "", "retweetCount": 434, "replyCount": 173, "likeCount": 2310, "quoteCount": 66, "viewCount": 702039, "createdAt": "Thu Oct 29 10:31:18 +0000 2026", "lang": "en", "bookmarkCount": 123, "isReply": false, "inReplyToId": null, "conversationId": "2115753332958433574", "displayTextRange": [ 0, 242 ], "inReplyToUserId": null, "inReplyToUsername": null, "author": { "type": "user", "userName": "NASA", "url": "https://x.com/NASA", "twitterUrl": "https://twitter.com/NASA", "id": "11348282", "name": "NASA", "isVerified": false, "isBlueVerified": true, "verifiedType": "Government", "profilePicture": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_normal.jpg", "coverPicture": "https://pbs.twimg.com/profile_banners/11348282/1788992290", "description": "", "location": "Pale Blue Dot", "followers": 92309787, "following": 115, "status": "", "canDm": false, "canMediaTag": true, "createdAt": "Wed Dec 19 20:20:32 +0000 2007", "entities": { "description": { "urls": [] }, "url": {} }, "fastFollowersCount": 0, "favouritesCount": 17048, "hasCustomTimelines": true, "isTranslator": true, "mediaCount": 28216, "statusesCount": 74468, "withheldInCountries": [], "affiliatesHighlightedLabel": {}, "possiblySensitive": false, "pinnedTweetIds": [ "2115753332958433574" ], "profile_bio": { "description": "Making the seemingly impossible, possible. ✨", "entities": { "description": {}, "url": { "urls": [ { "display_url": "nasa.gov", "expanded_url": "http://www.nasa.gov/", "indices": [ 0, 23 ], "url": "https://t.co/9NkQJKAnuU" } ] } } }, "isAutomated": false, "automatedBy": null, "protected": false }, "extendedEntities": {}, "card": { "binding_values": [ { "key": "broadcast_url", "value": { "string_value": "https://x.com/i/broadcasts/1rxmqpBDDpWxy" } } ], "card_platform": { "platform": { "audience": { "name": "production" }, "device": { "name": "iPhone", "version": "13" } } }, "name": "745291183405076480:broadcast", "url": "https://t.co/xoJPYWty9Z", "user_refs_results": [ { "rest_id": "11348282", "result": { "__typename": "User", "action_counts": { "favorites_count": 17048 }, "avatar": { "image_url": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_normal.jpg" }, "banner": { "image_url": "https://pbs.twimg.com/profile_banners/11348282/1788992290" }, "core": { "created_at": "Wed Dec 19 20:20:32 +0000 2007", "name": "NASA", "screen_name": "NASA" }, "dm_permissions": { "can_dm": false }, "exclusive_tweet_following": false, "follow_request_sent": false, "identity_profile_labels_highlighted_label": {}, "location": { "location": "Pale Blue Dot" }, "media_permissions": { "can_media_tag": true }, "notifications_settings": { "notifications_enabled": false }, "pinned_items": { "tweet_ids_str": [ "2115753332958433574" ] }, "privacy": { "protected": false, "suspended": false }, "private_super_following": false, "profile_bio": { "description": "Making the seemingly impossible, possible. ✨", "entities": { "description": {}, "url": { "urls": [ { "display_url": "nasa.gov", "expanded_url": "http://www.nasa.gov/", "indices": [ 0, 23 ], "url": "https://t.co/9NkQJKAnuU" } ] } } }, "profile_image_shape": "Square", "profile_metadata": { "profile_interstitial_type": "", "profile_link_color": "205BA7" }, "profile_translation": { "translator_type_enum": "Regular" }, "properties": { "has_extended_profile": true, "has_no_screen_name": false }, "relationship_counts": { "followers": 92309787, "following": 115 }, "relationship_perspectives": { "blocked_by": false, "blocking": false, "followed_by": false, "following": false, "live_following": false, "muting": false }, "rest_id": "11348282", "smart_blocked_by": false, "smart_blocking": false, "super_follow_eligible": false, "super_followed_by": false, "super_following": false, "tweet_counts": { "media_tweets": 28216, "tweets": 74468 }, "verification": { "is_blue_verified": true, "verified": false, "verified_type": "Government" }, "website": { "url": "https://t.co/9NkQJKAnuU" } } } ] }, "place": {}, "entities": { "urls": [ { "display_url": "x.com/i/broadcasts/1…", "expanded_url": "https://x.com/i/broadcasts/1rxmqpBDDpWxy", "indices": [ 219, 242 ], "url": "https://t.co/xoJPYWty9Z" } ], "user_mentions": [ { "id_str": "93714983", "indices": [ 28, 36 ], "name": "Canadian Space Agency", "screen_name": "csa_asc" } ] }, "quoted_tweet": null, "retweeted_tweet": null, "isLimitedReply": false, "communityInfo": null, "article": null } ] }, "has_next_page": true, "next_cursor": "DAAHCgABHV0B8Yq__-4LAAIAAAATMjExMzM1ODEzOTk5OTI2NTE2MAgAAwAAAAIAAA" } ``` ### Get user mentions `GET https://api.cheapxapi.com/twitter/user/mentions` · $0.0006 per request · https://cheapxapi.com/docs/user-mentions Tweets that mention a user. Paginated: use `cursor` / `next_cursor`. When to use it: - Brand and support monitoring: every post that mentions an account. - Collect only what is new since your last run by passing its time as `sinceTime` (Unix seconds). Tip: Save the time of each run and send it as `sinceTime` next time, so you never page through mentions you already have. Related: Advanced search (mentions combined with other filters, e.g. `@NASA min_faves:100`); Get tweet replies (replies to one specific post) Parameters: - `userName` (query, string, required): Screen name without the @, e.g. `NASA`. - `sinceTime` (query, integer): Only items created at or after this Unix timestamp (seconds). - `untilTime` (query, integer): Only items created before this Unix timestamp (seconds). - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/user/mentions?userName=NASA" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `tweets` (array of Tweet) - `type` ("tweet") - `id` (string) - `url` (string) - `text` (string) - `source` (string) - `retweetCount` (integer) - `replyCount` (integer) - `likeCount` (integer) - `quoteCount` (integer) - `viewCount` (integer) - `createdAt` (string) - `lang` (string) - `bookmarkCount` (integer) - `isReply` (boolean) - `inReplyToId` (string) - `conversationId` (string) - `displayTextRange` (array of integer) - `inReplyToUserId` (string) - `inReplyToUsername` (string) - `author` (UserInfo) - `entities` (TweetEntities) - `quoted_tweet` (Tweet) - `retweeted_tweet` (Tweet) - `isLimitedReply` (boolean) - `has_next_page` (boolean) - `next_cursor` (string) - `status` ("success" | "error") - `msg` (string) Example response: ```json { "tweets": [ { "type": "tweet", "id": "2115849472139735184", "url": "https://x.com/example_user_1/status/2115849472139735184", "twitterUrl": "https://twitter.com/example_user_1/status/2115849472139735184", "text": "Example post from a private account.", "source": "", "retweetCount": 0, "replyCount": 0, "likeCount": 0, "quoteCount": 0, "viewCount": 0, "createdAt": "Thu Oct 29 16:53:19 +0000 2026", "lang": "pt", "bookmarkCount": 0, "isReply": true, "inReplyToId": "2115776389047779622", "conversationId": "2115776389047779622", "displayTextRange": [ 56, 98 ], "inReplyToUserId": "1451773004", "inReplyToUsername": "Space_Station", "author": { "type": "user", "userName": "example_user_1", "url": "https://x.com/example_user_1", "twitterUrl": "https://twitter.com/example_user_1", "id": "1000000001", "name": "Example User 1", "isVerified": false, "isBlueVerified": false, "verifiedType": null, "profilePicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "coverPicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "description": "", "location": "", "followers": 3473, "following": 636, "status": "", "canDm": true, "canMediaTag": false, "createdAt": "Tue Feb 14 19:36:17 +0000 2023", "entities": { "description": { "urls": [] }, "url": {} }, "fastFollowersCount": 0, "favouritesCount": 61066, "hasCustomTimelines": true, "isTranslator": false, "mediaCount": 776, "statusesCount": 11886, "withheldInCountries": [], "affiliatesHighlightedLabel": {}, "possiblySensitive": false, "pinnedTweetIds": [ "1983979596367458506" ], "profile_bio": { "description": "", "entities": {} }, "isAutomated": false, "automatedBy": null, "protected": false }, "extendedEntities": {}, "card": null, "place": {}, "entities": {}, "quoted_tweet": null, "retweeted_tweet": null, "isLimitedReply": false, "communityInfo": null, "article": null } ], "has_next_page": true, "next_cursor": "DAADDAABCgABHV0B4nkWMJAKAAIdXP17WddR4wAIAAIAAAACCAADAAAAAAgABAAAAAAKAAUdXQHywoAnEAoABh1dAfLCf9jwCwAHAAAA8EVtUEM2d0FBQWZRL2dHSk4wdkdwL0FBQUFCUWRYUURscFphUTRoMWRBYmpJbTlBckhWMEJGODhYWVBnZFhQOWpsUmVoangxYy9ydVBWMkNDSFZ6OWd3ZlhnRllkWFA4eWZsYUE2eDFjL1h0WjExSGpIVjBBU214YVlIRWRYUDc4ZGhh…", "status": "success", "msg": "success" } ``` ### Get user's articles `GET https://api.cheapxapi.com/twitter/user/articles` · $0.0006 per request · https://cheapxapi.com/docs/user-articles Articles (long-form posts) published by a user. The list is inside `data.articles`. Paginated: use `cursor` / `next_cursor`. When to use it: - List the Articles (long-form posts) an account has published, with title and preview text in each item's `article` object. - Watch a writer for new Articles. Tip: The list gives a preview only. Pass an item's `id` to *Get article* for the full text. Related: Get article (the full contents of one Article) Parameters: - `username` (query, string, required): Screen name without the @. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/user/articles?username=balajis" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `status` (string) - `msg` (string) - `code` (integer) - `data` (object) - `articles` (array of Tweet) - `has_next_page` (boolean) - `next_cursor` (string) Example response: ```json { "status": "success", "code": 0, "msg": "success", "data": { "articles": [ { "type": "tweet", "id": "2082071471548244406", "url": "https://x.com/balajis/status/2082071471548244406", "twitterUrl": "https://twitter.com/balajis/status/2082071471548244406", "text": "A journo named @stuwoo followed me to Singapore, and then tried to pathologize my move to Singapore. Why? https://t.co/iz4flqTJ3R", "source": "", "retweetCount": 119, "replyCount": 114, "likeCount": 799, "quoteCount": 55, "viewCount": 306432, "createdAt": "Tue Jul 28 11:51:36 +0000 2026", "lang": "en", "bookmarkCount": 373, "isReply": false, "inReplyToId": null, "conversationId": "2082071471548244406", "displayTextRange": [ 0, 129 ], "inReplyToUserId": null, "inReplyToUsername": null, "author": { "type": "user", "userName": "balajis", "url": "https://x.com/balajis", "twitterUrl": "https://twitter.com/balajis", "id": "2178012643", "name": "Balaji", "isVerified": false, "isBlueVerified": true, "verifiedType": null, "profilePicture": "https://pbs.twimg.com/profile_images/2049168417710915585/egYgw1FA_normal.jpg", "coverPicture": "https://pbs.twimg.com/profile_banners/2178012643/1761485965", "description": "Author of the Network State. Founder of the Network School.", "location": "Network School", "followers": 2266166, "following": 3933, "status": "", "canDm": true, "canMediaTag": false, "createdAt": "Wed Nov 06 12:51:04 +0000 2013", "entities": { "description": {}, "url": { "urls": [ { "display_url": "ns.com", "expanded_url": "https://ns.com", "indices": [ 0, 23 ], "url": "https://t.co/HhDUsvgg0o" } ] } }, "fastFollowersCount": 0, "favouritesCount": 278232, "hasCustomTimelines": false, "isTranslator": false, "mediaCount": 5574, "statusesCount": 31212, "withheldInCountries": [], "affiliatesHighlightedLabel": { "label": { "badge": { "url": "https://pbs.twimg.com/profile_images/1978800279165558784/9_D3CwAc_bigger.jpg" }, "description": "NS", "url": { "url": "https://twitter.com/ns", "urlType": "DeepLink" }, "userLabelDisplayType": "Badge", "userLabelType": "BusinessLabel" } }, "possiblySensitive": false, "pinnedTweetIds": [ "2108596569201397803" ], "profile_bio": { "description": "Author of the Network State. Founder of the Network School." }, "isAutomated": false, "automatedBy": null }, "extendedEntities": {}, "card": null, "place": {}, "entities": { "urls": [ { "display_url": "x.com/i/article/2082…", "expanded_url": "http://x.com/i/article/2082024997481259009", "indices": [ 106, 129 ], "url": "https://t.co/iz4flqTJ3R" } ], "user_mentions": [ { "id_str": "15694788", "indices": [ 15, 22 ], "name": "Stu Woo", "screen_name": "stuwoo" } ] }, "quoted_tweet": null, "retweeted_tweet": null, "article": { "title": "Why did Stu Woo of the Wall Street Journal Follow Me to Singapore?", "preview_text": "A writer named Stu Woo recently moved from San Francisco to Singapore. He got in touch to ask me why I’d also moved from San Francisco to Singapore, and why I’d decided to become a proud Singaporean.", "cover_media_img_url": "https://pbs.twimg.com/media/HOTXr2_WIAAodUr.jpg" } } ] }, "has_next_page": true, "next_cursor": "DAABCgABHV0B9CZ___sKAAIAAAAAAAAAAAgAAwAAAAIAAA" } ``` ## Followers ### Get followers `GET https://api.cheapxapi.com/twitter/user/followers` · $0.0006 per request · https://cheapxapi.com/docs/user-followers Followers of a user with full profiles. Up to 100 per page. Paginated: use `cursor` / `next_cursor`. When to use it: - Export an account's followers with full profiles: name, bio, location, follower counts. - Audience research: where a competitor's or your own followers are and what they say about themselves. - Find the largest accounts among the followers by sorting on their own follower counts. Tip: Up to 100 followers per request (`pageSize` 20 to 100). 10,000 followers take 100 requests, $0.06. Related: Get follower IDs (IDs only, 200 per request, half the cost per follower); Get verified followers (only the verified followers); Get followings (who the account follows) Parameters: - `userName` (query, string, required): Screen name without the @, e.g. `NASA`. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. - `pageSize` (query, integer (20 to 100)): Items per page, 20 to 100 (default 100). Larger values are treated as 100, smaller as 20. Example request: ```bash curl "https://api.cheapxapi.com/twitter/user/followers?userName=NASA" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `followers` (array of UserProfileSnake) - `id` (string) - `name` (string) - `screen_name` (string) - `userName` (string) - `username` (string) - `location` (string) - `url` (string) - `description` (string) - `email` (string) - `protected` (boolean) - `verified` (boolean) - `isBlueVerified` (boolean) - `followers_count` (integer) - `following_count` (integer) - `friends_count` (integer) - `favourites_count` (integer) - `statuses_count` (integer) - `media_tweets_count` (integer) - `created_at` (string) - `profile_banner_url` (string) - `profile_image_url_https` (string) - `can_dm` (boolean) - `status` ("success" | "error") - `msg` (string) - `has_next_page` (boolean) - `next_cursor` (string) - `code` (integer) Example response: ```json { "followers": [ { "id": "1000000001", "name": "Example User 1", "screen_name": "example_user_1", "userName": "example_user_1", "location": "", "url": null, "description": "", "email": null, "protected": false, "verified": false, "followers_count": 657, "following_count": 1047, "friends_count": 1047, "favourites_count": 6719, "statuses_count": 12283, "media_tweets_count": 216, "created_at": "Wed Mar 04 23:50:31 +0000 2026", "profile_banner_url": "https://pbs.twimg.com/profile_images/example/photo.jpg", "profile_image_url_https": "https://pbs.twimg.com/profile_images/example/photo.jpg", "can_dm": false } ], "has_next_page": true, "next_cursor": "1880402580724109607", "status": "success", "msg": "success", "code": 0 } ``` ### Get followings `GET https://api.cheapxapi.com/twitter/user/followings` · $0.0006 per request · https://cheapxapi.com/docs/user-followings Accounts a user follows, with full profiles. Up to 100 per page. Paginated: use `cursor` / `next_cursor`. When to use it: - See who an account follows: its sources, peers and the people it pays attention to. - Find accounts worth following in a niche by combining the followings of a few known experts. Tip: Up to 100 accounts per request (`pageSize` 20 to 100), with full profiles. Related: Get followers (the other direction: who follows the account); Check follow relationship (check one pair without paging a whole list) Parameters: - `userName` (query, string, required): Screen name without the @, e.g. `NASA`. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. - `pageSize` (query, integer (20 to 100)): Items per page, 20 to 100 (default 100). Larger values are treated as 100, smaller as 20. Example request: ```bash curl "https://api.cheapxapi.com/twitter/user/followings?userName=NASA" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `followings` (array of UserProfileSnake) - `id` (string) - `name` (string) - `screen_name` (string) - `userName` (string) - `username` (string) - `location` (string) - `url` (string) - `description` (string) - `email` (string) - `protected` (boolean) - `verified` (boolean) - `isBlueVerified` (boolean) - `followers_count` (integer) - `following_count` (integer) - `friends_count` (integer) - `favourites_count` (integer) - `statuses_count` (integer) - `media_tweets_count` (integer) - `created_at` (string) - `profile_banner_url` (string) - `profile_image_url_https` (string) - `can_dm` (boolean) - `has_next_page` (boolean) - `next_cursor` (string) - `status` ("success" | "error") - `msg` (string) - `code` (integer) Example response: ```json { "followings": [ { "id": "1000000001", "name": "Example User 1", "screen_name": "example_user_1", "userName": "example_user_1", "location": "", "url": null, "description": "", "email": null, "protected": false, "verified": false, "followers_count": 5672, "following_count": 6, "friends_count": 6, "favourites_count": 10, "statuses_count": 84, "media_tweets_count": 30, "created_at": "Thu May 14 18:55:50 +0000 2026", "profile_banner_url": "https://pbs.twimg.com/profile_images/example/photo.jpg", "profile_image_url_https": "https://pbs.twimg.com/profile_images/example/photo.jpg", "can_dm": false } ], "has_next_page": true, "next_cursor": "1320989510233510554", "status": "success", "msg": "success", "code": 0 } ``` ### Get follower IDs `GET https://api.cheapxapi.com/twitter/user/followers_ids` · $0.0006 per request · https://cheapxapi.com/docs/user-followers-ids Follower user IDs only, 200 per page. Pass either `userName` or `userId`. Paginated: use `cursor` / `next_cursor`. When to use it: - Track follows and unfollows: save today's ID set and compare it with yesterday's. - Count or deduplicate audiences across accounts without paying for profiles you do not need. Tip: 200 IDs per request. 100,000 followers take 500 requests, $0.30. Fetch profiles only for the new IDs, with *Get users by IDs*. Related: Get users by IDs (profiles for up to 20 IDs per request); Get followers (followers with full profiles) Parameters: - `userName` (query, string): Screen name without the @, e.g. `NASA`. - `userId` (query, string): Numeric user ID, e.g. `11348282`. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/user/followers_ids" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `ids` (array of string) - `has_next_page` (boolean) - `next_cursor` (string) - `status` ("success" | "error") - `msg` (string) - `code` (integer) Example response (lists cut to the first 2 items): ```json { "ids": [ "2029343697289265152", "2115848467600035840" ], "has_next_page": true, "next_cursor": "1880401442290152821", "status": "success", "msg": "success", "code": 0 } ``` ### Get verified followers `GET https://api.cheapxapi.com/twitter/user/verifiedFollowers` · $0.0006 per request · https://cheapxapi.com/docs/user-verifiedfollowers Verified followers of a user by numeric user ID. Paginated: use `cursor` / `next_cursor`. When to use it: - Pull only the verified accounts among a user's followers, often the ones worth contacting, without paging the full list. - Gauge how much of an audience is verified. Tip: This endpoint takes the numeric `user_id`, not the screen name. Get it from *Get user profile*. Related: Get followers (all followers with profiles); Get user profile (screen name to numeric ID) Parameters: - `user_id` (query, string, required): Numeric user ID, e.g. `11348282`. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/user/verifiedFollowers?user_id=11348282" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `followers` (array of UserProfileSnake) - `id` (string) - `name` (string) - `screen_name` (string) - `userName` (string) - `username` (string) - `location` (string) - `url` (string) - `description` (string) - `email` (string) - `protected` (boolean) - `verified` (boolean) - `isBlueVerified` (boolean) - `followers_count` (integer) - `following_count` (integer) - `friends_count` (integer) - `favourites_count` (integer) - `statuses_count` (integer) - `media_tweets_count` (integer) - `created_at` (string) - `profile_banner_url` (string) - `profile_image_url_https` (string) - `can_dm` (boolean) - `status` ("success" | "error") - `msg` (string) - `has_next_page` (boolean) - `next_cursor` (string) - `code` (integer) Example response: ```json { "followers": [ { "id": "1000000001", "name": "Example User 1", "screen_name": "example_user_1", "userName": "example_user_1", "location": "", "url": "", "description": "", "email": null, "followers_count": 9, "following_count": 121, "favourites_count": 89, "statuses_count": 11, "media_tweets_count": 0, "created_at": "Fri Apr 24 06:08:24 +0000 2026", "profile_banner_url": "https://pbs.twimg.com/profile_images/example/photo.jpg", "profile_image_url_https": "https://pbs.twimg.com/profile_images/example/photo.jpg", "can_dm": false } ], "has_next_page": true, "next_cursor": "1880403360476121780|2115849567592251370", "status": "success", "msg": "success", "code": 0 } ``` ### Check follow relationship `GET https://api.cheapxapi.com/twitter/user/check_follow_relationship` · $0.0006 per request · https://cheapxapi.com/docs/user-check-follow-relationship Whether two users follow each other. When to use it: - Confirm that a user follows your account before unlocking a reward, a giveaway entry or gated content. - Check whether two accounts follow each other. Tip: `following` says whether the source account follows the target, `followed_by` whether the target follows the source. One request per pair is far cheaper than paging a follower list. Related: Get follower IDs (check many users at once against one account's followers); Get retweeters (who retweeted a giveaway post) Parameters: - `source_user_name` (query, string, required): Screen name of the first user. - `target_user_name` (query, string, required): Screen name of the second user. Example request: ```bash curl "https://api.cheapxapi.com/twitter/user/check_follow_relationship?source_user_name=NASA&target_user_name=SpaceX" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `data` (object) - `following` (boolean) - `followed_by` (boolean) - `status` ("success" | "error") - `message` (string) Example response: ```json { "status": "success", "message": "check follow relationship success", "data": { "following": false, "followed_by": true } } ``` ## Tweets ### Get tweet by ID `GET https://api.cheapxapi.com/twitter/tweets` · $0.0006 per request · https://cheapxapi.com/docs/tweets One tweet by its numeric ID. Exactly one ID per request. When to use it: - Read one post from its link: the number after `/status/` in an x.com URL is the tweet ID. - Track engagement over time by requesting the same post again: likes, retweets, replies, quotes, views and bookmarks. Tip: Exactly one ID per request. Quoted and retweeted posts come embedded in `quoted_tweet` and `retweeted_tweet`. Related: Get tweet replies (the replies under the post); Get quote tweets (posts that quote it); Get thread context (the conversation it belongs to) Parameters: - `tweet_ids` (query, string, required): Exactly one numeric tweet ID per request. Example request: ```bash curl "https://api.cheapxapi.com/twitter/tweets?tweet_ids=1585341984679469056" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `tweets` (array of Tweet) - `type` ("tweet") - `id` (string) - `url` (string) - `text` (string) - `source` (string) - `retweetCount` (integer) - `replyCount` (integer) - `likeCount` (integer) - `quoteCount` (integer) - `viewCount` (integer) - `createdAt` (string) - `lang` (string) - `bookmarkCount` (integer) - `isReply` (boolean) - `inReplyToId` (string) - `conversationId` (string) - `displayTextRange` (array of integer) - `inReplyToUserId` (string) - `inReplyToUsername` (string) - `author` (UserInfo) - `entities` (TweetEntities) - `quoted_tweet` (Tweet) - `retweeted_tweet` (Tweet) - `isLimitedReply` (boolean) - `status` ("success" | "error") - `msg` (string) - `code` (integer) Example response: ```json { "tweets": [ { "type": "tweet", "id": "1585341984679469056", "url": "https://x.com/elonmusk/status/1585341984679469056", "twitterUrl": "https://twitter.com/elonmusk/status/1585341984679469056", "text": "Entering Twitter HQ – let that sink in! https://t.co/D68z4K2wq7", "source": "", "retweetCount": 154867, "replyCount": 58146, "likeCount": 1224788, "quoteCount": 42870, "viewCount": 0, "createdAt": "Wed Oct 26 18:45:58 +0000 2022", "lang": "en", "bookmarkCount": 14053, "isReply": false, "inReplyToId": "", "conversationId": "1585341984679469056", "displayTextRange": [ 0, 39 ], "inReplyToUserId": "", "inReplyToUsername": "", "isPinned": false, "author": { "type": "user", "userName": "elonmusk", "url": "https://x.com/elonmusk", "twitterUrl": "https://twitter.com/elonmusk", "id": "44196397", "name": "Elon Musk", "isVerified": false, "isBlueVerified": true, "verifiedType": null, "profilePicture": "https://pbs.twimg.com/profile_images/2103567689515954176/aR-Kjpp4_normal.jpg", "coverPicture": "https://pbs.twimg.com/profile_banners/44196397/1774145451", "description": "https://t.co/ZdBx5WABYx", "location": "", "followers": 241530577, "following": 1423, "status": "", "canDm": false, "canMediaTag": false, "createdAt": "Tue Jun 02 20:12:29 +0000 2009", "entities": { "description": { "urls": [ { "display_url": "Terafab.AI", "expanded_url": "http://Terafab.AI", "indices": [ 0, 23 ], "url": "https://t.co/ZdBx5WABYx" } ] } }, "fastFollowersCount": 0, "favouritesCount": 256037, "hasCustomTimelines": true, "isTranslator": false, "mediaCount": 4749, "statusesCount": 111157, "withheldInCountries": [], "affiliatesHighlightedLabel": { "label": { "badge": { "url": "https://pbs.twimg.com/profile_images/1955359038532653056/OSHY3ewP_bigger.jpg" }, "description": "X", "url": { "url": "https://twitter.com/X", "url_type": "DeepLink" }, "user_label_display_type": "Badge", "user_label_type": "BusinessLabel" } }, "possiblySensitive": false, "pinnedTweetIds": [ "2114765150431682772" ], "profile_bio": { "description": "https://t.co/ZdBx5WABYx", "entities": { "description": { "urls": [ { "display_url": "Terafab.AI", "expanded_url": "http://Terafab.AI", "indices": [ 0, 23 ], "url": "https://t.co/ZdBx5WABYx" } ] } } }, "isAutomated": false, "automatedBy": null }, "extendedEntities": { "media": [ { "additional_media_info": { "monetizable": false }, "display_url": "pic.x.com/D68z4K2wq7", "expanded_url": "https://x.com/elonmusk/status/1585341984679469056/video/1", "ext_master_playlist_only": [], "ext_media_availability": { "status": "Available" }, "ext_playlists": [], "id_str": "1585341912877146112", "indices": [ 40, 63 ], "media_key": "7_1585341912877146112", "media_results": { "id": "QXBpTWVkaWFSZXN1bHRzOgwAAwoAARYARBH8lKAACgACFgBEIrRVIAAAAA==", "result": { "__typename": "ApiMedia", "id": "QXBpTWVkaWE6DAADCgABFgBEEfyUoAAKAAIWAEQitFUgAAAA", "media_key": "7_1585341912877146112" } }, "media_url_https": "https://pbs.twimg.com/ext_tw_video_thumb/1585341912877146112/pu/img/DwJ7wlGIe9iryk6N.jpg", "original_info": { "focus_rects": [], "height": 1080, "width": 1920 }, "sizes": { "large": { "h": 1080, "w": 1920 } }, "type": "video", "url": "https://t.co/D68z4K2wq7", "video_info": { "aspect_ratio": [ 16, 9 ], "duration_millis": 9301, "variants": [ { "content_type": "application/x-mpegURL", "url": "https://video-s.twimg.com/ext_tw_video/1585341912877146112/pu/pl/TyyErONagoNhghKI.m3u8?tag=14&v=9a8" } ] } } ] }, "card": null, "place": {}, "entities": {}, "isRetweet": false, "isQuote": false, "isConversationControlled": false, "quoted_tweet": null, "retweeted_tweet": null, "isLimitedReply": false, "communityInfo": null } ], "status": "success", "msg": "success", "code": 0 } ``` ### Advanced search `GET https://api.cheapxapi.com/twitter/tweet/advanced_search` · $0.0006 per request · https://cheapxapi.com/docs/tweet-advanced-search Search tweets with the X advanced search syntax, e.g. `from:NASA since:2026-01-01`. Paginated: use `cursor` / `next_cursor`. When to use it: - Everything X search does: keywords, phrases, `from:` and `to:` accounts, `since:` and `until:` dates, `min_faves:`, `lang:` and `filter:`. - Collect posts about a topic, product or event, sorted by `Latest` or `Top`. - Pull an account's posts from a specific period by combining `from:` with `since:` and `until:`. Tip: Each page is one billed request. For a long date range, split it into smaller windows so a single query never has to page very deep. Related: Search tweets across communities (the same kind of search, limited to community posts); Search users (search accounts instead of posts) Parameters: - `query` (query, string, required): Search query. - `queryType` (query, string, required): `Latest` or `Top`. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/tweet/advanced_search?query=from%3ANASA&queryType=Latest" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `tweets` (array of Tweet) - `type` ("tweet") - `id` (string) - `url` (string) - `text` (string) - `source` (string) - `retweetCount` (integer) - `replyCount` (integer) - `likeCount` (integer) - `quoteCount` (integer) - `viewCount` (integer) - `createdAt` (string) - `lang` (string) - `bookmarkCount` (integer) - `isReply` (boolean) - `inReplyToId` (string) - `conversationId` (string) - `displayTextRange` (array of integer) - `inReplyToUserId` (string) - `inReplyToUsername` (string) - `author` (UserInfo) - `entities` (TweetEntities) - `quoted_tweet` (Tweet) - `retweeted_tweet` (Tweet) - `isLimitedReply` (boolean) - `has_next_page` (boolean) - `next_cursor` (string) Example response: ```json { "tweets": [ { "type": "tweet", "id": "2115845108176441635", "url": "https://x.com/NASA/status/2115845108176441635", "twitterUrl": "https://twitter.com/NASA/status/2115845108176441635", "text": "@csa_asc @Space_Station Solar array, roll out! At about four-and-a-half hours into today’s spacewalk, the solar array began deployment. It is now fully deployed. https://t.co/G0eGzCI7Pb", "source": "", "retweetCount": 1, "replyCount": 1, "likeCount": 65, "quoteCount": 1, "viewCount": 23096, "createdAt": "Thu Oct 29 16:35:58 +0000 2026", "lang": "en", "bookmarkCount": 3, "isReply": true, "inReplyToId": "2115813044055884093", "conversationId": "2115753332958433574", "displayTextRange": [ 24, 161 ], "inReplyToUserId": "11348282", "inReplyToUsername": "NASA", "author": { "type": "user", "userName": "NASA", "url": "https://x.com/NASA", "twitterUrl": "https://twitter.com/NASA", "id": "11348282", "name": "NASA", "isVerified": false, "isBlueVerified": true, "verifiedType": "Government", "profilePicture": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_normal.jpg", "coverPicture": "https://pbs.twimg.com/profile_banners/11348282/1788992290", "description": "", "location": "Pale Blue Dot", "followers": 92309786, "following": 115, "status": "", "canDm": false, "canMediaTag": true, "createdAt": "Wed Dec 19 20:20:32 +0000 2007", "entities": { "description": { "urls": [] }, "url": {} }, "fastFollowersCount": 0, "favouritesCount": 17048, "hasCustomTimelines": true, "isTranslator": true, "mediaCount": 28216, "statusesCount": 74468, "withheldInCountries": [], "affiliatesHighlightedLabel": {}, "possiblySensitive": false, "pinnedTweetIds": [ "2115753332958433574" ], "profile_bio": { "description": "Making the seemingly impossible, possible. ✨", "entities": { "description": {}, "url": { "urls": [ { "display_url": "nasa.gov", "expanded_url": "http://www.nasa.gov/", "indices": [ 0, 23 ], "url": "https://t.co/9NkQJKAnuU" } ] } } }, "isAutomated": false, "automatedBy": null, "protected": false }, "extendedEntities": { "media": [ { "additional_media_info": { "monetizable": false }, "allow_download_status": { "allow_download": true }, "display_url": "pic.x.com/G0eGzCI7Pb", "expanded_url": "https://x.com/NASA/status/2115845108176441635/video/1", "ext_master_playlist_only": [], "ext_media_availability": { "status": "Available" }, "ext_playlists": [], "id_str": "2115844986121973760", "indices": [ 162, 185 ], "media_key": "13_2115844986121973760", "media_results": { "id": "QXBpTWVkaWFSZXN1bHRzOgwABAoAAR1c/c39l3AAAAA=", "result": { "__typename": "ApiMedia", "id": "QXBpTWVkaWE6DAAECgABHVz9zf2XcAAAAA==", "media_key": "13_2115844986121973760" } }, "media_url_https": "https://pbs.twimg.com/amplify_video_thumb/2115844986121973760/img/UVq5lw5EUQLmo5YD.jpg", "original_info": { "focus_rects": [], "height": 2160, "width": 3840 }, "sizes": { "large": { "h": 1152, "w": 2048 } }, "type": "video", "url": "https://t.co/G0eGzCI7Pb", "video_info": { "aspect_ratio": [ 16, 9 ], "duration_millis": 22058, "variants": [ { "content_type": "application/x-mpegURL", "url": "https://video-s.twimg.com/amplify_video/2115844986121973760/pl/99mP1s18e6NcCJ65.m3u8?tag=29&v=491" } ] } } ] }, "card": null, "place": {}, "entities": { "user_mentions": [ { "id_str": "93714983", "indices": [ 0, 8 ], "name": "Canadian Space Agency", "screen_name": "csa_asc" } ] }, "quoted_tweet": null, "retweeted_tweet": null, "isLimitedReply": false, "communityInfo": null, "article": null } ], "has_next_page": true, "next_cursor": "DAADDAABCgABHVz96mia0SMKAAIdVTZJU9cQiwAIAAIAAAACCAADAAAAAAgABAAAAAAKAAUdXQH6pYAnEAoABh1dAfqlf9jwCwAHAAAA8EVtUEM2d0FBQWZRL2dHSk4wdkdwL0FBQUFCUWRWWmpsOEJvdzRoMWFyTzY2bW9FV0hWek0rRm5hc05ZZFZWajFGWmJ3MlIxVnBQVFcxc0dTSFZmODNTT2JNREVkV0JUcFBaWUFleDFjL2Vwb210RWpIVnlxY2xOV0VTWWRYR3lpdTFa…" } ``` ### Get tweet replies `GET https://api.cheapxapi.com/twitter/tweet/replies` · $0.0006 per request · https://cheapxapi.com/docs/tweet-replies Replies to a tweet. Paginated: use `cursor` / `next_cursor`. When to use it: - Collect the replies under a post to read reactions or answer questions. - Fetch only replies posted after your last check with `sinceTime`. Tip: To get the most-liked replies first, use *Get tweet replies (sortable)* with `queryType=Likes`. Related: Get tweet replies (sortable) (replies ordered by relevance, latest or likes); Get thread context (the full thread around a post) Parameters: - `tweetId` (query, string, required): Numeric tweet ID. - `sinceTime` (query, integer): Only items created at or after this Unix timestamp (seconds). - `untilTime` (query, integer): Only items created before this Unix timestamp (seconds). - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/tweet/replies?tweetId=1585341984679469056" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `tweets` (array of Tweet) - `type` ("tweet") - `id` (string) - `url` (string) - `text` (string) - `source` (string) - `retweetCount` (integer) - `replyCount` (integer) - `likeCount` (integer) - `quoteCount` (integer) - `viewCount` (integer) - `createdAt` (string) - `lang` (string) - `bookmarkCount` (integer) - `isReply` (boolean) - `inReplyToId` (string) - `conversationId` (string) - `displayTextRange` (array of integer) - `inReplyToUserId` (string) - `inReplyToUsername` (string) - `author` (UserInfo) - `entities` (TweetEntities) - `quoted_tweet` (Tweet) - `retweeted_tweet` (Tweet) - `isLimitedReply` (boolean) - `has_next_page` (boolean) - `next_cursor` (string) - `status` ("success" | "error") - `msg` (string) Example response: ```json { "tweets": [ { "type": "tweet", "id": "2115697161967140989", "url": "https://x.com/example_user_1/status/2115697161967140989", "twitterUrl": "https://twitter.com/example_user_1/status/2115697161967140989", "text": "Example post from a private account.", "source": "", "retweetCount": 0, "replyCount": 0, "likeCount": 0, "quoteCount": 0, "viewCount": 5, "createdAt": "Thu Oct 29 06:48:05 +0000 2026", "lang": "en", "bookmarkCount": 0, "isReply": true, "inReplyToId": "1585341984679469056", "conversationId": "1585341984679469056", "displayTextRange": [ 10, 31 ], "inReplyToUserId": "44196397", "inReplyToUsername": "elonmusk", "author": { "type": "user", "userName": "example_user_1", "url": "https://x.com/example_user_1", "twitterUrl": "https://twitter.com/example_user_1", "id": "1000000001", "name": "Example User 1", "isVerified": false, "isBlueVerified": false, "verifiedType": null, "profilePicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "coverPicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "description": "", "location": "", "followers": 60, "following": 314, "status": "", "canDm": false, "canMediaTag": true, "createdAt": "Tue Aug 18 17:51:29 +0000 2026", "entities": { "description": { "urls": [] }, "url": {} }, "fastFollowersCount": 0, "favouritesCount": 1263, "hasCustomTimelines": true, "isTranslator": false, "mediaCount": 0, "statusesCount": 192, "withheldInCountries": [], "affiliatesHighlightedLabel": {}, "possiblySensitive": false, "pinnedTweetIds": [], "profile_bio": { "description": "", "entities": {} }, "isAutomated": false, "automatedBy": null, "protected": false }, "extendedEntities": {}, "card": null, "place": {}, "entities": {}, "quoted_tweet": null, "retweeted_tweet": null, "isLimitedReply": false, "communityInfo": null, "article": null } ], "has_next_page": true, "next_cursor": "DAADDAABCgABHVx3W_9agH0KAAIdWkS-mdbBFQAIAAIAAAACCAADAAAAAAgABAAAAAAKAAUdXQH7yAAnEAoABh1dAfvH_9jwCwAHAAAA8EVtUEM2d0FBQWZRL2dHSk4wdkdwL0FBQUFCUWRXbGJ2ZlZid3hoMWF5WndpRzVHL0hWcm1FUFBYZ0RFZFdtSlZQcG93MkIxYWx0OVEyc0RWSFZ4M1cvOWFnSDBkV2tuMlJScWdpUjFhVHdUWkc5RlJIVnFFYXNnYkFKUWRXcHZrMnBx…", "status": "success", "msg": "success" } ``` ### Get tweet replies (sortable) `GET https://api.cheapxapi.com/twitter/tweet/replies/v2` · $0.0006 per request · https://cheapxapi.com/docs/tweet-replies-v2 Replies to a tweet, with a choice of ordering via `queryType`. Paginated: use `cursor` / `next_cursor`. When to use it: - Read the top replies first: `queryType=Likes` orders by likes, `Relevance` matches what X shows under the post. - Read replies newest first with `queryType=Latest`. Tip: There is no time filter here. Use *Get tweet replies* when you need `sinceTime` or `untilTime`. Related: Get tweet replies (replies with time filters); Get quote tweets (reactions posted as quotes instead of replies) Parameters: - `tweetId` (query, string, required): Numeric tweet ID. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. - `queryType` (query, string): Ordering: `Relevance` (default), `Latest` or `Likes`. Example request: ```bash curl "https://api.cheapxapi.com/twitter/tweet/replies/v2?tweetId=1585341984679469056" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `tweets` (array of Tweet) - `type` ("tweet") - `id` (string) - `url` (string) - `text` (string) - `source` (string) - `retweetCount` (integer) - `replyCount` (integer) - `likeCount` (integer) - `quoteCount` (integer) - `viewCount` (integer) - `createdAt` (string) - `lang` (string) - `bookmarkCount` (integer) - `isReply` (boolean) - `inReplyToId` (string) - `conversationId` (string) - `displayTextRange` (array of integer) - `inReplyToUserId` (string) - `inReplyToUsername` (string) - `author` (UserInfo) - `entities` (TweetEntities) - `quoted_tweet` (Tweet) - `retweeted_tweet` (Tweet) - `isLimitedReply` (boolean) - `has_next_page` (boolean) - `next_cursor` (string) - `status` ("success" | "error") - `msg` (string) Example response: ```json { "tweets": [ { "type": "tweet", "id": "1585341984679469056", "url": "https://x.com/elonmusk/status/1585341984679469056", "twitterUrl": "https://twitter.com/elonmusk/status/1585341984679469056", "text": "Entering Twitter HQ – let that sink in! https://t.co/D68z4K2wq7", "source": "", "retweetCount": 154867, "replyCount": 58146, "likeCount": 1224788, "quoteCount": 42870, "viewCount": 0, "createdAt": "Wed Oct 26 18:45:58 +0000 2022", "lang": "en", "bookmarkCount": 14053, "isReply": false, "inReplyToId": null, "conversationId": "1585341984679469056", "inReplyToUserId": "", "inReplyToUsername": "", "isPinned": false, "author": { "type": "user", "userName": "elonmusk", "url": "https://x.com/elonmusk", "twitterUrl": "https://twitter.com/elonmusk", "id": "44196397", "name": "Elon Musk", "isVerified": false, "isBlueVerified": true, "profilePicture": "https://pbs.twimg.com/profile_images/2103567689515954176/aR-Kjpp4_normal.jpg", "coverPicture": "https://pbs.twimg.com/profile_banners/44196397/1774145451", "description": "https://t.co/ZdBx5WABYx", "location": "", "followers": 241530584, "following": 1423, "status": "", "canDm": false, "canMediaTag": false, "createdAt": "Tue Jun 02 20:12:29 +0000 2009", "entities": { "description": { "urls": [ { "display_url": "Terafab.AI", "expanded_url": "http://Terafab.AI", "indices": [ 0, 23 ], "url": "https://t.co/ZdBx5WABYx" } ] } }, "fastFollowersCount": 0, "favouritesCount": 256037, "hasCustomTimelines": true, "isTranslator": false, "mediaCount": 4749, "statusesCount": 111157, "withheldInCountries": [], "affiliatesHighlightedLabel": { "label": { "badge": { "url": "https://pbs.twimg.com/profile_images/1955359038532653056/OSHY3ewP_bigger.jpg" }, "description": "X", "url": { "url": "https://twitter.com/X", "urlType": "DeepLink" }, "userLabelDisplayType": "Badge", "userLabelType": "BusinessLabel" } }, "possiblySensitive": false, "pinnedTweetIds": [ "2114765150431682772" ], "profile_bio": {}, "isAutomated": false, "automatedBy": null }, "extendedEntities": { "media": [ { "additional_media_info": { "monetizable": false }, "display_url": "pic.x.com/D68z4K2wq7", "expanded_url": "https://x.com/elonmusk/status/1585341984679469056/video/1", "ext_media_availability": { "status": "Available" }, "id_str": "1585341912877146112", "indices": [ 40, 63 ], "media_key": "7_1585341912877146112", "media_results": { "result": { "media_key": "7_1585341912877146112" } }, "media_url_https": "https://pbs.twimg.com/ext_tw_video_thumb/1585341912877146112/pu/img/DwJ7wlGIe9iryk6N.jpg", "original_info": { "focus_rects": [], "height": 1080, "width": 1920 }, "sizes": { "large": { "h": 1080, "resize": "fit", "w": 1920 }, "medium": { "h": 675, "resize": "fit", "w": 1200 }, "small": { "h": 383, "resize": "fit", "w": 680 }, "thumb": { "h": 150, "resize": "crop", "w": 150 } }, "type": "video", "url": "https://t.co/D68z4K2wq7", "video_info": { "aspect_ratio": [ 16, 9 ], "duration_millis": 9301, "variants": [ { "content_type": "application/x-mpegURL", "url": "https://video.twimg.com/ext_tw_video/1585341912877146112/pu/pl/TyyErONagoNhghKI.m3u8?tag=14&v=9a8" } ] } } ] }, "card": {}, "place": {}, "entities": { "media": [ { "additional_media_info": { "monetizable": false }, "display_url": "pic.x.com/D68z4K2wq7", "expanded_url": "https://x.com/elonmusk/status/1585341984679469056/video/1", "ext_media_availability": { "status": "Available" }, "id_str": "1585341912877146112", "indices": [ 40, 63 ], "media_key": "7_1585341912877146112", "media_results": { "result": { "media_key": "7_1585341912877146112" } }, "media_url_https": "https://pbs.twimg.com/ext_tw_video_thumb/1585341912877146112/pu/img/DwJ7wlGIe9iryk6N.jpg", "original_info": { "focus_rects": [], "height": 1080, "width": 1920 }, "sizes": { "large": { "h": 1080, "resize": "fit", "w": 1920 }, "medium": { "h": 675, "resize": "fit", "w": 1200 }, "small": { "h": 383, "resize": "fit", "w": 680 }, "thumb": { "h": 150, "resize": "crop", "w": 150 } }, "type": "video", "url": "https://t.co/D68z4K2wq7", "video_info": { "aspect_ratio": [ 16, 9 ], "duration_millis": 9301, "variants": [ { "content_type": "application/x-mpegURL", "url": "https://video.twimg.com/ext_tw_video/1585341912877146112/pu/pl/TyyErONagoNhghKI.m3u8?tag=14&v=9a8" } ] } } ] }, "isRetweet": false, "isQuote": false, "isConversationControlled": false, "quoted_tweet": null, "retweeted_tweet": null } ], "has_next_page": true, "next_cursor": "DAAKCgABHV0B_bF__p8LAAIAAAFwRW1QQzZ3QUFBZlEvZ0dKTjB2R3AvQUFBQUNBZFduSTJ4NXRRV1JZQVJDSzBWU0FBSFZybUVQUFhnREVkV2lzS2Jkc3hQeDFhbHQ5UTJzRFZIVm94MUZoV0FTQWRXa24yUlJxZ2lSMWFUd1RaRzlGUkhWb3AwUTliMEV3ZFdxU3htbHNBR3gxYVJMNloxc0VWSFZvcmRVMGJJWTRkV29ZQTMxdUFqUjFhWDFzbmxsRjlIVnRtNEdPV0VBQWRX…", "status": "success", "msg": "success" } ``` ### Get thread context `GET https://api.cheapxapi.com/twitter/tweet/thread_context` · $0.0006 per request · https://cheapxapi.com/docs/tweet-thread-context The conversation thread a tweet belongs to. Paginated: use `cursor` / `next_cursor`. When to use it: - Rebuild a whole thread from any one of its posts. - Give a reply its context: the post it answers and the conversation around it. Tip: Pass any post in the conversation. Every post in the response carries the same `conversationId`. Related: Get tweet replies (only the direct replies to one post); Get tweet by ID (one post by ID) Parameters: - `tweetId` (query, string, required): Numeric tweet ID. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/tweet/thread_context?tweetId=1585341984679469056" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `tweets` (array of Tweet) - `type` ("tweet") - `id` (string) - `url` (string) - `text` (string) - `source` (string) - `retweetCount` (integer) - `replyCount` (integer) - `likeCount` (integer) - `quoteCount` (integer) - `viewCount` (integer) - `createdAt` (string) - `lang` (string) - `bookmarkCount` (integer) - `isReply` (boolean) - `inReplyToId` (string) - `conversationId` (string) - `displayTextRange` (array of integer) - `inReplyToUserId` (string) - `inReplyToUsername` (string) - `author` (UserInfo) - `entities` (TweetEntities) - `quoted_tweet` (Tweet) - `retweeted_tweet` (Tweet) - `isLimitedReply` (boolean) - `has_next_page` (boolean) - `next_cursor` (string) - `status` ("success" | "error") - `msg` (string) Example response: ```json { "tweets": [ { "type": "tweet", "id": "1585341984679469056", "url": "https://x.com/elonmusk/status/1585341984679469056", "twitterUrl": "https://twitter.com/elonmusk/status/1585341984679469056", "text": "Entering Twitter HQ – let that sink in! https://t.co/D68z4K2wq7", "source": "", "retweetCount": 154867, "replyCount": 58146, "likeCount": 1224788, "quoteCount": 42870, "viewCount": 0, "createdAt": "Wed Oct 26 18:45:58 +0000 2022", "lang": "en", "bookmarkCount": 14053, "isReply": false, "inReplyToId": null, "conversationId": "1585341984679469056", "inReplyToUserId": null, "inReplyToUsername": null, "author": { "type": "user", "userName": "elonmusk", "url": "https://x.com/elonmusk", "twitterUrl": "https://twitter.com/elonmusk", "id": "44196397", "name": "Elon Musk", "isVerified": false, "isBlueVerified": true, "profilePicture": "https://pbs.twimg.com/profile_images/2103567689515954176/aR-Kjpp4_normal.jpg", "coverPicture": "https://pbs.twimg.com/profile_banners/44196397/1774145451", "description": "https://t.co/ZdBx5WABYx", "location": "", "followers": 241530577, "following": 1423, "status": "", "canDm": false, "canMediaTag": false, "createdAt": "Tue Jun 02 20:12:29 +0000 2009", "entities": { "description": { "urls": [ { "display_url": "Terafab.AI", "expanded_url": "http://Terafab.AI", "indices": [ 0, 23 ], "url": "https://t.co/ZdBx5WABYx" } ] } }, "fastFollowersCount": 0, "favouritesCount": 256037, "hasCustomTimelines": true, "isTranslator": false, "mediaCount": 4749, "statusesCount": 111157, "protected": false, "withheldInCountries": [], "affiliatesHighlightedLabel": {}, "possiblySensitive": false, "pinnedTweetIds": [ "2114765150431682772" ], "profile_bio": "https://t.co/ZdBx5WABYx" }, "extendedEntities": { "media": [ { "additional_media_info": { "monetizable": false }, "display_url": "pic.x.com/D68z4K2wq7", "expanded_url": "https://x.com/elonmusk/status/1585341984679469056/video/1", "ext_master_playlist_only": [], "ext_media_availability": { "status": "Available" }, "ext_playlists": [], "id_str": "1585341912877146112", "indices": [ 40, 63 ], "media_key": "7_1585341912877146112", "media_url_https": "https://pbs.twimg.com/ext_tw_video_thumb/1585341912877146112/pu/img/DwJ7wlGIe9iryk6N.jpg", "original_info": { "focus_rects": [], "height": 1080, "width": 1920 }, "sizes": { "large": { "h": 1080, "w": 1920 } }, "type": "video", "url": "https://t.co/D68z4K2wq7", "video_info": { "aspect_ratio": [ 16, 9 ], "duration_millis": 9301, "variants": [ { "content_type": "application/x-mpegURL", "url": "https://video-s.twimg.com/ext_tw_video/1585341912877146112/pu/pl/TyyErONagoNhghKI.m3u8?tag=14&v=9a8" } ] } } ] }, "card": null, "place": {}, "entities": {}, "quoted_tweet": null, "retweeted_tweet": null } ], "has_next_page": true, "next_cursor": "DAAKCgABHV0B_3b__p8LAAIAAAGoRW1QQzZ3QUFBZlEvZ0dKTjB2R3AvQUFBQUNVV0FFUWl0RlVnQUJZQVJvbjlsR0FBRmdCSWtGMmFZQUVXQUVTdE1KcUFBaFlBUkxwM0dvQUFGZ0JHa0FuVW9BRVdBRWk5bXhTZ0FCWUFSYktKbW1BQUZnQkUwOWdhZ0FBV0FFVFlNbHBnQUJZQVIvblcycEFBRmdCRkVsSVVvQUFXQUg1bHJocVFBUllBV2Z0MzJoQUFGZ0JGRnIvVlVBQVdB…", "status": "success", "msg": "success" } ``` ### Get quote tweets `GET https://api.cheapxapi.com/twitter/tweet/quotes` · $0.0006 per request · https://cheapxapi.com/docs/tweet-quotes Tweets that quote a tweet. Paginated: use `cursor` / `next_cursor`. When to use it: - See what people said when they shared a post with their own comment. - Measure how far a post spread beyond the author's followers. Tip: Use `sinceTime` and `untilTime` to look at the first hours after posting, or only at what is new. Related: Get retweeters (accounts that reposted without comment); Get tweet replies (reactions posted as replies) Parameters: - `tweetId` (query, string, required): Numeric tweet ID. - `sinceTime` (query, integer): Only items created at or after this Unix timestamp (seconds). - `untilTime` (query, integer): Only items created before this Unix timestamp (seconds). - `includeReplies` (query, boolean): Include replies (`true` / `false`). - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/tweet/quotes?tweetId=1585341984679469056" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `tweets` (array of Tweet) - `type` ("tweet") - `id` (string) - `url` (string) - `text` (string) - `source` (string) - `retweetCount` (integer) - `replyCount` (integer) - `likeCount` (integer) - `quoteCount` (integer) - `viewCount` (integer) - `createdAt` (string) - `lang` (string) - `bookmarkCount` (integer) - `isReply` (boolean) - `inReplyToId` (string) - `conversationId` (string) - `displayTextRange` (array of integer) - `inReplyToUserId` (string) - `inReplyToUsername` (string) - `author` (UserInfo) - `entities` (TweetEntities) - `quoted_tweet` (Tweet) - `retweeted_tweet` (Tweet) - `isLimitedReply` (boolean) - `has_next_page` (boolean) - `next_cursor` (string) - `status` ("success" | "error") - `msg` (string) Example response: ```json { "tweets": [ { "type": "tweet", "id": "2115612293165965524", "url": "https://x.com/example_user_1/status/2115612293165965524", "twitterUrl": "https://twitter.com/example_user_1/status/2115612293165965524", "text": "Example post from a private account.", "source": "", "retweetCount": 0, "replyCount": 0, "likeCount": 2, "quoteCount": 0, "viewCount": 68, "createdAt": "Thu Oct 29 01:10:51 +0000 2026", "lang": "en", "bookmarkCount": 0, "isReply": false, "inReplyToId": null, "conversationId": "2115612293165965524", "displayTextRange": [ 0, 97 ], "inReplyToUserId": null, "inReplyToUsername": null, "author": { "type": "user", "userName": "example_user_1", "url": "https://x.com/example_user_1", "twitterUrl": "https://twitter.com/example_user_1", "id": "1000000001", "name": "Example User 1", "isVerified": false, "isBlueVerified": true, "verifiedType": null, "profilePicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "coverPicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "description": "", "location": "", "followers": 5109, "following": 306, "status": "", "canDm": true, "canMediaTag": false, "createdAt": "Tue Mar 07 19:34:03 +0000 2017", "entities": { "description": { "urls": [] }, "url": {} }, "fastFollowersCount": 0, "favouritesCount": 242755, "hasCustomTimelines": true, "isTranslator": false, "mediaCount": 3394, "statusesCount": 247234, "withheldInCountries": [], "affiliatesHighlightedLabel": {}, "possiblySensitive": false, "pinnedTweetIds": [ "2115547785298948441" ], "profile_bio": { "description": "", "entities": {} }, "isAutomated": false, "automatedBy": null, "protected": false }, "extendedEntities": {}, "card": null, "place": {}, "entities": {}, "quoted_tweet": { "type": "tweet", "id": "1585341984679469056", "url": "https://x.com/elonmusk/status/1585341984679469056", "twitterUrl": "https://twitter.com/elonmusk/status/1585341984679469056", "text": "Entering Twitter HQ – let that sink in! https://t.co/D68z4K2wq7", "source": "", "retweetCount": 154867, "replyCount": 58146, "likeCount": 1224788, "quoteCount": 42870, "viewCount": 0, "createdAt": "Wed Oct 26 18:45:58 +0000 2022", "lang": "en", "bookmarkCount": 14053, "isReply": false, "inReplyToId": null, "conversationId": "1585341984679469056", "displayTextRange": [ 0, 39 ], "inReplyToUserId": null, "inReplyToUsername": null, "author": { "type": "user", "userName": "elonmusk", "url": "https://x.com/elonmusk", "twitterUrl": "https://twitter.com/elonmusk", "id": "44196397", "name": "Elon Musk", "isVerified": false, "isBlueVerified": true, "verifiedType": null, "profilePicture": "https://pbs.twimg.com/profile_images/2103567689515954176/aR-Kjpp4_normal.jpg", "coverPicture": "https://pbs.twimg.com/profile_banners/44196397/1774145451", "description": "", "location": "", "followers": 241530577, "following": 1423, "status": "", "canDm": false, "canMediaTag": false, "createdAt": "Tue Jun 02 20:12:29 +0000 2009", "entities": { "description": { "urls": [] }, "url": {} }, "fastFollowersCount": 0, "favouritesCount": 256037, "hasCustomTimelines": true, "isTranslator": false, "mediaCount": 4749, "statusesCount": 111157, "withheldInCountries": [], "affiliatesHighlightedLabel": { "label": { "badge": { "url": "https://pbs.twimg.com/profile_images/1955359038532653056/OSHY3ewP_bigger.jpg" }, "description": "X", "url": { "url": "https://twitter.com/X", "url_type": "DeepLink" }, "user_label_display_type": "Badge", "user_label_type": "BusinessLabel" } }, "possiblySensitive": false, "pinnedTweetIds": [ "2114765150431682772" ], "profile_bio": { "description": "https://t.co/ZdBx5WABYx", "entities": { "description": { "urls": [ { "display_url": "Terafab.AI", "expanded_url": "http://Terafab.AI", "indices": [ 0, 23 ], "url": "https://t.co/ZdBx5WABYx" } ] } } }, "isAutomated": false, "automatedBy": null, "protected": false }, "extendedEntities": { "media": [ { "additional_media_info": { "monetizable": false }, "display_url": "pic.x.com/D68z4K2wq7", "expanded_url": "https://x.com/elonmusk/status/1585341984679469056/video/1", "ext_master_playlist_only": [], "ext_media_availability": { "status": "Available" }, "ext_playlists": [], "id_str": "1585341912877146112", "indices": [ 40, 63 ], "media_key": "7_1585341912877146112", "media_results": { "id": "QXBpTWVkaWFSZXN1bHRzOgwAAwoAARYARBH8lKAACgACFgBEIrRVIAAAAA==", "result": { "__typename": "ApiMedia", "id": "QXBpTWVkaWE6DAADCgABFgBEEfyUoAAKAAIWAEQitFUgAAAA", "media_key": "7_1585341912877146112" } }, "media_url_https": "https://pbs.twimg.com/ext_tw_video_thumb/1585341912877146112/pu/img/DwJ7wlGIe9iryk6N.jpg", "original_info": { "focus_rects": [], "height": 1080, "width": 1920 }, "sizes": { "large": { "h": 1080, "w": 1920 } }, "type": "video", "url": "https://t.co/D68z4K2wq7", "video_info": { "aspect_ratio": [ 16, 9 ], "duration_millis": 9301, "variants": [ { "content_type": "application/x-mpegURL", "url": "https://video-s.twimg.com/ext_tw_video/1585341912877146112/pu/pl/TyyErONagoNhghKI.m3u8?tag=14&v=9a8" } ] } } ] }, "card": null, "place": {}, "entities": {}, "quoted_tweet": null, "retweeted_tweet": null, "isLimitedReply": false, "communityInfo": null, "article": null }, "retweeted_tweet": null, "isLimitedReply": false, "communityInfo": null, "article": null } ], "has_next_page": true, "next_cursor": "DAADDAABCgABHVwqK_CbYNQKAAIdWmlKGRuRBAAIAAIAAAACCAADAAAAAAgABAAAAAAKAAUdXQIArIAnEAoABh1dAgCsf9jwCwAHAAAA8EVtUEM2d0FBQWZRL2dHSk4wdkdwL0FBQUFCUWRXcE1JYUpveE94MWFiZi81bHhDa0hWc0UweDhhUVZjZFduMXpkcGJ4SkIxYWNIYkpXOUJESFZzRUwyaldNUHNkV25DT2xCdEJSaDFheDdvbFd0QXZIVnJJVzRyYjBGa2RXdXNFNDFx…", "status": "success", "msg": "success" } ``` ### Get retweeters `GET https://api.cheapxapi.com/twitter/tweet/retweeters` · $0.0006 per request · https://cheapxapi.com/docs/tweet-retweeters Users who retweeted a tweet. Paginated: use `cursor` / `next_cursor`. When to use it: - List the accounts that retweeted a post, e.g. to verify entries in a retweet giveaway. - Find the accounts that amplify a topic or a competitor. Tip: Each result is a profile with follower counts, so you can rank who gave a post the most reach. Related: Get quote tweets (reposts that added a comment); Check follow relationship (also require entrants to follow you) Parameters: - `tweetId` (query, string, required): Numeric tweet ID. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/tweet/retweeters?tweetId=1585341984679469056" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `users` (array of UserInfo) - `type` ("user") - `userName` (string) - `url` (string) - `id` (string) - `name` (string) - `isBlueVerified` (boolean) - `protected` (boolean) - `verifiedType` (string) - `profilePicture` (string) - `coverPicture` (string) - `description` (string) - `location` (string) - `followers` (integer) - `following` (integer) - `canDm` (boolean) - `createdAt` (string) - `favouritesCount` (integer) - `hasCustomTimelines` (boolean) - `isTranslator` (boolean) - `mediaCount` (integer) - `statusesCount` (integer) - `withheldInCountries` (array of string) - `affiliatesHighlightedLabel` (object) - `possiblySensitive` (boolean) - `pinnedTweetIds` (array of string) - `isAutomated` (boolean) - `automatedBy` (string) - `unavailable` (boolean) - `message` (string) - `unavailableReason` (string) - `profile_bio` (object) - `has_next_page` (boolean) - `next_cursor` (string) Example response: ```json { "users": [ { "id": "1000000001", "name": "Example User 1", "userName": "example_user_1", "location": "", "url": "", "description": "", "protected": false, "verified": false, "followers": 2455, "following": 809, "favouritesCount": 192712, "statusesCount": 75527, "mediaCount": 123, "createdAt": "2019-10-02T10:46:35.000000Z", "coverPicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "profilePicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "canDm": true } ], "has_next_page": true, "next_cursor": "SEJhQWdJRGJ5TTZSbURRQUFBPT0=" } ``` ### Get article `GET https://api.cheapxapi.com/twitter/article` · $0.0006 per request · https://cheapxapi.com/docs/article An article (long-form post) by its tweet ID. When to use it: - Get the full text of an X Article (long-form post): title, preview, cover image and `contents`. - Archive or analyze long-form posts with their likes, replies, quotes and views. Tip: An Article is addressed by its tweet ID, the number after `/status/` in its link. Related: Get user's articles (every Article an account has published) Parameters: - `tweet_id` (query, string, required): Numeric tweet ID. Example request: ```bash curl "https://api.cheapxapi.com/twitter/article?tweet_id=2082071471548244406" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `article` (object) - `author` (UserInfo) - `replyCount` (integer) - `likeCount` (integer) - `quoteCount` (integer) - `viewCount` (integer) - `createdAt` (string) - `title` (string) - `preview_text` (string) - `cover_media_img_url` (string) - `contents` (array of object) - `status` ("success" | "failed") - `msg` (string) Example response: ```json { "article": { "id": "QXJ0aWNsZUVudGl0eToyMDgyMDI0OTk3NDgxMjU5MDA5", "author": { "type": "user", "userName": "balajis", "url": "https://x.com/balajis", "twitterUrl": "https://twitter.com/balajis", "id": "2178012643", "name": "Balaji", "isVerified": false, "isBlueVerified": true, "verifiedType": null, "profilePicture": "https://pbs.twimg.com/profile_images/2049168417710915585/egYgw1FA_normal.jpg", "coverPicture": "https://pbs.twimg.com/profile_banners/2178012643/1761485965", "description": "Author of the Network State. Founder of the Network School.", "location": "Network School", "followers": 2266166, "following": 3933, "status": "", "canDm": true, "canMediaTag": false, "createdAt": "Wed Nov 06 12:51:04 +0000 2013", "entities": { "description": {}, "url": { "urls": [ { "display_url": "ns.com", "expanded_url": "https://ns.com", "indices": [ 0, 23 ], "url": "https://t.co/HhDUsvgg0o" } ] } }, "fastFollowersCount": 0, "favouritesCount": 278232, "hasCustomTimelines": false, "isTranslator": false, "mediaCount": 5574, "statusesCount": 31212, "withheldInCountries": [], "affiliatesHighlightedLabel": { "label": { "badge": { "url": "https://pbs.twimg.com/profile_images/1978800279165558784/9_D3CwAc_bigger.jpg" }, "description": "NS", "url": { "url": "https://twitter.com/ns", "urlType": "DeepLink" }, "userLabelDisplayType": "Badge", "userLabelType": "BusinessLabel" } }, "possiblySensitive": false, "pinnedTweetIds": [ "2108596569201397803" ], "profile_bio": {}, "isAutomated": false, "automatedBy": null }, "replyCount": 114, "likeCount": 799, "quoteCount": 55, "viewCount": "306432", "createdAt": "Tue Jul 28 11:51:36 +0000 2026", "title": "Why did Stu Woo of the Wall Street Journal Follow Me to Singapore?", "preview_text": "A writer named Stu Woo recently moved from San Francisco to Singapore. He got in touch to ask me why I’d also moved from San Francisco to Singapore, and why I’d decided to become a proud Singaporean.", "cover_media_img_url": "https://pbs.twimg.com/media/HOTXr2_WIAAodUr.jpg", "contents": [ { "type": "unstyled", "text": "A writer named Stu Woo recently moved from San Francisco to Singapore. He got in touch to ask me why I’d also moved from San Francisco to Singapore, and why I’d decided to become a proud Singaporean. We talked about the reasons he and others had moved away from America — the old …", "inlineStyleRanges": [ { "length": 4, "offset": 105, "style": "Italic" } ] } ] }, "status": "success", "msg": "success" } ``` ## Lists ### Get list tweets `GET https://api.cheapxapi.com/twitter/list/tweets` · $0.0006 per request · https://cheapxapi.com/docs/list-tweets Tweets from members of a list. Paginated: use `cursor` / `next_cursor`. When to use it: - Read a curated feed: put the accounts you care about in an X list, then read all their posts with one request per page instead of one per account. - Narrow it to a time window with `sinceTime` and `untilTime`, or leave replies out. Tip: The list ID is the number at the end of its link, `x.com/i/lists/`. Related: Get list timeline (the list's timeline as X shows it); Get list members (which accounts are in the list) Parameters: - `listId` (query, string, required): Numeric list ID. - `sinceTime` (query, integer): Only items created at or after this Unix timestamp (seconds). - `untilTime` (query, integer): Only items created before this Unix timestamp (seconds). - `includeReplies` (query, boolean): Include replies (`true` / `false`). - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/list/tweets?listId=1953536336675365173" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `tweets` (array of Tweet) - `type` ("tweet") - `id` (string) - `url` (string) - `text` (string) - `source` (string) - `retweetCount` (integer) - `replyCount` (integer) - `likeCount` (integer) - `quoteCount` (integer) - `viewCount` (integer) - `createdAt` (string) - `lang` (string) - `bookmarkCount` (integer) - `isReply` (boolean) - `inReplyToId` (string) - `conversationId` (string) - `displayTextRange` (array of integer) - `inReplyToUserId` (string) - `inReplyToUsername` (string) - `author` (UserInfo) - `entities` (TweetEntities) - `quoted_tweet` (Tweet) - `retweeted_tweet` (Tweet) - `isLimitedReply` (boolean) - `has_next_page` (boolean) - `next_cursor` (string) - `status` ("success" | "error") - `msg` (string) Example response: ```json { "tweets": [ { "type": "tweet", "id": "2115849543808127473", "url": "https://x.com/example_user_1/status/2115849543808127473", "twitterUrl": "https://twitter.com/example_user_1/status/2115849543808127473", "text": "Example post from a private account.", "source": "", "retweetCount": 0, "replyCount": 0, "likeCount": 0, "quoteCount": 0, "viewCount": 0, "createdAt": "Thu Oct 29 16:53:36 +0000 2026", "lang": "en", "bookmarkCount": 0, "isReply": false, "inReplyToId": null, "conversationId": "2115849543808127473", "displayTextRange": [ 0, 217 ], "inReplyToUserId": null, "inReplyToUsername": null, "author": { "type": "user", "userName": "example_user_1", "url": "https://x.com/example_user_1", "twitterUrl": "https://twitter.com/example_user_1", "id": "1000000001", "name": "Example User 1", "isVerified": false, "isBlueVerified": true, "verifiedType": null, "profilePicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "coverPicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "description": "", "location": "", "followers": 93549, "following": 5514, "status": "", "canDm": true, "canMediaTag": false, "createdAt": "Wed Dec 04 16:45:25 +0000 2019", "entities": { "description": { "urls": [] }, "url": {} }, "fastFollowersCount": 0, "favouritesCount": 60808, "hasCustomTimelines": true, "isTranslator": false, "mediaCount": 4633, "statusesCount": 30759, "withheldInCountries": [], "affiliatesHighlightedLabel": {}, "possiblySensitive": false, "pinnedTweetIds": [ "2072060618769924357" ], "profile_bio": { "description": "", "entities": {} }, "isAutomated": false, "automatedBy": null, "protected": false }, "extendedEntities": { "media": [ { "additional_media_info": { "monetizable": false }, "allow_download_status": { "allow_download": true }, "display_url": "pic.x.com/ouyDu82GbG", "expanded_url": "https://x.com/example_user_1/status/2115849543808127473/video/1", "ext_master_playlist_only": [], "ext_media_availability": { "status": "Available" }, "ext_playlists": [], "id_str": "2115849522039427072", "indices": [ 218, 241 ], "media_key": "13_2115849522039427072", "media_results": { "id": "QXBpTWVkaWFSZXN1bHRzOgwABAoAAR1dAe4XVxAAAAA=", "result": { "__typename": "ApiMedia", "id": "QXBpTWVkaWE6DAAECgABHV0B7hdXEAAAAA==", "media_key": "13_2115849522039427072" } }, "media_url_https": "https://pbs.twimg.com/amplify_video_thumb/2115849522039427072/img/0QANw2w1DWmkG0uK.jpg", "original_info": { "focus_rects": [], "height": 2160, "width": 3840 }, "sizes": { "large": { "h": 1152, "w": 2048 } }, "type": "video", "url": "https://t.co/ouyDu82GbG", "video_info": { "aspect_ratio": [ 16, 9 ], "duration_millis": 4766, "variants": [ { "content_type": "application/x-mpegURL", "url": "https://video-s.twimg.com/amplify_video/2115849522039427072/pl/77B_DHxv51Dzv2fb.m3u8?tag=29" } ] } } ] }, "card": null, "place": {}, "entities": {}, "quoted_tweet": null, "retweeted_tweet": null, "isLimitedReply": false, "communityInfo": null, "article": null } ], "has_next_page": true, "next_cursor": "DAADDAABCgABHV0B8yjbEfEKAAIdXQG9mZrQSwAIAAIAAAACCAADAAAAAAgABAAAAAAKAAUdXQIDo4AnEAoABh1dAgOjf9jwCwAHAAAA8EVtUEM2d0FBQWZRL2dHSk4wdkdwL0FBQUFCUWRYUUhIaTlyUW1oMWRBZGgzR3RGeEhWMEI0UkdhQVdBZFhRSHpLTnNSOFIxZEFiMlptdEJMSFYwQnlOeGEwVzRkWFFId0IxdHlBQjFkQWREY0Z3RE1IVjBCNDBNYTBiRWRYUUhVMkpi…", "status": "success", "msg": "success" } ``` ### Get list timeline `GET https://api.cheapxapi.com/twitter/list/tweets_timeline` · $0.0006 per request · https://cheapxapi.com/docs/list-tweets-timeline Timeline of a list. Paginated: use `cursor` / `next_cursor`. When to use it: - Read a list's timeline as it appears in the X app. - Follow a public list someone else curates. Tip: There are no time or reply filters here. Use *Get list tweets* when you need them. Related: Get list tweets (the same feed with time and reply filters); Get list members (which accounts are in the list) Parameters: - `listId` (query, string, required): Numeric list ID. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/list/tweets_timeline?listId=1953536336675365173" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `tweets` (array of Tweet) - `type` ("tweet") - `id` (string) - `url` (string) - `text` (string) - `source` (string) - `retweetCount` (integer) - `replyCount` (integer) - `likeCount` (integer) - `quoteCount` (integer) - `viewCount` (integer) - `createdAt` (string) - `lang` (string) - `bookmarkCount` (integer) - `isReply` (boolean) - `inReplyToId` (string) - `conversationId` (string) - `displayTextRange` (array of integer) - `inReplyToUserId` (string) - `inReplyToUsername` (string) - `author` (UserInfo) - `entities` (TweetEntities) - `quoted_tweet` (Tweet) - `retweeted_tweet` (Tweet) - `isLimitedReply` (boolean) - `has_next_page` (boolean) - `next_cursor` (string) - `status` ("success" | "error") - `msg` (string) Example response: ```json { "tweets": [ { "type": "tweet", "id": "2115849543808127473", "url": "https://x.com/example_user_1/status/2115849543808127473", "twitterUrl": "https://twitter.com/example_user_1/status/2115849543808127473", "text": "Example post from a private account.", "source": "", "retweetCount": 0, "replyCount": 0, "likeCount": 0, "quoteCount": 0, "viewCount": 0, "createdAt": "Thu Oct 29 16:53:36 +0000 2026", "lang": "en", "bookmarkCount": 0, "isReply": false, "inReplyToId": null, "conversationId": "2115849543808127473", "displayTextRange": [ 0, 217 ], "inReplyToUserId": null, "inReplyToUsername": null, "author": { "type": "user", "userName": "example_user_1", "url": "https://x.com/example_user_1", "twitterUrl": "https://twitter.com/example_user_1", "id": "1000000001", "name": "Example User 1", "isVerified": false, "isBlueVerified": true, "verifiedType": null, "profilePicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "coverPicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "description": "", "location": "", "followers": 93549, "following": 5514, "status": "", "canDm": true, "canMediaTag": false, "createdAt": "Wed Dec 04 16:45:25 +0000 2019", "entities": { "description": { "urls": [] }, "url": {} }, "fastFollowersCount": 0, "favouritesCount": 60808, "hasCustomTimelines": true, "isTranslator": false, "mediaCount": 4633, "statusesCount": 30759, "withheldInCountries": [], "affiliatesHighlightedLabel": {}, "possiblySensitive": false, "pinnedTweetIds": [ "2072060618769924357" ], "profile_bio": { "description": "", "entities": {} }, "isAutomated": false, "automatedBy": null, "protected": false }, "extendedEntities": { "media": [ { "additional_media_info": { "monetizable": false }, "allow_download_status": { "allow_download": true }, "display_url": "pic.x.com/ouyDu82GbG", "expanded_url": "https://x.com/example_user_1/status/2115849543808127473/video/1", "ext_master_playlist_only": [], "ext_media_availability": { "status": "Available" }, "ext_playlists": [], "id_str": "2115849522039427072", "indices": [ 218, 241 ], "media_key": "13_2115849522039427072", "media_results": { "id": "QXBpTWVkaWFSZXN1bHRzOgwABAoAAR1dAe4XVxAAAAA=", "result": { "__typename": "ApiMedia", "id": "QXBpTWVkaWE6DAAECgABHV0B7hdXEAAAAA==", "media_key": "13_2115849522039427072" } }, "media_url_https": "https://pbs.twimg.com/amplify_video_thumb/2115849522039427072/img/0QANw2w1DWmkG0uK.jpg", "original_info": { "focus_rects": [], "height": 2160, "width": 3840 }, "sizes": { "large": { "h": 1152, "w": 2048 } }, "type": "video", "url": "https://t.co/ouyDu82GbG", "video_info": { "aspect_ratio": [ 16, 9 ], "duration_millis": 4766, "variants": [ { "content_type": "application/x-mpegURL", "url": "https://video-s.twimg.com/amplify_video/2115849522039427072/pl/77B_DHxv51Dzv2fb.m3u8?tag=29" } ] } } ] }, "card": null, "place": {}, "entities": {}, "quoted_tweet": null, "retweeted_tweet": null, "isLimitedReply": false, "communityInfo": null, "article": null } ], "has_next_page": true, "next_cursor": "DAABCgABHV0CBJL__60KAAIdXP52IZrhpAgAAwAAAAIAAA", "status": "success", "msg": "success" } ``` ### Get list members `GET https://api.cheapxapi.com/twitter/list/members` · $0.0006 per request · https://cheapxapi.com/docs/list-members Members of a list. Paginated: use `cursor` / `next_cursor`. When to use it: - Reuse a list someone else curated, e.g. a researcher's list of AI labs, as your own set of accounts to track. - Audit who is on a list before you build on it. Tip: Members come with full profiles, so you can filter them by follower count or bio right away. Related: Get list followers (who subscribes to the list); Get list tweets (the members' posts) Parameters: - `list_id` (query, string, required): Numeric list ID. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/list/members?list_id=1953536336675365173" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `members` (array of UserInfo) - `type` ("user") - `userName` (string) - `url` (string) - `id` (string) - `name` (string) - `isBlueVerified` (boolean) - `protected` (boolean) - `verifiedType` (string) - `profilePicture` (string) - `coverPicture` (string) - `description` (string) - `location` (string) - `followers` (integer) - `following` (integer) - `canDm` (boolean) - `createdAt` (string) - `favouritesCount` (integer) - `hasCustomTimelines` (boolean) - `isTranslator` (boolean) - `mediaCount` (integer) - `statusesCount` (integer) - `withheldInCountries` (array of string) - `affiliatesHighlightedLabel` (object) - `possiblySensitive` (boolean) - `pinnedTweetIds` (array of string) - `isAutomated` (boolean) - `automatedBy` (string) - `unavailable` (boolean) - `message` (string) - `unavailableReason` (string) - `profile_bio` (object) - `has_next_page` (boolean) - `next_cursor` (string) - `status` ("success" | "error") - `msg` (string) Example response: ```json { "members": [ { "id": "1000000001", "name": "Example User 1", "userName": "example_user_1", "location": "", "url": null, "description": "", "protected": false, "isVerified": false, "isBlueVerified": true, "verifiedType": null, "followers": 8, "following": 3, "favouritesCount": 27, "statusesCount": 14, "mediaCount": 1, "createdAt": "2026-09-22T19:01:26.000000Z", "coverPicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "profilePicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "canDm": false, "isAutomated": false, "automatedBy": null } ], "has_next_page": true, "next_cursor": "6641596093678972928|2115849626039877610", "status": "success", "msg": "success" } ``` ### Get list followers `GET https://api.cheapxapi.com/twitter/list/followers` · $0.0006 per request · https://cheapxapi.com/docs/list-followers Followers of a list. Paginated: use `cursor` / `next_cursor`. When to use it: - Find people interested in a topic: accounts that subscribe to a list about it. - Measure how popular a list is before you rely on it. Tip: Subscribers come with full profiles, including their own follower counts. Related: Get list members (the accounts in the list) Parameters: - `list_id` (query, string, required): Numeric list ID. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/list/followers?list_id=1953536336675365173" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `followers` (array of UserInfo) - `type` ("user") - `userName` (string) - `url` (string) - `id` (string) - `name` (string) - `isBlueVerified` (boolean) - `protected` (boolean) - `verifiedType` (string) - `profilePicture` (string) - `coverPicture` (string) - `description` (string) - `location` (string) - `followers` (integer) - `following` (integer) - `canDm` (boolean) - `createdAt` (string) - `favouritesCount` (integer) - `hasCustomTimelines` (boolean) - `isTranslator` (boolean) - `mediaCount` (integer) - `statusesCount` (integer) - `withheldInCountries` (array of string) - `affiliatesHighlightedLabel` (object) - `possiblySensitive` (boolean) - `pinnedTweetIds` (array of string) - `isAutomated` (boolean) - `automatedBy` (string) - `unavailable` (boolean) - `message` (string) - `unavailableReason` (string) - `profile_bio` (object) - `has_next_page` (boolean) - `next_cursor` (string) - `status` ("success" | "error") - `msg` (string) Example response: ```json { "followers": [ { "id": "1000000001", "name": "Example User 1", "userName": "example_user_1", "location": "", "url": "", "description": "", "protected": false, "isVerified": false, "isBlueVerified": true, "verifiedType": null, "followers": 229, "following": 1494, "favouritesCount": 85702, "statusesCount": 1635, "mediaCount": 6, "createdAt": "2024-05-22T12:39:14.000000Z", "coverPicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "profilePicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "canDm": true, "isAutomated": false, "automatedBy": null } ], "has_next_page": true, "next_cursor": "1879920471410250716|2115849630469062634", "status": "success", "msg": "success" } ``` ## Communities ### Get community `GET https://api.cheapxapi.com/twitter/community/info` · $0.0006 per request · https://cheapxapi.com/docs/community-info Details of a community. When to use it: - Check a community before you post in it: description, rules, member count, join policy and moderators. - Track a community's growth through `member_count`. Tip: The community ID is the number in its link, `x.com/i/communities/`. Related: Get community tweets (what members post); Get community members (who is in it) Parameters: - `community_id` (query, string, required): Numeric community ID. Example request: ```bash curl "https://api.cheapxapi.com/twitter/community/info?community_id=1699807431709041070" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `community_info` (object) - `id` (string) - `name` (string) - `description` (string) - `question` (string) - `member_count` (integer) - `moderator_count` (integer) - `created_at` (string) - `join_policy` (string) - `invites_policy` (string) - `is_nsfw` (boolean) - `is_pinned` (boolean) - `role` (string) - `primary_topic` (object) - `banner_url` (string) - `search_tags` (array of string) - `rules` (array of object) - `creator` (UserInfo) - `admin` (UserInfo) - `members_preview` (array of object) - `status` ("success" | "error") - `msg` (string) Example response: ```json { "community_info": { "id": "1699807431709041070", "name": "Software Engineering", "description": "A community for software engineers and aspiring ones.", "question": "Membership is currently restricted to combat spam. Read the rules before joining ⚠️ \n\nFollow @example_user_1 for faster access so he gets notified. ", "member_count": 247841, "moderator_count": 10, "created_at": "Thu Sep 07 15:30:47 +0000 2023", "join_policy": "Open", "invites_policy": "MemberInvitesAllowed", "is_nsfw": false, "is_pinned": false, "role": "NonMember", "primary_topic": { "id": "303", "name": "Software" }, "banner_url": "https://pbs.twimg.com/community_banner_img/2007469232632537090/QrvFh1PE?format=jpg&name=orig", "search_tags": [], "rules": [ { "id": "1714194373062086982", "name": "Be kind and respectful.", "description": "This will all be way more fun if everyone is nice to each other. You can disagree on something while not making it personal." } ], "creator": { "id": "1000000001", "name": "Example User 1", "screen_name": "example_user_1", "location": "", "url": "https://t.co/qGOixrIIfV", "description": "", "email": null, "protected": false, "verified": false, "followers_count": 16620, "following_count": 490, "friends_count": 490, "favourites_count": 23101, "statuses_count": 62, "media_tweets_count": 4, "created_at": "Fri Nov 05 14:35:46 +0000 2021", "profile_banner_url": "https://pbs.twimg.com/profile_images/example/photo.jpg", "profile_image_url_https": "https://pbs.twimg.com/profile_images/example/photo.jpg", "can_dm": true, "isBlueVerified": true }, "admin": { "id": "1000000001", "name": "Example User 1", "screen_name": "example_user_1", "location": "", "url": "https://t.co/qGOixrIIfV", "description": "", "email": null, "protected": false, "verified": false, "followers_count": 16620, "following_count": 490, "friends_count": 490, "favourites_count": 23101, "statuses_count": 62, "media_tweets_count": 4, "created_at": "Fri Nov 05 14:35:46 +0000 2021", "profile_banner_url": "https://pbs.twimg.com/profile_images/example/photo.jpg", "profile_image_url_https": "https://pbs.twimg.com/profile_images/example/photo.jpg", "can_dm": true, "isBlueVerified": true }, "members_preview": [ { "id": "1000000001", "name": "Example User 1", "screen_name": "example_user_1", "location": "", "url": "https://t.co/qGOixrIIfV", "description": "", "email": null, "protected": false, "verified": false, "followers_count": 16620, "following_count": 490, "friends_count": 490, "favourites_count": 23101, "statuses_count": 62, "media_tweets_count": 4, "created_at": "Fri Nov 05 14:35:46 +0000 2021", "profile_banner_url": "https://pbs.twimg.com/profile_images/example/photo.jpg", "profile_image_url_https": "https://pbs.twimg.com/profile_images/example/photo.jpg", "can_dm": true, "isBlueVerified": true } ] }, "status": "success", "msg": "success" } ``` ### Get community members `GET https://api.cheapxapi.com/twitter/community/members` · $0.0006 per request · https://cheapxapi.com/docs/community-members Members of a community. Paginated: use `cursor` / `next_cursor`. When to use it: - List the people in a community: a ready-made audience around one topic. - Find the most followed members by sorting on their follower counts. Tip: Moderators are listed separately by *Get community moderators*. Related: Get community moderators (the people who run it); Get community (member count and rules) Parameters: - `community_id` (query, string, required): Numeric community ID. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/community/members?community_id=1699807431709041070" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `members` (array of UserProfileSnake) - `id` (string) - `name` (string) - `screen_name` (string) - `userName` (string) - `username` (string) - `location` (string) - `url` (string) - `description` (string) - `email` (string) - `protected` (boolean) - `verified` (boolean) - `isBlueVerified` (boolean) - `followers_count` (integer) - `following_count` (integer) - `friends_count` (integer) - `favourites_count` (integer) - `statuses_count` (integer) - `media_tweets_count` (integer) - `created_at` (string) - `profile_banner_url` (string) - `profile_image_url_https` (string) - `can_dm` (boolean) - `has_next_page` (boolean) - `next_cursor` (string) - `status` ("success" | "error") - `msg` (string) Example response: ```json { "members": [ { "id": "1000000001", "name": "Example User 1", "screen_name": "example_user_1", "location": "", "url": "", "description": "", "email": null, "protected": false, "verified": false, "followers_count": 2246, "following_count": 2841, "friends_count": 2841, "favourites_count": 236315, "statuses_count": 12931, "media_tweets_count": 896, "created_at": "Thu Jun 16 17:39:29 +0000 2022", "profile_banner_url": "https://pbs.twimg.com/profile_images/example/photo.jpg", "profile_image_url_https": "https://pbs.twimg.com/profile_images/example/photo.jpg", "can_dm": true, "isBlueVerified": true } ], "has_next": true, "has_next_page": true, "next_cursor": "Q3ljUkFBQUFBQXdBQkF3S213ekJWUW8rdlFBQUFBQUE0dkI0Q20wN0FBQUJpb1kvSHU4QURKb3JDajY5Zi8vLy8vLy8vLzhLYlR0Ly8vLy8vLy8vL3dBSVA4QUFBQUFDQUFBQQ==", "status": "success", "msg": "success" } ``` ### Get community moderators `GET https://api.cheapxapi.com/twitter/community/moderators` · $0.0006 per request · https://cheapxapi.com/docs/community-moderators Moderators of a community. Paginated: use `cursor` / `next_cursor`. When to use it: - Find who runs a community, to ask about rules or partnerships. - Check that a community is actively moderated before you engage with it. Tip: Usually a short list, so one request is often enough. Related: Get community members (everyone else in the community) Parameters: - `community_id` (query, string, required): Numeric community ID. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/community/moderators?community_id=1699807431709041070" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `has_next_page` (boolean) - `next_cursor` (string) - `status` ("success" | "error") - `msg` (string) - `moderators` (array of UserInfo) - `type` ("user") - `userName` (string) - `url` (string) - `id` (string) - `name` (string) - `isBlueVerified` (boolean) - `protected` (boolean) - `verifiedType` (string) - `profilePicture` (string) - `coverPicture` (string) - `description` (string) - `location` (string) - `followers` (integer) - `following` (integer) - `canDm` (boolean) - `createdAt` (string) - `favouritesCount` (integer) - `hasCustomTimelines` (boolean) - `isTranslator` (boolean) - `mediaCount` (integer) - `statusesCount` (integer) - `withheldInCountries` (array of string) - `affiliatesHighlightedLabel` (object) - `possiblySensitive` (boolean) - `pinnedTweetIds` (array of string) - `isAutomated` (boolean) - `automatedBy` (string) - `unavailable` (boolean) - `message` (string) - `unavailableReason` (string) - `profile_bio` (object) Example response: ```json { "moderators": [ { "id": "1000000001", "name": "Example User 1", "screen_name": "example_user_1", "location": "", "url": "https://t.co/qGOixrIIfV", "description": "", "email": null, "protected": false, "verified": false, "followers_count": 16620, "following_count": 490, "friends_count": 490, "favourites_count": 23101, "statuses_count": 62, "media_tweets_count": 4, "created_at": "Fri Nov 05 14:35:46 +0000 2021", "profile_banner_url": "https://pbs.twimg.com/profile_images/example/photo.jpg", "profile_image_url_https": "https://pbs.twimg.com/profile_images/example/photo.jpg", "can_dm": true, "isBlueVerified": true } ], "has_next": false, "has_next_page": false, "next_cursor": null, "status": "success", "msg": "success" } ``` ### Get community tweets `GET https://api.cheapxapi.com/twitter/community/tweets` · $0.0006 per request · https://cheapxapi.com/docs/community-tweets Tweets posted in a community. Paginated: use `cursor` / `next_cursor`. When to use it: - Read what members post in one community. - Monitor a community for questions about your product or field. Tip: Poll the first page and stop at the first post ID you have already stored. Related: Search tweets across communities (search posts across all communities); Get community (the community's rules and size) Parameters: - `community_id` (query, string, required): Numeric community ID. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/community/tweets?community_id=1699807431709041070" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `tweets` (array of Tweet) - `type` ("tweet") - `id` (string) - `url` (string) - `text` (string) - `source` (string) - `retweetCount` (integer) - `replyCount` (integer) - `likeCount` (integer) - `quoteCount` (integer) - `viewCount` (integer) - `createdAt` (string) - `lang` (string) - `bookmarkCount` (integer) - `isReply` (boolean) - `inReplyToId` (string) - `conversationId` (string) - `displayTextRange` (array of integer) - `inReplyToUserId` (string) - `inReplyToUsername` (string) - `author` (UserInfo) - `entities` (TweetEntities) - `quoted_tweet` (Tweet) - `retweeted_tweet` (Tweet) - `isLimitedReply` (boolean) - `has_next_page` (boolean) - `next_cursor` (string) - `status` ("success" | "error") - `msg` (string) Example response: ```json { "tweets": [ { "type": "tweet", "id": "2115846905125327048", "url": "https://x.com/example_user_1/status/2115846905125327048", "twitterUrl": "https://twitter.com/example_user_1/status/2115846905125327048", "text": "Example post from a private account.", "source": "", "retweetCount": 0, "replyCount": 0, "likeCount": 0, "quoteCount": 0, "viewCount": 3, "createdAt": "Thu Oct 29 16:43:07 +0000 2026", "lang": "en", "bookmarkCount": 0, "isReply": false, "inReplyToId": null, "conversationId": "2115846905125327048", "inReplyToUserId": null, "inReplyToUsername": null, "author": { "type": "user", "userName": "example_user_1", "url": "https://x.com/example_user_1", "twitterUrl": "https://twitter.com/example_user_1", "id": "1000000001", "name": "Example User 1", "profilePicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "coverPicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "description": "", "location": "", "followers": 45, "following": 20, "status": "", "canDm": false, "canMediaTag": true, "createdAt": "Fri Aug 28 18:30:06 +0000 2015", "entities": { "description": {}, "url": { "urls": [ { "display_url": "github.com/Rayiumir", "expanded_url": "https://github.com/Rayiumir", "indices": [ 0, 23 ], "url": "https://t.co/pa1UrVixoP" } ] } }, "favouritesCount": 222, "hasCustomTimelines": false, "isTranslator": false, "mediaCount": 13, "statusesCount": 324, "withheldInCountries": [], "affiliatesHighlightedLabel": {}, "possiblySensitive": false, "pinnedTweetIds": [], "profile_bio": { "description": "", "entities": {} } }, "extendedEntities": {}, "card": null, "place": {}, "entities": {} } ], "has_next": true, "has_next_page": true, "next_cursor": "DAABCgABHV0CCzY__-kKAAIdXI-bb1rAAAgAAwAAAAIAAA", "status": "success", "msg": "success" } ``` ### Search tweets across communities `GET https://api.cheapxapi.com/twitter/community/get_tweets_from_all_community` · $0.0006 per request · https://cheapxapi.com/docs/community-get-tweets-from-all-community Search tweets posted in any community. Paginated: use `cursor` / `next_cursor`. When to use it: - Search every community at once for a keyword, sorted by `Latest` or `Top`. - Find which conversations about a topic happen inside communities rather than on the open timeline. Tip: Results are community posts only. Use *Advanced search* for posts anywhere on X. Related: Advanced search (search all of X); Get community tweets (every post in one community) Parameters: - `query` (query, string, required): Search query. - `queryType` (query, string, required): `Latest` or `Top`. - `cursor` (query, string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl "https://api.cheapxapi.com/twitter/community/get_tweets_from_all_community?query=machine+learning&queryType=Latest" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `tweets` (array of Tweet) - `type` ("tweet") - `id` (string) - `url` (string) - `text` (string) - `source` (string) - `retweetCount` (integer) - `replyCount` (integer) - `likeCount` (integer) - `quoteCount` (integer) - `viewCount` (integer) - `createdAt` (string) - `lang` (string) - `bookmarkCount` (integer) - `isReply` (boolean) - `inReplyToId` (string) - `conversationId` (string) - `displayTextRange` (array of integer) - `inReplyToUserId` (string) - `inReplyToUsername` (string) - `author` (UserInfo) - `entities` (TweetEntities) - `quoted_tweet` (Tweet) - `retweeted_tweet` (Tweet) - `isLimitedReply` (boolean) - `has_next_page` (boolean) - `next_cursor` (string) Example response: ```json { "tweets": [ { "type": "tweet", "id": "2115839508319289460", "url": "https://x.com/example_user_1/status/2115839508319289460", "twitterUrl": "https://twitter.com/example_user_1/status/2115839508319289460", "text": "Example post from a private account.", "source": "", "retweetCount": 0, "replyCount": 0, "likeCount": 0, "quoteCount": 0, "viewCount": 0, "createdAt": "Thu Oct 29 16:13:43 +0000 2026", "lang": "en", "bookmarkCount": 0, "isReply": true, "inReplyToId": "2115796949832212573", "conversationId": "2115796949832212573", "displayTextRange": [ 9, 66 ], "inReplyToUserId": null, "inReplyToUsername": null, "author": { "type": "user", "userName": "example_user_1", "url": "https://x.com/example_user_1", "twitterUrl": "https://twitter.com/example_user_1", "id": "1000000001", "name": "Example User 1", "isVerified": false, "isBlueVerified": false, "verifiedType": null, "profilePicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "coverPicture": "https://pbs.twimg.com/profile_images/example/photo.jpg", "description": "", "location": "", "followers": 3792, "following": 436, "status": "", "canDm": true, "canMediaTag": true, "createdAt": "Tue May 25 15:45:55 +0000 2010", "entities": { "description": { "urls": [] }, "url": {} }, "fastFollowersCount": 0, "favouritesCount": 15536, "hasCustomTimelines": true, "isTranslator": false, "mediaCount": 2497, "statusesCount": 37198, "withheldInCountries": [], "affiliatesHighlightedLabel": {}, "possiblySensitive": false, "pinnedTweetIds": [], "profile_bio": { "description": "", "entities": {} }, "isAutomated": false, "automatedBy": null, "protected": false }, "extendedEntities": {}, "card": null, "place": {}, "entities": {}, "quoted_tweet": null, "retweeted_tweet": null, "isLimitedReply": false, "communityInfo": null, "article": null } ], "has_next_page": true, "next_cursor": "DAAHCgABHV0CDBa__-QLAAIAAAAUV3pFM09UTXdNVE13TWpFd01EQmQIAAMAAAACAAA" } ``` ## Trends ### Get trends `GET https://api.cheapxapi.com/twitter/trends` · $0.0006 per request · https://cheapxapi.com/docs/trends Trending topics for a location. When to use it: - See what is trending worldwide (`woeid=1`) or in a country (`23424977` is the United States). - Plan content or catch breaking news by checking trends on a schedule and storing each `rank`. Tip: Each trend's `target.query` is ready to pass to *Advanced search* to read the posts behind it. Related: Advanced search (the posts behind a trend) Parameters: - `woeid` (query, integer, required): Location WOEID, e.g. `1` for worldwide, `23424977` for the United States. - `count` (query, integer): Number of trends to return. Example request: ```bash curl "https://api.cheapxapi.com/twitter/trends?woeid=1" \ -H "x-api-key: YOUR_KEY" ``` Response fields: - `trends` (array of object) - `trend` (object) - `status` ("success" | "error") - `msg` (string) - `metadata` (object) - `timestamp` (integer) - `refresh_interval_millis` (integer) - `woeid` (object) - `context_mode` (string) Example response: ```json { "status": "success", "msg": "success", "trends": [ { "trend": { "name": "Simmons", "target": { "query": "Simmons" }, "rank": 1 } } ], "metadata": { "timestamp": 1793292843252, "refresh_interval_millis": 300000, "woeid": { "name": "Worldwide", "id": 1 }, "context_mode": "full" } } ``` ## Account actions ### Log in to an X account `POST https://api.cheapxapi.com/twitter/user_login_v2` · $0.10 per request · https://cheapxapi.com/docs/user-login-v2 Logs in to an X account and returns `login_cookies`, which every other account action needs. Log in once and reuse `login_cookies` (and the same proxy) until it stops working; logging in repeatedly can get the account locked. Takes 10-25 seconds. Providing `totp_secret` (two-factor key) is strongly recommended, otherwise the credential may not be allowed to post. At most 10 logins per 10 minutes per API account and 3 per 10 minutes per X user name. When to use it: - Log in once per X account and get the `login_cookies` every account action needs. - Log in again only when actions start failing because the cookies stopped working. Tip: This is the only call that costs $0.10; every action after it is the standard price. Send `totp_secret`, or X may not let the account post. Reuse `login_cookies` and the same proxy; logging in again and again can get the account locked. Related: Post a tweet or reply (post with the cookies you get here); Update profile (set up the account's profile) Request body (application/json): - `user_name` (string, required): X screen name of the account, without the @. - `email` (string, required): Email address of the X account. - `password` (string, required): Password of the X account. Used for this login only; we do not store it. - `totp_secret` (string): Two-factor authentication secret (the key behind the authenticator app code). Strongly recommended. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/user_login_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "user_name": "", "email": "", "password": "", "proxy": "" }' ``` Response fields: - `login_cookies` (string) - `status` (string) - `message` (string) ### Post a tweet or reply `POST https://api.cheapxapi.com/twitter/create_tweet_v2` · $0.0006 per request · https://cheapxapi.com/docs/create-tweet-v2 Posts a tweet as the logged-in account. Set `reply_to_tweet_id` to reply. Attach images or videos with `media_ids` from *Upload media*. At most 5 per minute per X account. When to use it: - Post from your own account or a bot: plain posts, replies (`reply_to_tweet_id`), quote posts (`attachment_url`) and posts in a community (`community_id`). - Post with images or video by attaching `media_ids` from *Upload media*. - Post more than 280 characters with `is_note_tweet` on accounts with X Premium. Tip: At most 5 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Upload media (get `media_ids` for images and video); Delete a tweet (remove a post) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `tweet_text` (string, required): Text of the tweet. - `reply_to_tweet_id` (string): Numeric ID of the tweet to reply to. - `attachment_url` (string): URL of a tweet to quote, or another link to attach. - `community_id` (string): Numeric ID of a community to post in. - `is_note_tweet` (boolean): Set to `true` for a long post (more than 280 characters, needs X Premium). - `media_ids` (array of string): Media IDs returned by *Upload media*. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/create_tweet_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "tweet_text": "", "proxy": "" }' ``` Response fields: - `tweet_id` (string) - `status` (string) - `message` (string) ### Delete a tweet `POST https://api.cheapxapi.com/twitter/delete_tweet_v2` · $0.0006 per request · https://cheapxapi.com/docs/delete-tweet-v2 Deletes one of the account's own tweets. When to use it: - Remove one of the account's own posts or replies. - Clean up old posts in bulk, one request per post. Tip: Only the account's own posts can be deleted. At most 30 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Get user's latest tweets (find the IDs of the account's posts) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `tweet_id` (string, required): Numeric tweet ID. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/delete_tweet_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "tweet_id": "", "proxy": "" }' ``` Response fields: - `status` (string) - `message` (string) ### Like a tweet `POST https://api.cheapxapi.com/twitter/like_tweet_v2` · $0.0006 per request · https://cheapxapi.com/docs/like-tweet-v2 Likes a tweet. Liking an already-liked tweet returns success. When to use it: - Like posts from an automated or scheduled workflow. - Acknowledge replies and mentions from a support account. Tip: Liking a post that is already liked returns success, so retries are safe. At most 30 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Unlike a tweet (remove the like) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `tweet_id` (string, required): Numeric tweet ID. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/like_tweet_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "tweet_id": "", "proxy": "" }' ``` Response fields: - `status` (string) - `message` (string) ### Unlike a tweet `POST https://api.cheapxapi.com/twitter/unlike_tweet_v2` · $0.0006 per request · https://cheapxapi.com/docs/unlike-tweet-v2 Removes a like. When to use it: - Remove a like the account gave earlier. Tip: At most 30 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Like a tweet (like a post) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `tweet_id` (string, required): Numeric tweet ID. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/unlike_tweet_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "tweet_id": "", "proxy": "" }' ``` Response fields: - `status` (string) - `message` (string) ### Retweet `POST https://api.cheapxapi.com/twitter/retweet_tweet_v2` · $0.0006 per request · https://cheapxapi.com/docs/retweet-tweet-v2 Retweets a tweet. Retweeting again returns success. When to use it: - Repost a post to the account's followers without comment. - Share your own announcements from a second account. Tip: Retweeting again returns success, so retries are safe. To add a comment, post with `attachment_url` instead. At most 30 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Undo retweet (undo the retweet); Post a tweet or reply (quote a post with a comment) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `tweet_id` (string, required): Numeric tweet ID. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/retweet_tweet_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "tweet_id": "", "proxy": "" }' ``` Response fields: - `status` (string) - `message` (string) ### Undo retweet `POST https://api.cheapxapi.com/twitter/unretweet_tweet_v2` · $0.0006 per request · https://cheapxapi.com/docs/unretweet-tweet-v2 Undoes a retweet. Undoing a tweet that was not retweeted also returns success. When to use it: - Undo a retweet. Tip: Undoing a post that was not retweeted also returns success. At most 30 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Retweet (retweet a post) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `tweet_id` (string, required): Numeric tweet ID. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/unretweet_tweet_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "tweet_id": "", "proxy": "" }' ``` Response fields: - `status` (string) - `message` (string) - `x_status` (integer) - `code` (integer) ### Pin a tweet `POST https://api.cheapxapi.com/twitter/pin_tweet_v2` · $0.0006 per request · https://cheapxapi.com/docs/pin-tweet-v2 Pins one of the account's own tweets to its profile. Pinning someone else's tweet returns an error. When to use it: - Pin a launch post or announcement to the top of the profile. - Rotate the pinned post on a schedule. Tip: Only the account's own posts can be pinned; pinning someone else's returns an error. At most 30 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Unpin a tweet (remove the pin) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `tweet_id` (string, required): Numeric tweet ID. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/pin_tweet_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "tweet_id": "", "proxy": "" }' ``` Response fields: - `status` (string) - `message` (string) - `x_status` (integer) - `code` (integer) ### Unpin a tweet `POST https://api.cheapxapi.com/twitter/unpin_tweet_v2` · $0.0006 per request · https://cheapxapi.com/docs/unpin-tweet-v2 Unpins a tweet from the profile. When to use it: - Remove the pinned post from the profile. Tip: At most 30 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Pin a tweet (pin a post) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `tweet_id` (string, required): Numeric tweet ID. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/unpin_tweet_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "tweet_id": "", "proxy": "" }' ``` Response fields: - `status` (string) - `message` (string) - `x_status` (integer) - `code` (integer) ### Bookmark a tweet `POST https://api.cheapxapi.com/twitter/bookmark_tweet_v2` · $0.0006 per request · https://cheapxapi.com/docs/bookmark-tweet-v2 Adds a tweet to the account's bookmarks. When to use it: - Save posts to the account's private bookmarks, e.g. from a research or read-later workflow. Tip: Bookmarks are private to the account. At most 30 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Get bookmarks (read the bookmarks back) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `tweet_id` (string, required): Numeric tweet ID. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/bookmark_tweet_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "tweet_id": "", "proxy": "" }' ``` Response fields: - `status` (string) - `message` (string) ### Remove a bookmark `POST https://api.cheapxapi.com/twitter/unbookmark_tweet_v2` · $0.0006 per request · https://cheapxapi.com/docs/unbookmark-tweet-v2 Removes a tweet from the account's bookmarks. When to use it: - Remove a post from the account's bookmarks. Tip: At most 30 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Get bookmarks (list the current bookmarks) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `tweet_id` (string, required): Numeric tweet ID. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/unbookmark_tweet_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "tweet_id": "", "proxy": "" }' ``` Response fields: - `status` (string) - `message` (string) ### Get bookmarks `POST https://api.cheapxapi.com/twitter/bookmarks_v2` · $0.0006 per request · https://cheapxapi.com/docs/bookmarks-v2 The account's own bookmarks. Paginated: use `cursor` / `next_cursor`. When to use it: - Export the account's bookmarks, which X only shows to the account itself. - Feed saved posts into notes, a database or a newsletter. Tip: Uses POST because it needs the account's `login_cookies`, but it only reads. Page with `cursor`. At most 30 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Bookmark a tweet (add a bookmark) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. - `count` (integer): Number of items per page. - `cursor` (string): Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/bookmarks_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "proxy": "" }' ``` Response fields: - `tweets` (array of Tweet) - `type` ("tweet") - `id` (string) - `url` (string) - `text` (string) - `source` (string) - `retweetCount` (integer) - `replyCount` (integer) - `likeCount` (integer) - `quoteCount` (integer) - `viewCount` (integer) - `createdAt` (string) - `lang` (string) - `bookmarkCount` (integer) - `isReply` (boolean) - `inReplyToId` (string) - `conversationId` (string) - `displayTextRange` (array of integer) - `inReplyToUserId` (string) - `inReplyToUsername` (string) - `author` (UserInfo) - `entities` (TweetEntities) - `quoted_tweet` (Tweet) - `retweeted_tweet` (Tweet) - `isLimitedReply` (boolean) - `has_next_page` (boolean) - `next_cursor` (string) ### Follow a user `POST https://api.cheapxapi.com/twitter/follow_user_v2` · $0.0006 per request · https://cheapxapi.com/docs/follow-user-v2 Follows a user by numeric user ID (or sends a follow request to a protected account). Following again returns success. At most 15 per minute per X account. When to use it: - Follow accounts from a workflow, e.g. everyone who signs up for your product with their X handle. - Send a follow request to a protected account. Tip: Takes the numeric `user_id`; get it from *Get user profile*. Following again returns success. At most 15 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Unfollow a user (unfollow); Get user profile (screen name to numeric ID) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `user_id` (string, required): Numeric user ID of the target user. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/follow_user_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "user_id": "", "proxy": "" }' ``` Response fields: - `status` (string) - `message` (string) ### Unfollow a user `POST https://api.cheapxapi.com/twitter/unfollow_user_v2` · $0.0006 per request · https://cheapxapi.com/docs/unfollow-user-v2 Unfollows a user by numeric user ID. At most 15 per minute per X account. When to use it: - Unfollow accounts, e.g. those that no longer follow back. Tip: Takes the numeric `user_id`. At most 15 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Check follow relationship (see who follows back first) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `user_id` (string, required): Numeric user ID of the target user. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/unfollow_user_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "user_id": "", "proxy": "" }' ``` Response fields: - `status` (string) - `message` (string) ### Mute a user `POST https://api.cheapxapi.com/twitter/mute_user_v2` · $0.0006 per request · https://cheapxapi.com/docs/mute-user-v2 Mutes a user by numeric user ID. When to use it: - Hide an account's posts from the timeline without unfollowing or blocking it. Tip: At most 30 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Unmute a user (unmute); Block a user (block instead) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `user_id` (string, required): Numeric user ID of the target user. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/mute_user_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "user_id": "", "proxy": "" }' ``` Response fields: - `status` (string) - `message` (string) - `x_status` (integer) - `code` (integer) ### Unmute a user `POST https://api.cheapxapi.com/twitter/unmute_user_v2` · $0.0006 per request · https://cheapxapi.com/docs/unmute-user-v2 Unmutes a user. When to use it: - Show a muted account's posts again. Tip: At most 30 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Mute a user (mute an account) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `user_id` (string, required): Numeric user ID of the target user. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/unmute_user_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "user_id": "", "proxy": "" }' ``` Response fields: - `status` (string) - `message` (string) - `x_status` (integer) - `code` (integer) ### Block a user `POST https://api.cheapxapi.com/twitter/block_user_v2` · $0.0006 per request · https://cheapxapi.com/docs/block-user-v2 Blocks a user by numeric user ID. Blocking also removes follows in both directions; unblocking does not restore them. When to use it: - Block spam or abusive accounts, for example from a moderation script. Tip: Blocking removes follows in both directions, and unblocking does not restore them. At most 30 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Unblock a user (unblock); Mute a user (a softer option) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `user_id` (string, required): Numeric user ID of the target user. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/block_user_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "user_id": "", "proxy": "" }' ``` Response fields: - `status` (string) - `message` (string) - `x_status` (integer) - `code` (integer) ### Unblock a user `POST https://api.cheapxapi.com/twitter/unblock_user_v2` · $0.0006 per request · https://cheapxapi.com/docs/unblock-user-v2 Unblocks a user. When to use it: - Unblock an account blocked earlier. Tip: Follows removed by the block are not restored. At most 30 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Block a user (block an account) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `user_id` (string, required): Numeric user ID of the target user. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/unblock_user_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "user_id": "", "proxy": "" }' ``` Response fields: - `status` (string) - `message` (string) - `x_status` (integer) - `code` (integer) ### Send a direct message `POST https://api.cheapxapi.com/twitter/send_dm_to_user` · $0.0006 per request · https://cheapxapi.com/docs/send-dm-to-user Sends a direct message to a user who accepts messages from the account. At most 5 per minute per X account. When to use it: - Send direct messages from a support or notification workflow. - Reply inside an existing conversation with `reply_to_message_id`, or attach a `media_id` from *Upload media*. Tip: The recipient must accept messages from the account; check `canDm` in *Get user profile*. At most 5 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Get user profile (numeric ID and `canDm`); Upload media (attach an image or video) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `user_id` (string, required): Numeric user ID of the target user. - `text` (string, required): Message text. - `media_id` (string): Media ID returned by *Upload media*, to attach to the message. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. - `reply_to_message_id` (string): ID of the message to reply to. Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/send_dm_to_user" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "user_id": "", "text": "", "proxy": "" }' ``` Response fields: - `message_id` (string) - `status` (string) - `message` (string) ### Upload media `POST https://api.cheapxapi.com/twitter/upload_media_v2` · $0.0006 per request · https://cheapxapi.com/docs/upload-media-v2 Uploads an image or video (`multipart/form-data`, field `file`, at most 100 MB) and returns a `media_id` to use in *Post a tweet or reply*. Large videos can take up to a minute. When to use it: - Upload an image or video before posting it or sending it in a direct message. Tip: Files up to 100 MB. Large videos can take up to a minute; videos longer than 140 seconds need `is_long_video` and X Premium. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Post a tweet or reply (post with the `media_id`); Send a direct message (send it in a message) Request body (multipart/form-data): - `file` (file, required): The file to upload. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `is_long_video` (boolean): Set to `true` for videos longer than 140 seconds (needs X Premium). Example request: ```bash curl -X POST "https://api.cheapxapi.com/twitter/upload_media_v2" \ -H "x-api-key: YOUR_KEY" \ -F "proxy=" \ -F "login_cookies=" \ -F "file=@image.jpg" ``` Response fields: - `media_id` (string) - `status` (string) - `message` (string) - `processing_state` (string) ### Update profile `PATCH https://api.cheapxapi.com/twitter/update_profile_v2` · $0.0006 per request · https://cheapxapi.com/docs/update-profile-v2 Updates the account's name, bio, location or website. Only the fields you send are changed. When to use it: - Set up or update a bot's or brand account's name, bio, location and website. - Keep a status in the bio up to date from a script. Tip: Only the fields you send change. At most 5 per minute per X account on this endpoint, so a burst cannot get the account restricted by X. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Update profile photo (change the profile photo); Update header image (change the header image) Request body (application/json): - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. - `name` (string): Display name. - `description` (string): Bio. - `location` (string): Location text. - `url` (string): Website URL. Example request: ```bash curl -X PATCH "https://api.cheapxapi.com/twitter/update_profile_v2" \ -H "x-api-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "login_cookies": "", "proxy": "" }' ``` Response fields: - `status` (string) - `message` (string) ### Update profile photo `PATCH https://api.cheapxapi.com/twitter/update_avatar_v2` · $0.0006 per request · https://cheapxapi.com/docs/update-avatar-v2 Replaces the profile photo (`multipart/form-data`, field `file`, at most 2 MB). When to use it: - Replace the account's profile photo from a file. Tip: Images up to 2 MB, sent as `multipart/form-data` in the field `file`. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Update header image (change the header image) Request body (multipart/form-data): - `file` (file, required): The file to upload. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. Example request: ```bash curl -X PATCH "https://api.cheapxapi.com/twitter/update_avatar_v2" \ -H "x-api-key: YOUR_KEY" \ -F "proxy=" \ -F "login_cookies=" \ -F "file=@image.jpg" ``` Response fields: - `status` (string) - `message` (string) ### Update header image `PATCH https://api.cheapxapi.com/twitter/update_banner_v2` · $0.0006 per request · https://cheapxapi.com/docs/update-banner-v2 Replaces the header image (`multipart/form-data`, field `file`, at most 3 MB). When to use it: - Replace the header image, e.g. for a launch or a seasonal campaign. Tip: Images up to 3 MB, sent as `multipart/form-data` in the field `file`. Requests rejected for a missing or malformed field (HTTP 400) are not charged. Related: Log in to an X account (get the `login_cookies` this action needs); Update profile photo (change the profile photo) Request body (multipart/form-data): - `file` (file, required): The file to upload. - `proxy` (string, required): Proxy for this X account, in the form `scheme://user:pass@host:port` where scheme is `http`, `https`, `socks5` or `socks4`. Use the same proxy for every request of the account. Must be a public address; a residential proxy is recommended. - `login_cookies` (string, required): The `login_cookies` value returned by *Log in to an X account*. Send the same value with every action for that account. Example request: ```bash curl -X PATCH "https://api.cheapxapi.com/twitter/update_banner_v2" \ -H "x-api-key: YOUR_KEY" \ -F "proxy=" \ -F "login_cookies=" \ -F "file=@image.jpg" ``` Response fields: - `status` (string) - `message` (string) ## Price comparison (list prices, USD) | Provider | 100,000 tweets (search) | 100,000 followers with profiles | 1,000 single profile lookups | Post one tweet | |---|---|---|---|---| | cheapxapi | $3.00 | $0.60 | $0.60 | $0.0006 | | twitterapi.io | $15.00 | $1.00 | $0.18 | $0.0006 | | twitterapis.com | $4.00 | $1.14 | $0.80 | $0.0016 | | GetXAPI | $5.00 | Not published | $1.00 | $0.002 | | SocialData | $20.00 | $20.00 | $0.20 | No write API | | Sorsa ($199 monthly plan) | $2.00 | Not published | $2.00 | No write API | | Apify Tweet Scraper V2 | $40.00 | Not published | Not published | No write API | | Official X API | $500.00 | $1,000.00 | $10.00 | $0.015 | Sources and assumptions: https://cheapxapi.com/compare ## Pages - [Documentation](https://cheapxapi.com/docs): quickstart, authentication, billing, rate limits, pagination - [MCP server](https://cheapxapi.com/mcp): hosted MCP server at https://api.cheapxapi.com/mcp with read-only X data tools for Claude Code, Cursor and other agents - [OpenAPI spec](https://cheapxapi.com/openapi.json): machine-readable OpenAPI 3 reference for every endpoint - [Full reference for LLMs](https://cheapxapi.com/llms-full.txt): every endpoint with parameters, response fields and an example response, in one file - [Pricing](https://cheapxapi.com/pricing): rate card, cost examples, calculator - [Twitter API alternatives compared](https://cheapxapi.com/compare): cheapxapi, twitterapi.io, twitterapis.com, GetXAPI, SocialData, Sorsa, Apify and the official X API priced on the same jobs - [cheapxapi vs twitterapis.com](https://cheapxapi.com/compare/twitterapis): price comparison at list price - [Is the X API free?](https://cheapxapi.com/blog/is-x-api-free): The official X API has no free tier. What X's free credits really require, and how far each Twitter API's no-card signup credit goes, measured in tweets. - [How to get an X (Twitter) API key and access token](https://cheapxapi.com/blog/how-to-get-twitter-api-key): Get a Twitter (X) API key, secret, bearer token and access token from the X Developer Console step by step, or one cheapxapi key at $0.60 per 1,000 calls. Which credential you need, and your first request. - [Twitter scraper API](https://cheapxapi.com/blog/twitter-scraper-api): Get tweets as JSON without running your own scraper. How a scraper API compares with the official X API and DIY scraping, what 100,000 tweets cost on each, and a Python script that exports a search to CSV. - [How to search tweets by date](https://cheapxapi.com/blog/search-tweets-by-date): Find tweets from a specific day or date range on X with since: and until:, including the end-date catch that hides a day of results. Build the query, open it on X, or export the results through an API. - [Twitter (X) webhooks for new tweets](https://cheapxapi.com/blog/twitter-webhook): What X's official webhooks deliver (X Activity API, Account Activity API, filtered stream), what they require and cost, and a Python poller that sends new tweets from any search to your own webhook URL. - [Twitter (X) API rate limits and 429 errors](https://cheapxapi.com/blog/twitter-api-rate-limits): What "Rate limit exceeded" and HTTP 429 mean on the X API: the official per-endpoint limits, the x-rate-limit headers, how long a limit lasts, and retry code in Python and Node.js that stays under the limit. - [Twitter (X) search API: operators and paging](https://cheapxapi.com/blog/twitter-search-api): Search tweets through an API: a query builder, X API and X website operators side by side and tested live, paging scripts, and what a search costs. - [Terms of Service](https://cheapxapi.com/terms) - [Privacy Policy](https://cheapxapi.com/privacy) - [Refund Policy](https://cheapxapi.com/refunds) ## FAQ ### What counts as one call? One HTTP request is one call, billed at $0.0006; logging in to an X account is the one exception, at $0.10. Paginated results are fetched one page per call, so a followers page with up to 100 profiles is still a single call. ### Am I charged when a request fails? Only when the failure is not on our side. For reads, successful responses, "not found" style answers such as a user that does not exist, invalid parameters and unknown endpoints are charged. For account actions, any HTTP 200 is charged, including when X refuses the action ("status": "error", with the reason in message); invalid fields (400) are not. Rate-limited (429), insufficient balance (402), invalid key (401) and service errors (503) are never charged. Many endpoints answer "not found" with HTTP 200 and "status": "error", so check the status field, not just the HTTP code. ### Do some endpoints cost more? One does. Logging in to an X account costs $0.10 per call. Every other endpoint, read or account action, is $0.0006 per call. ### Can I post, like, retweet or follow through the API? Yes, as an X account you control. Log in once with the account to get login_cookies, then send them with each action: post or reply, delete, like, retweet, pin, bookmark, follow, mute, block, send a direct message, upload media and update the profile. The login costs $0.10; each action costs $0.0006. If an action times out, check on X before retrying, because it may already have gone through. ### How many followers or follower IDs does one call return? The followers endpoint returns up to 100 full user profiles per page. The follower IDs endpoint returns up to 200 IDs per call. Both paginate with a cursor. ### How does cheapxapi compare with official X API pricing? The official X API pay-per-usage plan charges per resource returned: $0.01 per user and $0.01 per follower. cheapxapi charges $0.0006 per call, so a page of 100 followers costs $0.0006 instead of $1.00 at official list price. ### Is there a monthly fee or minimum commitment? No. You top up your balance and each call draws from it. There is no subscription to cancel, and your balance does not expire. ### Is cheapxapi affiliated with X Corp? No. cheapxapi is not a product of X Corp and has no partnership with it. It reads data that is publicly visible on X, and acts only on X accounts that you log in with. ### Do you store my X password? No. Your X password, two-factor secret, login_cookies and proxy details are used for the request you send and are never stored or logged. For account actions our logs keep only the IDs involved and the length of any text, not the text itself. ### How much does the X API cost with cheapxapi? $0.0006 per call, which is $0.60 per 1,000 calls. The price is the same on every endpoint except logging in to an X account ($0.10). Search and timeline calls return up to 20 tweets each, so 1,000 tweets cost about $0.03. ### How much does the official X API cost? The official X API is pay per usage with no subscription: $0.005 per post read, $0.01 per user read, $0.015 to create a post and $0.20 to create a post with a link. You buy credits in advance. Pay-per-usage plans are capped at 3 million post reads a month; for more, X points to an Enterprise plan, with no price on its pricing page. ### Is there a cheap X API for small projects? cheapxapi has no plan fee, so a project that makes 10,000 calls in a month pays $6.00 for that month and nothing more. ### What are the rate limits? New accounts can make 2 requests per second. After the first top-up the limit is 10 per second. Each account can have up to 10 requests in flight at once. To protect your X accounts, each one can post or send messages 5 times a minute and follow or unfollow 15 times a minute, and an API account can log in 10 times per 10 minutes (3 per X username). Requests over a limit get HTTP 429 and are not charged. ### How does the price compare with twitterapis.com? twitterapis.com lists $0.0008 per call. At $0.0006, cheapxapi costs 25% less per call at list price. ### How do I pay? Top up from the dashboard with crypto: USDT on Tron, BNB Smart Chain, Solana, Arbitrum or Polygon; USDC on Ethereum, BNB Smart Chain, Solana, Arbitrum or Polygon; or BTC, SOL and BNB. Card payments are coming soon. The credit lands on your balance once the transfer is confirmed. ### Can I get a refund? Yes. Payments from the last 30 days can be refunded, up to the unused credit on your balance. Credit already spent on calls is not refundable. ### What is the cheapest Twitter/X API? It depends on the job. For bulk reads paid as you go, cheapxapi is lowest in this comparison: $3.00 per 100,000 tweets and $0.60 per 100,000 followers with profiles. It is not the cheapest for single lookups: 1,000 one-at-a-time profile lookups cost $0.60 on cheapxapi, against $0.18 on twitterapi.io and $0.20 on SocialData. Monthly plans from Sorsa ($0.02 per 1,000 tweets at $199 a month) and GetXAPI ($0.33 per 1,000 calls at $99 a month) also go lower if you use the whole allowance. ### How much does it cost to fetch 100,000 tweets or followers? At list price, 100,000 tweets from search cost $3.00 on cheapxapi, $4.00 on twitterapis.com, $5.00 on GetXAPI, $15.00 on twitterapi.io, $20.00 on SocialData and $500.00 on the official X API. 100,000 followers with full profiles cost $0.60 on cheapxapi, $1.00 on twitterapi.io, $1.14 on twitterapis.com and $1,000.00 on the official X API. Per-request prices assume full pages. ### Is there a pay-as-you-go X API with no monthly subscription? Yes. cheapxapi, twitterapi.io, twitterapis.com, GetXAPI and SocialData all bill per request or per result from a prepaid balance, and the official X API now bills per usage too. On cheapxapi there is no plan, no minimum, and the paid balance never expires. ### Which Twitter/X APIs can post tweets? cheapxapi and twitterapi.io, twitterapis.com, GetXAPI, Official X API offer write actions such as posting, liking and following. SocialData, Sorsa, Apify Tweet Scraper V2 are read-only. A post costs $0.0006 on cheapxapi and $0.015 on the official X API, which charges $0.20 when the post contains a link.