Rate limits
MIOSA rate-limits API requests per API key, per workspace, and per endpoint group. When you exceed a limit, the API returns HTTP 429 with a Retry-After header telling you how many seconds to wait before retrying.
This page covers request throttling only. Hard caps that are not about request rate - concurrent sandboxes, exec and upload limits, webhook retries, browser token TTL - and everything billable live on Pricing and limits.
Request limits
| Scope | Limit |
|---|---|
| Per API key | 60 to 30,000 requests per minute, depending on the key’s tier |
| Per workspace | Your plan’s public-API limit, in requests per minute: Developer 2,500, Business 25,000, Enterprise 100,000 |
| Per endpoint group | Static per-minute caps per endpoint family (for example 30,000 on the public API and 3,000 on event streams) |
All /egress/* endpoints | Current limit returned in X-RateLimit-* headers |
Limits can vary by key and policy. Every response carries the current numbers in X-RateLimit-* headers, so read them rather than hardcoding the values above.
Handle a 429
import time, requests
def call(url, **kwargs):
while True:
res = requests.get(url, **kwargs)
if res.status_code != 429:
return res
time.sleep(int(res.headers.get("Retry-After", "1"))) Back off for the number of seconds in Retry-After, then retry. Do not retry in a tight loop; 429 is a signal to slow down, not to try harder.
On the opt-in runner endpoint there are two distinct 429s: rate_limited is the per-key or per-tenant limit, and runtime_busy (with Retry-After: 0) means the runner is at its admission limit and you should retry the request.