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
- 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.
- 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).
- 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.
| Route | Core fields | Price / 1K | Success, 30 days | Link |
|---|---|---|---|---|
| Public APIX API v2 | not compared | below | Official docs | |
| X (Twitter) Profile & Post Engagement Extractor | 3/7 | $0.99 | 100% of 24 runs | Open in Apify Store |
| X/Twitter Keyword & Hashtag Tweet Search | 3/7 | $0.99 | 6 runs, too few to rate | Open in Apify Store |
| X Keyword Search with Mention & Reply Operators | 3/7 | $0.99 | 7 runs, too few to rate | Open 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
| Fact | Value |
|---|---|
| What it means | Rate limit or usage cap exceeded; the usage cap has its own error type, usage-capped |
| Windows | Rate limits reset every 15 minutes or every 24 hours, depending on the endpoint |
| Headers | x-rate-limit-limit, x-rate-limit-remaining and x-rate-limit-reset (Unix time of the reset) |
| Recent search limit | GET /2/tweets/search/recent: 450 requests per 15 minutes per app, 300 per user |
| User Posts limit | GET /2/users/:id/tweets: 10,000 requests per 15 minutes per app, 900 per user |
| Monthly cap | Pay-per-use plans are capped at 3 million Post reads a month |
| Credits | Requests fail when prepaid credits run out, until more credits are bought |
Website pages
Sources
Every dated claim on this page comes from the public sources below. Check the source before you make a business decision on it.
- X API rate limits — checked 2026-11-11
- X API response codes and errors — checked 2026-11-11
- X API usage and billing — 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.