Skip to main content
Rate limits control the number of requests you can make to each endpoint. Exceeding limits results in a 429 error until the window resets.

How rate limits work

ConceptDescription
Time windowUsually 15 minutes or 24 hours
Per-user limitsApply with OAuth 1.0a or OAuth 2.0 user tokens
Per-app limitsApply with Bearer Token (app-only)
Per-endpointEach endpoint has its own limits

Checking your limits

Response headers show your current rate limit status:
x-rate-limit-limit: 900
x-rate-limit-remaining: 847
x-rate-limit-reset: 1705420800
HeaderDescription
x-rate-limit-limitMaximum requests allowed
x-rate-limit-remainingRequests remaining in window
x-rate-limit-resetUnix timestamp when window resets

Rate limit tables

View the rate limit for each endpoint below. You can also see these limits in the Developer Console.
Limits are shown per 15 minutes unless otherwise noted (e.g., “/24hrs” or “/sec”).

Posts (25 endpoints)

Tweets lookup

MethodEndpointPer AppPer User
GET/2/tweets3,500/15min5,000/15min
GET/2/tweets/:id450/15min900/15min
MethodEndpointPer AppPer UserNotes
GET/2/tweets/search/recent450/15min300/15min10 default, 100 max results; 512 query length
MethodEndpointPer AppPer UserNotes
GET/2/tweets/search/all1/sec, 300/15min1/sec10 default, 500 max results; 1024 query length

Post counts

MethodEndpointPer AppPer UserNotes
GET/2/tweets/counts/recent300/15min512 query length
GET/2/tweets/counts/all300/15min1024 query length

Filtered stream

MethodEndpointPer AppPer UserNotes
GET/2/tweets/search/stream50/15min1 connection; 1000 rules; 1024 rule length; 250 posts/sec
GET/2/tweets/search/stream/rules450/15min1 connection; 1000 rules; 1024 rule length
POST/2/tweets/search/stream/rules100/15min1 connection; 1000 rules; 1024 rule length

Manage posts

MethodEndpointPer AppPer User
POST/2/tweets10,000/24hrs100/15min
DELETE/2/tweets/:id50/15min

Timelines

MethodEndpointPer AppPer User
GET/2/users/:id/tweets10,000/15min900/15min
GET/2/users/:id/mentions450/15min300/15min
GET/2/users/:id/timelines/reverse_chronological180/15min

Likes lookup

MethodEndpointPer AppPer User
GET/2/tweets/:id/liking_users75/15min75/15min
GET/2/users/:id/liked_tweets75/15min75/15min

Manage likes

MethodEndpointPer AppPer User
POST/2/users/:id/likes50/15min, 1,000/24hrs
DELETE/2/users/:id/likes/:tweet_id50/15min, 1,000/24hrs

Retweets lookup

MethodEndpointPer AppPer UserNotes
GET/2/tweets/:id/retweeted_by75/15min75/15min
GET/2/tweets/:id/quote_tweets75/15min75/15min
GET/2/users/reposts_of_me75/15min100 max results

Manage retweets

MethodEndpointPer AppPer User
POST/2/users/:id/retweets50/15min
DELETE/2/users/:id/retweets/:tweet_id50/15min

Hide replies

MethodEndpointPer AppPer User
PUT/2/tweets/:tweet_id/hidden50/15min

Users (14 endpoints)

Users lookup

MethodEndpointPer AppPer User
GET/2/users300/15min900/15min
GET/2/users/:id300/15min900/15min
GET/2/users/by300/15min900/15min
GET/2/users/by/username/:username300/15min900/15min
GET/2/users/me75/15min

Search users

MethodEndpointPer AppPer User
GET/2/users/search300/15min900/15min

Follows lookup

MethodEndpointPer AppPer User
GET/2/users/:id/following300/15min300/15min
GET/2/users/:id/followers300/15min300/15min

Manage follows

MethodEndpointPer AppPer User
POST/2/users/:id/following50/15min
DELETE/2/users/:source_user_id/following/:target_user_id50/15min

Blocks lookup

MethodEndpointPer AppPer User
GET/2/users/:id/blocking15/15min

Mutes lookup

MethodEndpointPer AppPer User
GET/2/users/:id/muting15/15min

Manage mutes

MethodEndpointPer AppPer User
POST/2/users/:id/muting50/15min
DELETE/2/users/:source_user_id/muting/:target_user_id50/15min

Spaces (6 endpoints)

Spaces lookup

MethodEndpointPer AppPer User
GET/2/spaces/:id300/15min300/15min
GET/2/spaces300/15min300/15min
GET/2/spaces/:id/tweets300/15min300/15min
GET/2/spaces/by/creator_ids300/15min, 1/sec300/15min, 1/sec
GET/2/spaces/:id/buyers300/15min300/15min

Search Spaces

MethodEndpointPer AppPer User
GET/2/spaces/search300/15min300/15min

Direct Messages (8 endpoints)

Direct Messages lookup

MethodEndpointPer AppPer User
GET/2/dm_events15/15min
GET/2/dm_events/:id15/15min
GET/2/dm_conversations/:dm_conversation_id/dm_events15/15min
GET/2/dm_conversations/with/:participant_id/dm_events15/15min

Manage Direct Messages

MethodEndpointPer AppPer User
POST/2/dm_conversations1,440/24hrs15/15min, 1,440/24hrs
POST/2/dm_conversations/with/:participant_id/messages1,440/24hrs15/15min, 1,440/24hrs
POST/2/dm_conversations/:dm_conversation_id/messages1,440/24hrs15/15min, 1,440/24hrs
DELETE/2/dm_events/:id4,000/24hrs300/15min, 1,500/24hrs

Lists (14 endpoints)

Lists lookup

MethodEndpointPer AppPer User
GET/2/lists/:id75/15min75/15min
GET/2/users/:id/owned_lists15/15min15/15min

List Tweets lookup

MethodEndpointPer AppPer User
GET/2/lists/:id/tweets900/15min900/15min

List member lookup

MethodEndpointPer AppPer User
GET/2/lists/:id/members900/15min900/15min
GET/2/users/:id/list_memberships75/15min75/15min

Manage Lists

MethodEndpointPer AppPer User
POST/2/lists300/15min
DELETE/2/lists/:id300/15min
PUT/2/lists/:id300/15min

Manage List members

MethodEndpointPer AppPer User
POST/2/lists/:id/members300/15min
DELETE/2/lists/:id/members/:user_id300/15min

Manage List follows

MethodEndpointPer AppPer User
POST/2/users/:id/followed_lists50/15min
DELETE/2/users/:id/followed_lists/:list_id50/15min

Pinned Lists

MethodEndpointPer AppPer User
GET/2/users/:id/pinned_lists15/15min15/15min
POST/2/users/:id/pinned_lists50/15min
DELETE/2/users/:id/pinned_lists/:list_id50/15min

Bookmarks (5 endpoints)

Bookmarks lookup

MethodEndpointPer AppPer User
GET/2/users/:id/bookmarks180/15min
GET/2/users/:id/bookmarks/folders50/15min50/15min
GET/2/users/:id/bookmarks/folders/:folder_id50/15min50/15min

Manage Bookmarks

MethodEndpointPer AppPer User
POST/2/users/:id/bookmarks50/15min
DELETE/2/users/:id/bookmarks/:tweet_id50/15min

Compliance (3 endpoints)

Batch compliance

MethodEndpointPer AppPer User
POST/2/compliance/jobs150/15min
GET/2/compliance/jobs/:job_id150/15min
GET/2/compliance/jobs150/15min

Usage (1 endpoint)

MethodEndpointPer AppPer User
GET/2/usage/tweets50/15min

MethodEndpointPer AppPer User
GET/2/users/personalized_trends200/24hrs, 200/15min100/24hrs, 10/15min
MethodEndpointPer AppPer User
GET/2/trends/by/woeid/:id75/15min

Communities (2 endpoints)

MethodEndpointPer AppPer UserNotes
GET/2/communities/:id300/15min300/15min
GET/2/communities/search300/15min300/15min100 max results

Analytics (1 endpoint)

MethodEndpointPer AppPer User
GET/2/tweets/analytics300/15min300/15min

Media (8 endpoints)

MethodEndpointPer AppPer User
POST/2/media/upload50,000/24hrs500/15min
GET/2/media/upload100,000/24hrs1,000/15min
POST/2/media/upload/initialize180,000/24hrs1,875/15min
POST/2/media/upload/:id/append180,000/24hrs1,875/15min
POST/2/media/upload/:id/finalize180,000/24hrs1,875/15min
POST/2/media/metadata50,000/24hrs500/15min
POST/2/media/subtitles10,000/24hrs100/15min
DELETE/2/media/subtitles10,000/24hrs100/15min

Activity & Webhooks

MethodEndpointPer AppPer UserNotes
GET/2/activity/stream450/15min2 connections; 250 posts/sec
POST/2/activity/subscriptions500/15min
GET/2/activity/subscriptions500/15min
PUT/2/activity/subscriptions/:subscription_id500/15min
DELETE/2/activity/subscriptions/:subscription_id500/15min
POST/2/webhooks450/15min
GET/2/webhooks450/15min
PUT/2/webhooks/:webhook_id450/15min
DELETE/2/webhooks/:webhook_id450/15min
POST/2/webhooks/replay100/15min

Other endpoints

MethodEndpointPer AppPer User
GET/2/tweets/sample10/stream100/15min
GET/2/news/:id200/15min
GET/2/news/search200/15min200/15min
POST/2/users/:id/dm/block25/15min, 1,000/24hrs10/15min, 400/24hrs
POST/2/users/:id/dm/unblock25/15min, 1,000/24hrs10/15min, 400/24hrs
GET/2/users/by/username/:username/tweets1,500/15min900/15min
GET/2/users/by/username/:username/mentions450/15min180/15min
GET/2/users/:id/following/spaces300/15min300/15min
GET/2/tweets/:id/retweets75/15min75/15min
DELETE/2/connections/all25/15min25/15min

Handling rate limits

When you hit a rate limit, you’ll receive a 429 response:
{
  "errors": [{
    "code": 88,
    "message": "Rate limit exceeded"
  }]
}

Recovery strategy

  1. Check x-rate-limit-reset for when the window resets
  2. Wait until that time before retrying
  3. Use exponential backoff if needed
import time

def make_request_with_backoff(url, headers):
    response = requests.get(url, headers=headers)
    
    if response.status_code == 429:
        reset_time = int(response.headers.get('x-rate-limit-reset', 0))
        wait_time = max(reset_time - time.time(), 60)
        time.sleep(wait_time)
        return make_request_with_backoff(url, headers)
    
    return response

Best practices

Cache responses

Store results locally to reduce repeated requests.

Use streaming

For real-time data, use filtered stream instead of polling.

Monitor headers

Track remaining requests to avoid hitting limits.

Spread requests

Distribute requests across the time window.

Rate limits vs. billing

Rate limits and billing are separate:
ConceptPurpose
Rate limitsControl request frequency for system stability
Usage billingCharge for data retrieved (pay-per-usage)
You can be within rate limits but still incur usage costs, or hit rate limits without additional cost.

Enterprise rate limits

Enterprise customers have custom rate limits. Contact your account manager or apply for Enterprise access.

Next steps