Speko Docs

Models

The Router catalog, capability flags, and how canary probes gate what is routable.

GET /v1/models

Returns the models currently routable for your organization from the region serving you:

curl -s https://router.speko.dev/v1/models \
  -H "Authorization: Bearer $SPEKO_API_KEY"
{
  "models": [
    {
      "id": "claude-sonnet-5",
      "provider": "anthropic",
      "kind": "llm",
      "capabilities": {
        "tools": true, "structured_output": true, "cached_input": true, "reasoning": true,
        "diarization": false, "keywords": false, "noise_reduction": false,
        "word_timestamps": false, "word_timings": false, "character_timings": false
      },
      "regions": ["us-east-1"]
    },
    {
      "id": "sonic-3.5",
      "provider": "cartesia",
      "kind": "tts",
      "capabilities": {
        "tools": false, "structured_output": false, "cached_input": false, "reasoning": false,
        "diarization": false, "keywords": false, "noise_reduction": false,
        "word_timestamps": false, "word_timings": true, "character_timings": false
      },
      "regions": ["us-east-1"]
    }
  ],
  "catalog_digest": "sha256:..."
}
kindstring

stt, tts, or llm.

capabilitiesobject

Advisory capability flags. Every entry carries every flag, so the ones that do not apply to a model's kind are present and false. LLM entries set tools, structured_output, cached_input, reasoning. STT entries set diarization, keywords, noise_reduction, and word_timestamps — what the route can be asked for in the options object; a request asking for a capability the route lacks is refused capability_unsupported rather than served without it. TTS entries set word_timings and character_timings — see word timings. These two report what a route emits on its own rather than something you can ask for: word_timings means the route sends utterance.timings, and character_timings means its engine measures per character, which the Router groups into words before they reach you. A route with neither sends no timing frames, and no error.

regionsstring[]

AWS region IDs naming Speko Router locations that can serve the model — not provider data-residency claims. The listing always reflects the region that served your request.

batch_audio_limitsobject

Present on every STT entry from GET /v1/models?path=batch: the bounds of the model's pre-recorded API on one upload, as max_pcm_bytes (decoded PCM) and/or max_duration_seconds. The batch listing contains only models that have a pre-recorded route; realtime-only models (Deepgram Flux, Cartesia ink-2, OpenAI gpt-live-transcribe, Palabra) are omitted from it and are not candidates for transcription jobs.

catalog_digeststring

sha256: + 64 hex characters identifying the exact catalog release in effect.

Use path=batch when choosing a model for POST /v1/stt/transcriptions or a transcription job. On the synchronous endpoint automatic routing applies the same batch_audio_limits and skips models that cannot accept the parsed recording; jobs use them to plan chunks. These limits are not returned for the default path=stream query.

The live catalog

The catalog is dynamic. The authenticated GET /v1/models response and the dashboard's Models page are the authoritative sources for currently available providers, model IDs, regions, and capabilities.

Representative entries include Deepgram speech recognition, Cartesia speech synthesis, and OpenAI or Anthropic language models. Do not copy those examples into allowlists: read the live catalog when validating a route or presenting model choices.

Canary gating

Speko runs a scheduled canary in every region that exercises each route as an ordinary customer — a real transcription, a real synthesis, a real completion. A (region, provider, model) route is routable only while its latest probe is a pass that is recent enough; a newer failure always beats an older pass.

Consequences you can rely on:

  • Models missing from /v1/models are not receiving auto-routed traffic in that region right now.
  • The list is advisory and can be up to about 30 seconds stale; admission re-checks authoritatively, so a just-failed route may briefly still be listed and yet refuse work with no_eligible_route-class errors.
  • Pinning an unlisted model with explicit routing does not bypass the health gate.

On this page