Errors & rate limits
Handle stable public error envelopes, request IDs, rate limits, budgets, and versioning.
Error envelope
{
"error": {
"code": "insufficient_acu",
"message": "Not enough ACU. Add usage capacity to continue.",
"request_id": "req_..."
}
}Always log request_id and include it when contacting support.
Common codes
| Code | Meaning |
|---|---|
missing_api_key | No supported credential header was present |
invalid_api_key | The credential is not recognized |
expired_api_key | The credential has expired |
revoked_api_key | The credential has been revoked |
insufficient_scope | The key lacks the endpoint's required scope |
active_account_required | The workspace cannot currently use the API |
insufficient_acu | The workspace has insufficient usage capacity |
daily_budget_exceeded | The active key reached its daily budget |
monthly_budget_exceeded | The active key reached its monthly budget |
rate_limited | An organization or key rate bucket was exceeded |
query_required | A search or Agent prompt was missing |
identity_required | The endpoint needs a stronger identity anchor |
idempotency_conflict | The key was reused for a different request |
Rate limits
Every public request consumes both an organization-plan bucket and an API-key bucket. The effective limit is the lowest bucket that applies.
| Plan | Organization limit |
|---|---|
| Free | 10 requests/minute |
| Pay as you go | 30 requests/minute |
| API Pro, Starter, or Pro | 300 requests/minute |
| Scale or Teams | 1,000 requests/minute |
Enterprise overrides can raise the organization limit. A key can have a lower per-minute limit for isolation or safety.
Some route families add a tighter ceiling:
| Route family | Per minute | Per hour |
|---|---|---|
/v1/socials | 60 | 600 |
/v1/linkedin/* | 60 | 600 |
Every 429 includes Retry-After. Organization and key bucket failures use the stable rate_limited envelope and also include error.retry_after_seconds.
On 429:
- Respect
Retry-After. - Add jitter before retrying.
- Do not retry an unbounded number of times.
- Reduce request concurrency.
Cost controls
- Set per-key daily and monthly budgets.
- Use
max_acuas the Agent's signed admission, billing, and downstream-call ceiling. - Read active budget and usage context from
GET /v1/account/usage.
Retry policy
Send an Idempotency-Key header on every POST. Repeating the same request
with the same authenticated key replays its original response and bills once.
Reusing that key for different credentials, scopes, route, query, body, content
type, or response type returns 409 idempotency_conflict.
Validation failures (413 and 422) and 403 insufficient_scope do not
consume the key, so the corrected request can reuse it. Explicitly retryable
provider 5xx responses also release the key. API-key budget denials
(daily_budget_exceeded and monthly_budget_exceeded) release the key so a
retry can recheck a reset budget window. Successful responses and other
deliberate responses—including credit/account 402 responses whose preflight
may auto-recharge the workspace—consume the key and replay exactly, preventing
duplicate side effects or charges.
- Retry
429and transient5xxresponses with bounded exponential backoff. - Do not automatically retry validation errors or missing permissions.
- For JSON Agent asks, poll the returned run instead of retrying the POST. For SSE, consume its terminal event.
- Treat a schema-constrained Agent failure as an error; do not reinterpret unvalidated prose as structured success.
