The VMArea Public API uses two stacked buckets, both backed by Redis so the limits are shared across every API instance.Documentation Index
Fetch the complete documentation index at: https://vmarea.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
Current limits
| Bucket | Limit | Keyed by | Applies to |
|---|---|---|---|
| Public API (per token) | 600 requests / minute (10 RPS sustained) | API token ID | Every /api/public/v1/* request after x-api-key auth succeeds |
| Global fallback (per IP) | 100 requests / minute | IP address | All traffic — primarily catches abuse of unauthenticated routes (login, signup) |
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.
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed in the current window. |
X-RateLimit-Remaining | Requests remaining in the current window. |
X-RateLimit-Reset | Seconds until the window resets. |
Retry-After | Seconds to wait before retrying (only on 429). |
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.