Rate limits
Rate limit
Requests are counted per account in a one-second window; X-RateLimit-Limit is your limit. Short bursts up to one second's worth are admitted.
Over the limit you get 429 RATE_LIMIT_EXCEEDED without Retry-After; it clears within a second.
A 429 SERVICE_OVERLOADED is different: the API shed the request under load before reading your limits, so nothing was admitted, nothing was
charged, and the response carries neither X-RateLimit-* nor the other limit headers. It does carry Retry-After in whole seconds
— wait at least that long before retrying.
Concurrency
Plans do not cap how many requests run at once — send the volume you need and the API paces it against each
engine's rate limits. An async task beyond what the engines take waits in your queue; a synchronous call that
cannot start fails at once with 429 CONCURRENT_LIMIT_EXCEEDED and details.limit.
Accounts take turns for capacity, so another account's large batch does not hold up yours.
Queue capacity
Async submissions are checked against your queue capacity. A task or batch that would overflow it is rejected whole with
429 QUEUE_LIMIT_EXCEEDED, whose details carry queuedCount, batchSize, maxQueueSize and
remainingCapacity. Watch the queue with GET /v1/async/status and drop tasks that have not started with
DELETE /v1/async/queue (see managing the queue).
Headers
| Header | Sent on | Meaning |
|---|---|---|
X-RateLimit-Limit | Every response your limits were read for | Requests allowed per one-second window. |
X-RateLimit-Remaining | Every response your limits were read for | Number of requests remaining in the current window. |
X-Request-Id | Every response | The request's id (see request ids). |
Retry-After | 429 SERVICE_OVERLOADED | Whole seconds to wait before retrying. |
X-Concurrent-Limit | Monitor responses | Concurrency slots available to the account (uncapped on every plan). |
X-Concurrent-Current | Monitor responses | Slots in use. |
X-Concurrent-Remaining | Monitor responses | Slots free. |
X-Credits-Remaining | Monitor responses | Your credit balance. |
X-Credits-Charged | Monitor responses | Credits this request was charged. |
X-Latency-Ms | Monitor responses | Server-side processing time in milliseconds, excluding network transit. |
Reading limits in code
The SDKs retry 429s with jittered backoff on their own. To throttle before hitting a limit, read the headers from a response's metadata with the low-level
request method:
const { data, meta } = await client.request("POST", "/v1/monitor/chatgpt", { prompt: "iPhone 17 or Galaxy S26?", country: "US" });
console.log(meta.concurrentRemaining, meta.rateLimitRemaining, meta.creditsCharged);
data, meta = client.request("POST", "/v1/monitor/chatgpt", {"prompt": "iPhone 17 or Galaxy S26?", "country": "US"})
print(meta.concurrent_remaining, meta.rate_limit_remaining, meta.credits_charged)