X API rate limits: which one actually stops you
Every X API endpoint carries its own 15-minute ceiling, but on most projects the rate limit is not what fails first. Here is how to tell which meter you hit.
On this page · 10 sections
- Quick answer
- The two meters, and why topping up does nothing
- A 429 means one of two unrelated things
- Per-app and per-user are different buckets, and sometimes inverted
- The 50-per-15-minutes write wall
- The table is not a capability list
- Why reads almost never hit the rate limit
- The three places it genuinely binds
- Reading the headers properly
- If you are building growth automation
The short version
- ▸Rate limits and billing are two separate meters. X's docs state it plainly: you can sit inside your rate limit and still run up usage costs, or hit a rate limit without being charged anything extra. Buying more credits does not raise any ceiling in the table. Only an Enterprise agreement does.
- ▸A 429 means one of two unrelated things. X's response-code reference lists 429 as "rate limit or usage cap exceeded," so the same status covers a 15-minute window you emptied and a monthly cap or credit balance you emptied. Read x-rate-limit-remaining before you back off: if it is not near zero, waiting out the window will not fix anything.
- ▸Per-app and per-user limits are separate buckets, and the bigger one is not always the user one. GET /2/users/:id/tweets allows 10,000 per 15 minutes with an app-only bearer token against 900 with a user token, an 11x swing on the same endpoint. Personalized trends swings the same way, 200 per 15 minutes per app against 10 per user.
- ▸Almost every write a self-serve account can still make caps at 50 requests per 15 minutes per user: reposts, deletes, hide replies, mutes, bookmarks and list follows. That is 200 an hour, and it is the real ceiling on anything that touches other people's posts.
- ▸The rate limit table is not a capability list. It still publishes limits for likes and follows, which X removed from all self-serve tiers on 20 April 2026. A number in that table does not mean your key can call the endpoint.
Quick answer
X API rate limits are set per endpoint, not per account, and most of them use a 15-minute window. The headline numbers are 300 recent searches per 15 minutes on a user token, 100 post creates per 15 minutes per user against 10,000 per 24 hours per app, 50 per 15 minutes on nearly every write, and 15 per 15 minutes on every Direct Message lookup.
But the ceiling in that table is rarely the thing that breaks your project. Reads run out of money long before they run out of requests. Writes ran out of permission in April 2026. The rate limit genuinely binds in three narrow places, and knowing which meter you hit is the difference between a retry that works and a retry loop that never clears.
The two meters, and why topping up does nothing
X runs request frequency and request volume as separate systems. The rate limit page says so directly: rate limits control request frequency for system stability, usage billing charges for data retrieved, and you can be inside one while exhausting the other.
That has a consequence most guides get backwards. On the old subscription model, a bigger plan bought a bigger window, so "upgrade to fix 429s" was real advice. Under pay-per-use it is not. Credits buy you more requests in total, never more requests per minute. The published per-endpoint numbers are what a self-serve key gets regardless of balance, and X's own page sends you to an account manager if you need them raised, which is the Enterprise conversation with no published price. If you are still working out what the volume side costs, X API pricing has the full rate card and five worked monthly bills.
One useful exception: X staff confirmed in September 2026 that x-rate-limit-limit reflects your own plan's value. The published table is the self-serve contract. The header is the truth for your key.
A 429 means one of two unrelated things
This is the single most expensive thing to not know, and no page currently ranking for this query says it.
X's response-code reference defines 429 as "Too Many Requests: Rate limit or usage cap exceeded." One status, two completely different failures:
| What you see | What it is | What fixes it |
|---|---|---|
429, x-rate-limit-remaining: 0, reset timestamp in the near future | You emptied the 15-minute window | Sleep until x-rate-limit-reset, then retry |
| 429, headers showing plenty remaining | Monthly usage cap or credit balance exhausted | Nothing you can wait for. Check the Developer Console |
So read the headers before you back off. A retry loop that sleeps on a cap-exhaustion 429 will sleep forever, burn its retry budget, and report a transient error for something that needs a billing action. The body does not disambiguate either: the documented payload is a bare code: 88, "Rate limit exceeded", which is the same text in both cases.
X caps self-serve accounts at 3 million post reads per billing cycle, tracked at the app level across post lookup, both search endpoints, filtered stream, timelines, liked posts, bookmarks, list posts and Spaces lookup.
Per-app and per-user are different buckets, and sometimes inverted
A bearer token draws on the per-app limit. An OAuth 1.0a or OAuth 2.0 user token draws on the per-user limit, and every authorised user gets their own bucket. That part is well covered elsewhere, usually framed as "user auth multiplies your capacity."
On several endpoints it does the opposite:
| Endpoint | Per app | Per user | Which token wins |
|---|---|---|---|
GET /2/users/:id/tweets | 10,000/15min | 900/15min | App, by 11x |
GET /2/users/personalized_trends | 200/15min | 10/15min | App, by 20x |
GET /2/users/by/username/:username/tweets | 1,500/15min | 900/15min | App |
GET /2/tweets/search/recent | 450/15min | 300/15min | App |
GET /2/users/:id/mentions | 450/15min | 300/15min | App |
GET /2/tweets | 3,500/15min | 5,000/15min | User, by 1.4x |
GET /2/tweets/:id | 450/15min | 900/15min | User, by 2x |
GET /2/users/:id | 300/15min | 900/15min | User, by 3x |
Pulling one account's timeline on a user token when a bearer token would do costs you an order of magnitude of throughput. The reverse is true on single-post lookup. There is no rule of thumb here, only the table, which is why it is worth checking the specific endpoint before you pick the token.
Two caveats keep this honest. Read-your-own-data endpoints are also the ones billed at the cheaper owned-read rate, which requires a user token, so the cheapest request is sometimes the slower one. And plenty of endpoints have a dash in one column: GET /2/users/me is user-only, filtered stream is app-only. X API OAuth has the scope and method split if you are deciding which flow to build.
The 50-per-15-minutes write wall
Nearly every write a self-serve key can still make sits at 50 requests per 15 minutes per user:
DELETE /2/tweets/:idPOSTandDELETE /2/users/:id/retweetsPUT /2/tweets/:tweet_id/hiddenPOSTandDELETE /2/users/:id/mutingPOSTandDELETE /2/users/:id/bookmarksPOSTandDELETE /2/users/:id/followed_listsPOSTandDELETE /2/users/:id/pinned_lists
Fifty per quarter hour is 200 an hour, 4,800 a day in theory. That is the real throughput ceiling on anything that reaches out and touches other people's content, and it is low enough that it changes designs. A moderation bot hiding replies on a viral thread will meet it, which is why the X Hide Replies API is worth reading before you build one, since it carries a second ceiling on hidden replies per conversation that is not in the docs at all.
Post creation is the asymmetric one: 100 per 15 minutes per user, 10,000 per 24 hours per app. For a single-account bot the app number binds, because 100 per 15 minutes would be 9,600 a day anyway. For a product posting on behalf of customers, that 10,000 is shared, so around 100 active users at 100 posts a day exhausts the whole app. Note these are the API's limits and not the ones that apply when you post in the app; X daily limits covers that separate system.
The table is not a capability list
X's rate limit page still publishes numbers for POST /2/users/:id/likes at 50 per 15 minutes plus 1,000 per 24 hours, and POST /2/users/:id/following at 50 per 15 minutes.
Neither is callable on a self-serve key. X's changelog entry of 16 April 2026 states that Following, Likes and Quote-Posts via the API were removed from all self-serve tiers effective 20 April 2026. The numbers stayed in the table because Enterprise still has those endpoints.
This trips up AI answers and tutorials constantly, because a rate limit table reads like a menu. It is not one. A published limit tells you how fast an endpoint may be called by someone who is allowed to call it. Permission is decided elsewhere, and the X API reply rules are the clearest example: POST /2/tweets has a generous limit and a condition that silently rejects most replies with a 403.
Why reads almost never hit the rate limit
Run the arithmetic on recent search. An app-only token gets 450 requests per 15 minutes at up to 100 results each, so 45,000 posts a quarter hour, 180,000 an hour. At the published $0.005 per post read, that window permits roughly $900 an hour of spend.
Full-archive search is worse. Its 300 requests per 15 minutes at 500 results each is 150,000 posts a window, which would run through the entire 3 million monthly cap in about five hours of continuous pulling. The cap at $0.005 is a $15,000 bill, so for any read-heavy project the budget is the binding constraint by an enormous margin, and the rate limit is a formality.
That is why the useful optimisations are the billing ones rather than the pacing ones. X charges for a given resource once per 24-hour UTC day however many times you request it, so polling is cheap and breadth is expensive. For a listening tool, see X API search for which of the two search endpoints bills what.
Where volume genuinely matters, stop polling. Filtered stream is 50 connection attempts per 15 minutes, one concurrent connection and 250 posts a second of throughput. The X Activity API gets two connections at the same throughput and delivers per-user events by webhook. Neither charges you a request per post, so the frequency meter stops mattering and only the volume meter remains.
The three places it genuinely binds
After all that, there are exactly three spots where the published rate limit is the thing you have to design around.
Direct Message lookups. All four of them sit at 15 per 15 minutes on a user token, which is one call a minute. Sending is 1,440 per 24 hours, which averages to one a minute as well. Any DM feature is pacing-bound from the first line of code.
Chunked media upload. Initialize, append and finalize each allow 1,875 per 15 minutes per user. X staff confirmed in September 2026 that a 16 GB file at 8 MB segments is about 2,048 appends, so one upload spans roughly two windows. The saving grace is that the session stays valid for 24 hours and re-sending the same segment_index after a 429 is safe, because the server overwrites that segment. X API media upload has the full four-call flow.
The 50-per-15-minutes write wall. Covered above, and the only one of the three that caps a growth use case rather than a technical one.
Reading the headers properly
Three headers come back on every response:
x-rate-limit-limit: 900
x-rate-limit-remaining: 847
x-rate-limit-reset: 1705420800
x-rate-limit-reset is a Unix timestamp, not a duration. Sleep until it rather than assuming 15 minutes from your first call, because windows are not aligned to your process start:
import time, requests
def get(url, headers, attempt=0):
r = requests.get(url, headers=headers)
if r.status_code != 429:
return r
remaining = int(r.headers.get("x-rate-limit-remaining", -1))
if remaining > 0:
# Window is healthy, so this is a usage cap or credit failure.
raise RuntimeError("429 with headroom left: check the Developer Console")
reset = int(r.headers.get("x-rate-limit-reset", 0))
time.sleep(max(reset - time.time(), 2 ** attempt))
return get(url, headers, attempt + 1)
The remaining > 0 branch is the part worth copying. It turns the ambiguous 429 into two distinct outcomes instead of one slow retry.
Your own numbers are visible in the Developer Console alongside credit balance and per-endpoint usage, and the header beats the published table whenever they disagree.
If you are building growth automation
None of this is a reason to pick the API or avoid it, but it does narrow what the API is for. Reads, your own analytics, internal integrations and genuinely novel apps are what it does well, and it is the sanctioned route for all of them. Engagement automation is a different question now: likes and follows left self-serve in April 2026, replies need the author to summon you, and what remains caps at 200 actions an hour.
Browser-based tools like X-Autopilot work from your own session instead of an API key, which sidesteps the rate limit table entirely and also sits outside what X's developer platform sanctions. Automating engagement through a browser is a gray area rather than an approved path, and X's automation rules govern the account whichever route you take. Running on your own machine and your own residential IP gives a lower detection surface than a shared cloud IP pool, not an absence of risk, and account-level limits still apply to everything you do. That tradeoff is the real decision, and the rate limit table only tells you half of it.
Frequently asked
Answers indexed by Google + AI assistants.
What are the X API rate limits?+
They are per-endpoint, not per-account. Most endpoints use a 15-minute window, a few use 24 hours, and full-archive search adds a 1-request-per-second ceiling on top. Common ones: 300 recent-search requests per 15 minutes per user, 100 post creates per 15 minutes per user against 10,000 per 24 hours per app, 50 per 15 minutes on most writes, and 15 per 15 minutes on every Direct Message lookup. X publishes the full table and the Developer Console shows your own values.
Why am I getting a 429 from the X API when I have barely made any requests?+
Because 429 covers two different failures. X's response-code reference defines it as "rate limit or usage cap exceeded." If x-rate-limit-remaining is near zero you emptied the 15-minute window and the reset timestamp tells you when to retry. If the headers look healthy and you still get 429, you have hit the 3 million post reads monthly cap or run out of credits, and waiting will not help.
Does paying more raise my X API rate limit?+
No. Pay-per-use buys request volume, not request frequency. The published per-endpoint limits are the same whatever your credit balance is, and X's rate limit page states that custom limits are an Enterprise arrangement handled through an account manager. The one exception worth knowing is that the x-rate-limit-limit header reflects your own plan's value, so the header is the authority on what you actually have.
How many posts can I publish per day through the X API?+
POST /2/tweets allows 100 per 15 minutes per user and 10,000 per 24 hours per app. For a single-account bot the app ceiling binds first, because 100 per 15 minutes would be 9,600 a day. For a product posting on behalf of many users, 10,000 per 24 hours is shared across all of them, so roughly 100 users posting 100 times a day exhausts it.
Do rate limits reset exactly 15 minutes after my first request?+
The x-rate-limit-reset header carries a Unix timestamp for when your current window reopens, and that is the only value worth trusting. Sleep until that timestamp rather than assuming a fixed 15 minutes from your first call, then apply exponential backoff if the retry also fails.
Which X API endpoints have the lowest rate limits?+
The 15-per-15-minutes group, which is one call a minute: all four Direct Message lookups, plus blocked and muted user lookups, owned lists and pinned lists. Personalized trends is lower still on a user token at 10 per 15 minutes and 100 per 24 hours. Sending DMs caps at 1,440 per 24 hours, which averages out to exactly one a minute.
- X developer docs - 'X API Rate Limits': the full per-endpoint tables for posts, users, DMs, lists, media, compliance and webhooks, the x-rate-limit-* headers, the 15-minute and 24-hour windows, the rate-limits-versus-billing table, and the note that Enterprise limits are custom (accessed 18 October 2026)
- X developer docs - 'Response Codes & Errors': the status table defining 429 as "Rate limit or usage cap exceeded", which is why the same status has two different fixes (accessed 18 October 2026)
- X developer docs - 'Usage and Billing': pay-per-usage tracked at the app level, the 3 million post reads monthly cap on self-serve accounts, the list of endpoints whose results count toward usage, and the daily deduplication rule (accessed 18 October 2026)
- X API changelog, 16 April 2026 entry 'X API pricing update: Owned Reads now $0.001': the line confirming Following, Likes and Quote-Posts via the API were removed from all self-serve tiers effective 20 April 2026 (accessed 18 October 2026)
- X Developers forum thread 276668, 25 to 26 September 2026: X staff confirming the chunked append limit stays at 1,875 per 15 minutes per user, that a 16 GB upload needs about 2,048 appends and therefore roughly two windows, that the upload session survives 24 hours so you can resume the same segment_index after a 429, and that the x-rate-limit-limit header shows your plan's value
Product designer and indie hacker. Runs the agent on his own X account every day and writes up what the data shows, including when it's inconvenient.
Follow on X →