Docs /
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 could not take the request right now, 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
No account has a fixed concurrency cap: send the volume you need. An async task that cannot start now waits in your
queue. A synchronous call that
cannot start now fails at once with 429 CONCURRENT_LIMIT_EXCEEDED and details.limit, so
use async for large volumes. The one fixed limit is /v1/monitor/google/goto, at 4 calls
per account at once; more are refused with the same error.
Another account's large batch does not hold up yours.
Queue capacity
Your queue holds 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 (no fixed 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)