Speko Relay
One hosted API for speech-to-text, text-to-speech, and language models across every provider in the Speko catalog.
The Speko Relay is a hosted API at https://relay.speko.dev (WebSockets at wss://relay.speko.dev). You send one request shape; Speko routes it to the best provider, opens the provider connection with either a Speko-managed credential or your configured provider key, and streams the result back.
Endpoints
| Endpoint | What it does |
|---|---|
GET /v1/models | The catalog of currently routable models |
POST /v1/stt/transcriptions | Transcribe an audio file |
GET /v1/stt/stream | Live transcription over WebSocket |
POST /v1/tts/speech | Synthesize speech from text |
GET /v1/tts/stream | Streaming synthesis over WebSocket |
POST /v1/llm/responses | Generate a model response, optionally streamed as SSE |
Why a relay
- One contract. Providers differ in auth, framing, and error shapes. The relay normalizes all of it: one routing object, one error envelope, one usage schema.
- Managed or BYOK. Configure provider keys once in the dashboard. Each selected route automatically uses the appropriate credential source while preserving the same Relay API.
- Automatic failover. In auto-routing mode, a provider failure before the first byte of output transparently retries on the next-best provider. Your request ID stays the same; the attempt ID changes.
- Health-gated catalog. Every route is continuously probed by Speko's canary in every region. A model only appears in
/v1/models— and only receives auto-routed traffic — while its latest probe passed. - Anycast entry.
relay.speko.devresolves to static anycast IPs (AWS Global Accelerator) and lands your connection on the nearest healthy region. Responses carry aSpeko-Regionheader naming the region that served you.
The two rules every request follows
- Authenticate with
Authorization: Bearer sk_speko_...— see Authentication. - Send an
Idempotency-Keyheader on every POST and every WebSocket upgrade — see Idempotency. Requests without one are rejected.
Health
GET /healthz and GET /readyz are public and unauthenticated:
{"status":"ok"}Start with the quickstart.