Quotas & Errors
Rate limiting and common error codes for the Business API.
Per-key budgets
Every API key is metered against these rolling budgets:
| Budget | Default limit | Scope |
|---|---|---|
| Requests per minute | 200 | Per key |
| Requests per hour | 1000 | Per key |
| Weight per minute | 200 | Per key (shared across all routes) |
Weight is a single per-key budget shared across every route: each call subtracts its route weight (see below) from the same 200 weight/minute pool. A key can therefore make 200 weight-1 calls or 20 weight-10 order creations per minute, in any mix, before receiving 429. Admins can raise a key's limits from the dashboard; the values above are the defaults.
Rate limit headers
Business responses can include:
X-RateLimit-Limit/X-RateLimit-Remaining/X-RateLimit-ResetX-RateLimit-Weight-Limit/X-RateLimit-Weight-Remaining
Route weights
| Route family | Weight | Concurrency |
|---|---|---|
| Currencies | 1 | None |
| Route discovery | 2 | None |
| Route resolve | 3 | 1 |
| Onchain resolve | 4 | 1 |
| Onchain execution report | 4 | 1 |
| Onchain execution status | 1 | None |
| Quotes | 1 | 2 |
| Orders create | 10 | 1 |
| Order reads | 1 | None |
| Emergency | 2 | 1 |
| Notification email | 1 | 1 |
| QR | 1 | None |
| Callbacks & webhooks | 1 | 1 on mutations |
Common errors
| Code | Meaning | What to do |
|---|---|---|
INVALID_API_KEY | Key is invalid, inactive, or revoked | Verify the issued key and key status |
SIGNATURE_REQUIRED | Signature header missing | Send X-API-SIGN |
INVALID_SIGNATURE_FORMAT | Signature is not lowercase hex | Send a lowercase hex HMAC digest |
TIMESTAMP_REQUIRED | Timestamp header missing | Send X-API-TIMESTAMP |
TIMESTAMP_OUT_OF_RANGE | Timestamp outside tolerance window | Regenerate timestamp before sending |
NONCE_REPLAYED | Nonce already used | Generate a fresh nonce for every request |
RATE_LIMIT_EXCEEDED | Budget exhausted | Back off using the limit headers |
CONCURRENCY_LIMIT_EXCEEDED | Another mutation running | Retry later with same Idempotency-Key |
IDEMPOTENCY_BODY_MISMATCH | Same key, different body | Never reuse a key for a different request |
IDEMPOTENCY_REQUEST_IN_PROGRESS | Already processing | Retry later |
IDEMPOTENCY_PREVIOUSLY_FAILED | Earlier attempt failed | Use a new Idempotency-Key |
ORDER_NOT_FOUND | Unknown or unauthorized order | Verify order belongs to same principal |