Speko Docs

Speko Router

One hosted API for speech-to-text, text-to-speech, and language models across every provider in the Speko catalog.

Speko Router is a hosted API at https://router.speko.dev (WebSockets at wss://router.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
POST /v1/stt/transcriptions/jobsTranscribe a recording of any length asynchronously, delivered to a webhook
GET /v1/stt/transcriptions/jobs/{job_id}Fetch a transcription job
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 Router

  • One contract. Providers differ in auth, framing, and error shapes. The Router 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 Router 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. router.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