---
title: "List runnable agent stack entries"
method: GET
path: "/v1/agent-catalog"
---

# List runnable agent stack entries

`GET /v1/agent-catalog`

## Request

- Base URL: `https://api.skysay.ai`
- URL: `https://api.skysay.ai/v1/agent-catalog`
- Auth: none declared

Pass metered_only=true to receive only the launch-supported hosted components with a runtime adapter, native meter, pinned retail rate, and safe credential contract (validated BYOK where supported or an explicit platform-managed provider contract). The payload also includes conversation_engines: cascade (default STT/LLM/TTS) and gpt_live (GPT-Live-1 voices and Responses backends). Every engine row carries has_language_axis: true for cascade, false for a voice-to-voice engine that has no separate transcriber, LLM or TTS and therefore no language set, no per-language profile overrides and no Follow the caller. Read that flag rather than matching on the engine id: agent create and the voice-stack PATCH refuse languages / language_profiles / follow_caller for an engine whose row says false. Every engine row also carries supports_navigation: false for an engine whose calls do not navigate phone menus yet (GPT-Live at this release; cascade and Gemini Live say true). Nothing is refused for such an engine: its agents keep their navigation setting, their calls run without navigation, and the voice-stack response reports `navigation.ineligible_reason` `engine_not_supported`. A TTS row uses either immutable worker-approved voices or bounded provider-directory voices already ingested by Skysay; the catalog never fetches a provider during a read. Voice metadata and tags are provider-supplied and carry provenance; Skysay does not infer age, accent, or personality. When a provider supplies no per-voice language list, the row inherits only its qualified TTS model languages. voice_count and voices_truncated say when a provider inventory is partial. A resolved agent preserves its exact selected voice in its voice-stack response even outside a bounded catalog slice. Every TTS row carries `delivery_control`: `voice_settings`, `instruction` or `speed` when a `voice_polish.delivery` profile changes that engine's audio, or `unsupported` when the engine accepts and stores a profile without changing its audio (Fish Audio and Azure neural voices today); and `delivery_profiles`, the exact value each of the four profiles resolves to on that engine (a settings object such as stability/similarity_boost/style/speed, a speaking rate, or an instruction sentence), empty for `unsupported`. Both are read from the same packaged delivery table the call runtime and the voice preview use, so a client can state what a profile changes for a voice without a provider list of its own. Each tts entry also lists default_languages: the languages in `languages` where the voice may be chosen WITHOUT the owner choosing it (for example as the pre-selected voice of a new agent). A voice can run a language without being its default -- ElevenLabs eleven_v3 runs English but lists only Estonian -- and a client that pre-selects voices should respect it. This catalog does not authorize a provider credential or disclose provider secrets.

## Query parameters

- `component` 'stt' | 'llm' | 'tts'
- `language` string
- `metered_only` boolean

## Response `200`

Agent stack catalog

---

[API](https://skmtc.dev/skysay/apis/skysay-api.md) · [All operations](https://skmtc.dev/skysay/apis/skysay-api/llms.txt) · [OpenAPI document](https://skmtc.dev/skysay/apis/skysay-api/revisions/95b8c66f99aa?raw)
