Skip to main content
Xquik applies fixed-window Twitter API rate limits per Xquik account. These limits protect tweet reads, profile lookups, writes, and deletions. Standard API keys for one account share the same method buckets. Separate read, write, and delete buckets reset independently.
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.
The listed request count succeeds inside each window. The next request receives 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.
The window starts with your first request. It does not follow wall-clock seconds. An early retry does not extend the existing window. It still returns 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 returns Retry-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 retries GET requests only. It does not retry writes.
The header wins when both values exist. Jitter spreads simultaneous workers. The 3-attempt cap prevents a stalled queue from hiding an outage.

Resume tweet exports after 429

Tweet searches return has_next_page and next_cursor. Store the completed page and next cursor atomically. Do not advance the cursor after a failed request.
Keep 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.
One in-memory limiter coordinates only one process. Use a shared queue across multiple servers, functions, or containers.

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.
A client scheduler can use another algorithm. Keep its output below Xquik’s fixed-window limits. Configure one coordinator per Xquik account.

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.
Request a full page. Store next_cursor, then continue the same query. Never restart from page one after a recoverable 429.
Batch tweet or profile IDs through the documented batch endpoints. One batch request uses fewer read slots than individual lookups.
Let monitors deliver matching tweets through signed webhooks. Use event reads for backfills, reconciliation, and missed delivery checks.
Cache names, usernames, profile images, and account settings. Refresh them on a schedule that matches your product needs.
Multiple API keys do not multiply a standard account’s limits. Route every worker through one account-aware queue.
Use different queues for reads, writes, and deletes. This mirrors the independent server buckets.

Monitor API throttling

Record enough context to explain each 429. 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 returns 429 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 returns 429 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 inspect error, 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.