Limits
Size caps, timeouts, and concurrency limits on the relay.
Size limits
| Limit | Value | Exceeded → |
|---|---|---|
| JSON request body | 1 MiB | 413 payload_too_large |
STT request multipart part | 1 MiB | 413 payload_too_large |
STT audio multipart part | 25 MiB | 413 payload_too_large |
| WebSocket frame | 1 MiB | stream error |
Idempotency-Key header | 256 bytes | 400 invalid_request |
Time limits
| Limit | Value |
|---|---|
| Request body read deadline | 2 minutes |
WebSocket session.configure deadline | 10 seconds after connect |
Keepalive cadence (WS pings, SSE : heartbeat comments) | every 20 seconds |
There is deliberately no overall wall-clock cap on streaming sessions — liveness is enforced by heartbeats and by budget and lease extension.
Concurrency
Two independent layers can refuse work with 429 concurrency_exhausted (retryable):
- Per-organization slots — your account's concurrent-request limit, enforced at admission. Contact Speko to raise it.
- Per-edge stream slots — a local cap on any single relay task. Retrying lands on capacity elsewhere.
429 rate_limited is distinct: it is request-rate pressure rather than slot exhaustion. Back off in both cases.
Regional behavior
relay.speko.dev is anycast (AWS Global Accelerator, static IPv4 addresses); connections land on the nearest healthy region and stay there for their lifetime. /v1/models reflects the serving region's catalog, and every response names its region in Speko-Region. If a region is drained for maintenance, new connections shift automatically; in-flight streams on a draining task are given a generous window to complete.