Speko Docs

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

EndpointWhat it does
GET /v1/modelsThe catalog of currently routable models
POST /v1/stt/transcriptionsTranscribe an audio file
GET /v1/stt/streamLive transcription over WebSocket
POST /v1/tts/speechSynthesize speech from text
GET /v1/tts/streamStreaming synthesis over WebSocket
POST /v1/llm/responsesGenerate 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.dev resolves to static anycast IPs (AWS Global Accelerator) and lands your connection on the nearest healthy region. Responses carry a Speko-Region header naming the region that served you.

The two rules every request follows

  1. Authenticate with Authorization: Bearer sk_speko_... — see Authentication.
  2. Send an Idempotency-Key header 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.

On this page