Standard limits. 300 reads per second, 120 writes per minute, and 60
deletes per minute. After
429, wait for Retry-After before retrying.Twitter API rate limits at a glance
Read bucket
GET, HEAD, and OPTIONS allow 300 requests per 1 second.Write bucket
POST, PUT, and PATCH allow 120 requests per 60 seconds.Delete bucket
DELETE allows 60 requests per 60 seconds.429 rate_limit_exceeded. A read burst does not consume write capacity.
A write burst does not consume delete capacity.
Action-Specific Twitter API limits
Some actions add a narrower bucket. That bucket applies beside the method tier.
The follow bucket protects connected X accounts from rapid automation.
It also covers follower removal. Reaching 400 actions blocks more attempts.
Track the daily count instead of retrying every minute.
How the fixed window works
Xquik uses fixed-window counters. It does not use a token bucket. The first counted request starts that bucket’s window.1
Start the window
The first request starts a 1-second or 60-second window.
2
Count every request
Each request increments its read, write, or delete counter.
3
Reject the overflow
Requests above the bucket limit receive
429 Too Many Requests.4
Reset the counter
The complete counter resets when its fixed window expires.
429.
Always follow the response instead of guessing the reset time.
Read a 429 rate-limit response
An Xquik tier limit returns a structured JSON error. It also returnsRetry-After in seconds.
Standard read throttles return
Retry-After: 1. Standard write and delete
throttles return Retry-After: 60. Account connection returns the remaining
window. A login cooldown returns its own remaining duration.
Retry-After does not always mean rate limited
Inspect the status and error code together.
Read API Error Handling before retrying writes.
An idempotency key prevents duplicate submission. It does not make every retry safe.
Xquik limits versus official X API limits
The phrase “Twitter API limits” can describe two separate systems. Xquik enforces the account buckets documented above. X also enforces upstream limits for connected accounts and service access.
Official X API rate limits vary by endpoint and authentication context.
They can apply per app, user token, or endpoint.
See X API rate limits
for the current official tables.
Do not copy official X limits into an Xquik client limiter.
Use the Xquik values on this page. Handle upstream codes separately.
Recover from API rate limit exceeded
Use bounded retries for idempotent reads. Preserve cursor state before waiting. Never run an unbounded retry loop.1
Classify the response
Check the HTTP status and exact
error value.2
Read the server delay
Prefer
Retry-After. Fall back to retryAfter or retryAfterMs.3
Keep the same read checkpoint
Preserve the query, filters, limit, and cursor.
4
Wait with jitter
Add a small random delay after the required wait.
5
Retry a bounded number
Stop after 3 attempts. Return the final error to the caller.
Node.js 429 recovery
This helper retriesGET requests only. It does not retry writes.
Resume tweet exports after 429
Tweet searches returnhas_next_page and next_cursor.
Store the completed page and next cursor atomically.
Do not advance the cursor after a failed request.
q, queryType, filters, and limit unchanged while resuming.
Dedupe stored tweets by tweets[].id. A repeated page then remains harmless.
See Request-Efficient API Usage
for more checkpoint patterns.
Cursor recovery checklist
Pace requests before 429
Leave headroom below each documented limit. Headroom absorbs network timing and work from other API keys. It also protects shared serverless workers.Use a shared Node.js limiter
This Bottleneck configuration reserves 10% read headroom.Rate-Limiting libraries
Node.js libraries
Use bottleneck for shared queues,
or p-limit for concurrency caps.
Python library
Use ratelimit with
pip install ratelimit.Go library
Use rate with
go get golang.org/x/time/rate.Reduce Twitter API requests
The limit counts requests, not returned tweets or followers. Use each endpoint’s largest suitable page size. One 100-tweet page uses one read request. One request per tweet would use 100 read requests.Use cursor pagination
Use cursor pagination
Request a full page. Store
next_cursor, then continue the same query.
Never restart from page one after a recoverable 429.Batch IDs where supported
Batch IDs where supported
Batch tweet or profile IDs through the documented batch endpoints.
One batch request uses fewer read slots than individual lookups.
Use webhooks instead of polling
Use webhooks instead of polling
Let monitors deliver matching tweets through signed webhooks.
Use event reads for backfills, reconciliation, and missed delivery checks.
Cache stable profile fields
Cache stable profile fields
Cache names, usernames, profile images, and account settings.
Refresh them on a schedule that matches your product needs.
Centralize worker concurrency
Centralize worker concurrency
Multiple API keys do not multiply a standard account’s limits.
Route every worker through one account-aware queue.
Separate read and write queues
Separate read and write queues
Use different queues for reads, writes, and deletes.
This mirrors the independent server buckets.
Monitor API throttling
Record enough context to explain each429. Never log API key values.
A rising Xquik
429 rate usually means excessive local concurrency.
A rising x_api_rate_limited count indicates a different upstream condition.
Keep those alerts separate.
Twitter API rate-limit questions
What does API rate limit exceeded mean?
The client sent more requests than one active window allows. Xquik returns429 rate_limit_exceeded for its own exhausted bucket.
Wait for Retry-After, then retry the same idempotent read.
How long does a Twitter API rate limit last?
Xquik read windows last 1 second. Write and delete windows last 60 seconds. Connection safety windows last 15 minutes. Login cooldowns use dynamic waits. Official X endpoint windows differ from these Xquik limits.Why am I rate limited below 300 reads?
All standard keys for one Xquik account share the read bucket. Another worker, function, or server may consume the remaining requests. Centralize scheduling and reserve headroom below 300 requests per second.Do multiple API keys increase my rate limit?
No. Standard API keys resolve to the same Xquik account buckets. Use separate keys for access control, rotation, and auditability. Do not use them to bypass request limits.Does retrying early reset the window?
No. An early retry does not extend or reset the fixed window. It still returns429 until the original window expires.
Does a rate-limited request consume tweet credits?
An Xquik tier rejection happens before the endpoint performs its work. It does not collect new tweets, followers, profiles, or replies. Successful pages completed before the rejection keep their normal charges.Should I retry a tweet write after 429?
First inspecterror, statusUrl, terminal, and safeToRetry.
Poll an active durable action instead of resending it.
Use a new idempotency key only when safeToRetry is true.
How do I avoid Twitter API rate limits?
Use larger pages, cursor checkpoints, batch routes, caches, and signed webhooks. Share one limiter across workers. Keep separate queues for each method bucket.Search tweets
Search tweets with filters, page limits, and cursor recovery.
Error handling
Classify billing, validation, dependency, and write lifecycle errors.
Pagination
Preserve tweet, follower, reply, and extraction cursors safely.