Skip to main content
To keep the platform stable for everyone, the Sevalla API enforces rate limits on all requests. When you exceed a limit, the API returns a 429 Too Many Requests response.

Rate limit tiers

Limits are scoped per company or per service depending on the operation type.
TierLimitScope
Service creation20/hourPer company
Service mutation10/minPer service + company
Deployment10/minPer service + company
General write30/minPer company
Logs30/minPer company
Read400/minPer company
Service creation covers POST requests that create new applications, databases, static sites, or other resources. Service mutation covers PUT, PATCH, and DELETE requests that modify an existing service. General write covers all other write operations that don’t fall into a more specific tier.

Response headers

Every response includes rate limit headers so you can track your usage without guessing.
HeaderDescription
x-ratelimit-limitMaximum number of requests allowed in the current window.
x-ratelimit-remainingNumber of requests remaining in the current window.
x-ratelimit-resetSeconds remaining until the current rate limit window resets.
x-request-idUnique identifier for the request. Include this when contacting support.
Example response headers:
x-ratelimit-limit: 400
x-ratelimit-remaining: 398
x-ratelimit-reset: 5
x-request-id: req-a1b2c3d4e5

Handling 429 responses

When you hit a rate limit, the API returns a 429 status code. The x-ratelimit-reset header tells you how many seconds to wait before retrying.
async function makeRequest(url: string, headers: Record<string, string>): Promise<Response> {
  const resp = await fetch(url, { headers });

  if (resp.status === 429) {
    const wait = Number(resp.headers.get("x-ratelimit-reset"));
    await new Promise((resolve) => setTimeout(resolve, wait * 1000));
    return makeRequest(url, headers);
  }

  return resp;
}
Check x-ratelimit-remaining before making requests. If you’re running low, slow down proactively instead of waiting to get throttled.
Always use exponential backoff with jitter when retrying. Retrying in a tight loop will keep you rate limited longer.