Current limits
The per-token bucket means heavy customers and clients behind shared NAT IPs aren’t penalised for each other’s traffic. Pair this with the
Idempotency-Key header so safe retries don’t burn extra requests — see Idempotency.
429 response
When you exceed either limit, the API returns HTTP429 Too Many Requests:
error string identifies which bucket you tripped (per-token vs per-IP global fallback).
Response headers
Every response includes the standard rate-limit headers;Retry-After is added on 429 responses.
Handling 429 in your client
ReadRetry-After for the minimum wait, then back off exponentially with jitter starting at 1 second:
Best practices
- Use
Idempotency-Keyfor writes. Safe retries won’t double-spend your quota or create duplicate resources. - Batch reads where possible. Paginated list endpoints are cheaper than fan-out GETs.
- Cache catalog data. Plans, regions, and OS templates change infrequently — cache them locally rather than re-fetching.
- Use webhooks for state changes. Subscribing to
vm.started,vm.stopped, etc. avoids pollingGET /vms/:idin a tight loop. - Need higher limits? Contact support — sustained 10 RPS covers virtually every integration, but we can raise per-token ceilings on request.