Developers · Rate limits
Limits exist to keep every tenant’s p50 flat. When you hit one you get a clean 429 with a precise retry time, never a silent throttle.
| Endpoint | Sandbox | Partner | Enterprise |
|---|---|---|---|
| GET /v1/safe-to-spend | 10 rps | 100 rps | 1,000 rps |
| GET /v1/plans | 10 rps | 100 rps | 1,000 rps |
| POST /v1/proposals | 2 rps | 25 rps | 250 rps |
| POST /v1/approvals | 2 rps | 25 rps | 250 rps |
| GET /v1/records/{ref} | 10 rps | 200 rps | 2,000 rps |
| GET /v1/offers/match | 5 rps | 50 rps | 500 rps |
backoff · TS
try {
await qoyla.customer(id).safeToSpend();
} catch (e) {
if (e.status === 429) {
// Retry-After is always present and always honest
await sleep(Number(e.headers["retry-after"]) * 1000);
}
}Sandbox uptime and latency are published separately from production.