429 Too Many Requests on the X API: rate limit or usage cap

A 429 from the X API means either a per-endpoint rate limit or the monthly usage cap was hit.

429 Too Many Requests {"errors":[{"code":88,"message":"Rate limit exceeded"}]}

Short answer

A 429 from the X API means either a per-endpoint rate limit or the monthly usage cap was hit. The windows, the headers to read, example limits and what happens when credits run out.

Diagnosis checked 2026-11-11; sources below.

Why it happens

A rate limit or the usage cap was hit. X resets its rate limits every 15 minutes or every 24 hours depending on the endpoint, reports the reset time in the x-rate-limit-reset header, and caps pay-per-use plans at 3 million Post reads a month. Source: X API rate limits.

Do this now

  1. If the data is yours or your use fits the official terms, switch to the official route: X API v2 (Public API). Charged per resource returned: $0.005 per Post, $0.010 per User. Owned Reads on qualifying own-account endpoints are $0.001 per resource. A 3 million Post-read monthly cap applies to self-serve pay-per-use.
  2. For posts and profiles at volume, run a hosted route instead of patching your own requests: X (Twitter) Profile & Post Engagement Extractor. The request below runs it with its published example input through the Apify API (your token, billed at the Store price).
  3. Compare every route, with fields and prices, on the X (Twitter) page.

Python

from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
    "usernames": [
        "NASA"
    ],
    "include": [
        "profileInfo"
    ],
    "postUrls": [],
    "maxPostsPerProfile": 3,
    "includeReplies": False,
    "includeRetweets": False,
    "includeHighlights": False,
    "onlyWithMedia": False,
    "mediaType": "any",
    "onlyVerified": False,
    "verifiedType": "any",
    "minFollowers": 0,
    "maxFollowers": 0,
    "minAccountAgeDays": 0,
    "withWebsiteOnly": False,
    "bioKeywords": [],
    "activeWithinDays": 0,
    "enrichEngagement": False,
    "proxyConfiguration": {
        "useApifyProxy": False
    }
}

run = client.actor("nimbryxo-studio/x-twitter-profile-and-post-engagement-extractor").call(run_input=run_input)
if run is None:
    raise RuntimeError("The Actor run was not found.")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

pip install apify-client

JavaScript

import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: "<YOUR_APIFY_TOKEN>" });
const input = {
    "usernames": [
        "NASA"
    ],
    "include": [
        "profileInfo"
    ],
    "postUrls": [],
    "maxPostsPerProfile": 3,
    "includeReplies": false,
    "includeRetweets": false,
    "includeHighlights": false,
    "onlyWithMedia": false,
    "mediaType": "any",
    "onlyVerified": false,
    "verifiedType": "any",
    "minFollowers": 0,
    "maxFollowers": 0,
    "minAccountAgeDays": 0,
    "withWebsiteOnly": false,
    "bioKeywords": [],
    "activeWithinDays": 0,
    "enrichEngagement": false,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

const run = await client.actor("nimbryxo-studio/x-twitter-profile-and-post-engagement-extractor").call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

npm install apify-client

cURL

curl -X POST "https://api.apify.com/v2/actors/nimbryxo-studio~x-twitter-profile-and-post-engagement-extractor/run-sync-get-dataset-items"   -H "Authorization: Bearer $APIFY_TOKEN"   -H "Content-Type: application/json"   -d '{"usernames":["NASA"],"include":["profileInfo"],"postUrls":[],"maxPostsPerProfile":3,"includeReplies":false,"includeRetweets":false,"includeHighlights":false,"onlyWithMedia":false,"mediaType":"any","onlyVerified":false,"verifiedType":"any","minFollowers":0,"maxFollowers":0,"minAccountAgeDays":0,"withWebsiteOnly":false,"bioKeywords":[],"activeWithinDays":0,"enrichEngagement":false,"proxyConfiguration":{"useApifyProxy":false}}'

Waits for the run and returns the dataset items (runs over 300 seconds return HTTP 408; start an async run instead).

MCP (AI agents)

{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=nimbryxo-studio/x-twitter-profile-and-post-engagement-extractor",
      "headers": {
        "Authorization": "Bearer <YOUR_APIFY_TOKEN>"
      }
    }
  }
}

Adds this Actor as a tool in an MCP client that takes a remote server URL (Cursor, VS Code, Claude Code) through Apify's hosted MCP server. OAuth sign-in also works without the header. Clients that only start local servers can wrap the URL with npx mcp-remote.

Open X (Twitter) Profile & Post Engagement Extractor in Apify Store

Routes that work for X (Twitter) data

The official route first, then the catalogue Actors that fit this problem (posts and profiles), by their published fields. Store figures are the publisher's public numbers.

Routes for X (Twitter) data
RouteCore fieldsPrice / 1KSuccess, 30 daysLink
Public APIX API v2not comparedbelowOfficial docs
X (Twitter) Profile & Post Engagement Extractor3/7$0.99100% of 24 runsOpen in Apify Store
X/Twitter Keyword & Hashtag Tweet Search3/7$0.996 runs, too few to rateOpen in Apify Store
X Keyword Search with Mention & Reply Operators3/7$0.997 runs, too few to rateOpen in Apify Store

Official price: Charged per resource returned: $0.005 per Post, $0.010 per User. Owned Reads on qualifying own-account endpoints are $0.001 per resource. A 3 million Post-read monthly cap applies to self-serve pay-per-use. Compare all 20 X (Twitter) routes.

The facts behind the error

FactValue
What it meansRate limit or usage cap exceeded; the usage cap has its own error type, usage-capped
WindowsRate limits reset every 15 minutes or every 24 hours, depending on the endpoint
Headersx-rate-limit-limit, x-rate-limit-remaining and x-rate-limit-reset (Unix time of the reset)
Recent search limitGET /2/tweets/search/recent: 450 requests per 15 minutes per app, 300 per user
User Posts limitGET /2/users/:id/tweets: 10,000 requests per 15 minutes per app, 900 per user
Monthly capPay-per-use plans are capped at 3 million Post reads a month
CreditsRequests fail when prepaid credits run out, until more credits are bought

Sources

Every dated claim on this page comes from the public sources below. Check the source before you make a business decision on it.

Content updated 2026-11-11Data checked 2026-11-11

Get X (Twitter) data with a catalogue Actor

Twitter (X) Media Downloader returns 3 of 7 core X (Twitter) fields at $0.99 per 1,000 results. Compare all 20 X (Twitter) routes.

Open in Apify Store