Developers · Rate limits

Generous by default, honest when you hit them.

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.

Limits by tier

EndpointSandboxPartnerEnterprise
GET /v1/safe-to-spend10 rps100 rps1,000 rps
GET /v1/plans10 rps100 rps1,000 rps
POST /v1/proposals2 rps25 rps250 rps
POST /v1/approvals2 rps25 rps250 rps
GET /v1/records/{ref}10 rps200 rps2,000 rps
GET /v1/offers/match5 rps50 rps500 rps

Handling a 429

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);
  }
}

Watch the API live

Sandbox uptime and latency are published separately from production.