X (Twitter) "rate limit exceeded": every limit and how to stay under
What X's rate limit exceeded error means for users and developers, X's documented API limits per endpoint as of Oct 17, 2026, and how to stay under them.
Piyushh · October 17, 2026 · 7 min read
"Rate limit exceeded" on X means you've sent more requests than X allows in a time window, and X will refuse the rest until that window resets. Developers see it from the X API as HTTP 429 with error code 88, usually for 15 minutes. App users see it when an account action such as posting or following goes past X's daily limits. Every limit below comes from X's own pages, checked on October 17, 2026.
The fix depends on which side you're on, so this post covers each in turn: the account limits that hit people using X, then the per-endpoint API limits, the headers that tell you when you're clear, and code that handles a 429 properly.
Twitter rate limit exceeded: user or developer?
| You see it | Where | What it means | How long |
|---|---|---|---|
| An error after posting, replying or following a lot | The X app or website | You hit an account limit | Until the daily or semi-hourly window passes |
429 Too Many Requests, "code": 88 | Your code, calling the X API | You exceeded one endpoint's limit | Until x-rate-limit-reset, usually 15 minutes |
| "Rate limit exceeded" from another tool | An app built on X | That app hit its own X API limit | Ask the app, it depends on their plan |
The last row comes up often. We searched X for posts containing "rate limit exceeded" on October 17, and most of the 20 most recent were about other services, AI coding tools in particular. In August one app developer, @ottoscreator, posted an example of the third kind: "Otto is currently experiencing an X API rate limit, so automated posts may be temporarily paused" (post). When a tool you use shows the error, the cause is usually that tool's X quota and not your account.
X account limits for people using the app
X's help page About X limits (checked October 17, 2026) lists the "current technical limits for accounts":
| Action | Limit X lists |
|---|---|
| Posts | 50 original posts and 200 replies per day for unverified accounts, broken into semi-hourly intervals |
| Post updates overall | 2,400 per day, also split into semi-hourly intervals |
| Following | 400 per day, plus ratio limits once you follow 5,000 accounts |
| Changes to account email | 4 per hour |
| Direct messages | A daily cap, listed on the same page |
Three details on that page explain a lot of confusing errors:
- The limits count every device and app. "These limits include actions from all devices, including web, mobile, phone, API, etc." Any third-party app connected to your account spends from the same budget.
- They can shrink. "These limits may be temporarily reduced during periods of heavy site usage," and X posts updates on its status site.
- The error tells you which limit you hit. X says it will "let you know with an error message telling you which limit you've hit," and that you can try again once the time limit has passed.
For follow limits, X points to a separate troubleshooting article. It also warns that "there are additional rules prohibiting aggressive following behavior," so an account that follows right up to the technical cap can still get flagged.
The 2023 reading limits
Many guides about this error date from July 1, 2023. That day Elon Musk announced temporary daily limits on how many posts people could read, starting at 6,000 for verified accounts and 600 for unverified ones, and raised them within hours (Hootsuite's summary). It's when "Rate limit exceeded" became a household phrase. X's current limits page doesn't list a reading limit.
The X API rate limits for developers
X's rate limits page (checked October 17, 2026) says limits apply per endpoint and per time window, "Usually 15 minutes or 24 hours." They come in two kinds:
- Per-app limits apply when you call with a Bearer Token (app-only auth).
- Per-user limits apply when you call with an OAuth 1.0a or OAuth 2.0 user token.
These are some of the limits developers hit most often, per 15 minutes unless noted:
| Endpoint | Per app | Per user | Notes |
|---|---|---|---|
GET /2/tweets/search/recent | 450 | 300 | Up to 100 results per request |
GET /2/tweets/search/all | 1/sec, 300 | 1/sec | Full archive, up to 500 results |
GET /2/tweets/:id | 450 | 900 | One post |
GET /2/tweets | 3,500 | 5,000 | Batch post lookup |
GET /2/users/:id/tweets | 10,000 | 900 | A user's timeline |
GET /2/users/:id/mentions | 450 | 300 | |
GET /2/users/by/username/:username | 300 | 900 | Profile lookup |
GET /2/users/:id/followers | 300 | 300 | Same for following |
GET /2/tweets/:id/liking_users | 75 | 75 | Same for retweeted_by |
POST /2/tweets | 10,000/24hrs | 100 | Creating posts |
POST /2/users/:id/likes | none listed | 50, and 1,000/24hrs | Liking |
Every other endpoint is on the page too, and it notes that the Developer Console shows these limits as well.
What a 429 from X looks like
Go over a limit and X returns HTTP 429 with this body, quoted from its docs:
{
"errors": [{
"code": 88,
"message": "Rate limit exceeded"
}]
}
According to the docs, requests keep failing "until the window resets." Every response, whether it succeeded or failed, carries three headers:
| Header | Meaning |
|---|---|
x-rate-limit-limit | Maximum requests allowed in the window |
x-rate-limit-remaining | Requests left in this window |
x-rate-limit-reset | Unix timestamp when the window resets |
x-rate-limit-reset is a timestamp, not a count of seconds. Reddit's equivalent header counts seconds, so if your code talks to both, handle the two separately.
Rate limits and billing are separate
X now bills self-serve developers pay-per-use, and the rate limits page says plainly that billing and rate limits are separate: "You can be within rate limits but still incur usage costs, or hit rate limits without additional cost." Paying more won't raise your limit, since "Enterprise customers have custom rate limits." Prices are on X's pricing page, and our post is the X API free? covers what changed in 2026.
How to stay under the X API rate limit
X's own best practices are short: cache responses, use streaming for real-time data instead of polling, monitor headers, and spread requests across the window. In practice:
- Read the headers on every call. When
x-rate-limit-remainingreaches 0, sleep untilx-rate-limit-resetinstead of firing the next request to find out. - Pick the endpoint with the bigger budget. Batch lookup (
GET /2/tweets) allows 3,500 calls per 15 minutes per app, against 450 for single lookups, and each call takes up to 100 ids. - Pull only what's new. For timelines and search, pass
since_idwith the newest id you already have rather than re-reading old results. - For live keyword tracking, stream instead of polling. Filtered stream connections have their own limits, listed on the same page.
- Know whose budget you're spending. A user-token call counts against that user and an app-token call against the app. The numbers differ, sometimes by a lot: 10,000 against 900 for user timelines.
Don't try to get around limits by rotating accounts or tokens. The limits exist to protect the platform, and X's developer guidelines are the rules your app is judged by, so read them before you spread one workload across several apps.
Handling a 429 in Python
This follows the recovery strategy in X's docs (wait for x-rate-limit-reset, back off if needed):
import time
import requests
def x_get(url, token, params=None, max_tries=5):
headers = {"Authorization": f"Bearer {token}"}
for attempt in range(max_tries):
r = requests.get(url, headers=headers, params=params, timeout=30)
if r.status_code == 429:
reset = int(r.headers.get("x-rate-limit-reset", 0)) # Unix timestamp
time.sleep(max(reset - time.time(), 2 ** attempt, 1))
continue
r.raise_for_status()
if r.headers.get("x-rate-limit-remaining") == "0":
reset = int(r.headers.get("x-rate-limit-reset", 0))
time.sleep(max(reset - time.time(), 0))
return r.json()
raise RuntimeError("Still rate limited after retries")
If you use Tweepy, its client takes wait_on_rate_limit=True, which sleeps through the window for you.
Reading X without managing X's limits
If you only need to read X (profiles, timelines, search, replies, followers) and don't want to manage an app, tokens and per-endpoint windows, a hosted API can handle that part. ChatterAPI serves X reads through one key and a credit balance, and most reads cost 3 credits per call. It's independent and not affiliated with X.
There is still one limit you need to know about: requests per second per account. It's 2 on signup credits and 10 to 50 on paid plans, all listed in the rate limits docs. A call over the limit fails with rate_limited and a retry-after header in seconds, and you aren't charged for it.
Here is the search we ran on October 17, 2026 while researching this post:
curl "https://api.chatterapi.com/v1/x/tweets/search?q=%22rate+limit%22+%22X+API%22+-filter%3Areplies&sort=latest" \
-H "Authorization: Bearer $CHATTERAPI_KEY"
The response, trimmed to the one post quoted above:
{
"data": [
{
"id": "2086619298731286693",
"text": "Hey guys, dev here 👋\n\nOtto is currently experiencing an X API rate limit, so automated posts may be temporarily paused.\n\nEverything is running normally on our end and posting will resume once the limit is lifted. Thanks for your patience.",
"url": "https://x.com/ottoscreator/status/2086619298731286693",
"createdAt": "2026-08-10T01:03:02.000Z",
"likes": 12,
"replies": 12,
"views": 610,
"author": { "handle": "ottoscreator", "name": "Otto's Creator" }
}
],
"page": { "nextCursor": "AdhNHcRoAvXn…", "hasMore": true },
"credits": { "charged": 3, "remaining": 590 },
"requestId": "req_01M56E2SW066263X1XNV",
"cached": false
}
The X API docs list every X endpoint with its credit cost, and the X API page explains what's covered. If you want to try a search without writing code, the free X tweet search tool runs the same query in a browser.
Next step
If the X API is returning 429s, add the header check above first. That alone usually fixes it. For read-only work where you'd rather not run an X app at all, sign up with Google to get 100 free credits without entering a card, then run the search above with your own query. Plans start at $19 a month for 25,000 credits.