Rate limits
Request rate
There is no per-account request rate limit: send as many requests a second as you need. X-RateLimit-Limit and
X-RateLimit-Remaining are still sent for clients that read them. Both are deprecated and always 100000, which means no limit.
When one address sends too many unknown API keys, it gets 429 RATE_LIMIT_EXCEEDED with Retry-After in whole seconds.
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
There is no concurrency cap on any account: 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.
/v1/monitor/google/goto runs at most 4 calls per account at once; more are refused with
429 CONCURRENT_LIMIT_EXCEEDED.
Accounts take turns for capacity, so another account's large batch does not hold up yours.
Queue capacity
No fixed count limits your queue. It holds what fits in your share of the queue's space: about 100,000 tasks of a typical
prompt at a time, more of shorter ones. A task or batch that does not fit is rejected whole with 429 QUEUE_LIMIT_EXCEEDED. Its details carry
queuedCount (tasks waiting now), batchSize, maxQueueSize (what your queue holds of tasks this size) and
remainingCapacity (how many more fit). 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 | Deprecated. Always 100000: there is no per-account request rate limit. |
X-RateLimit-Remaining | Every response your limits were read for | Deprecated. Always 100000, the same as X-RateLimit-Limit: nothing counts down. |
X-Request-Id | Every response | The request's id (see request ids). |
Retry-After | 429 SERVICE_OVERLOADED; 429 RATE_LIMIT_EXCEEDED after too many unknown keys | Whole seconds to wait before retrying. |
X-Concurrent-Limit | Monitor responses | Concurrency slots available to the account (there is no concurrency cap). |
X-Concurrent-Current | Monitor responses | Slots in use. |
X-Concurrent-Remaining | Monitor responses | Slots free. |
X-Credits-Remaining | Monitor responses | US dollars you can still spend: the balance less what open tasks hold back. |
X-Credits-Charged | Monitor responses | Dollars this request was charged (0 when a free request covered it). |
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 watch running calls and your balance, 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.creditsRemaining, meta.creditsCharged);
data, meta = client.request("POST", "/v1/monitor/chatgpt", {"prompt": "iPhone 17 or Galaxy S26?", "country": "US"})
print(meta.concurrent_remaining, meta.credits_remaining, meta.credits_charged)