---
title: "List Voices"
method: GET
path: "/v1/voices"
---

# List Voices

`GET /v1/voices`

## Request

- Base URL: `https://api.storyflo.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.storyflo.com/v1/voices`
- Auth: none declared

Public voice catalog — drives the voice picker on /listen/preferences.

DERIVED FROM ``app/voices.py``, deliberately. This used to be a
hard-coded list maintained beside the real registry, and the two drifted
until they shared exactly two entries out of ten:

  * The catalog advertised ``kokoro-warm``, ``kokoro-clear``, four
    ``openai-*`` and two ``eleven-*`` ids that exist in NO registry, so
    ``GET /v1/voices/{id}/sample`` 404'd on eight of the ten voices it
    had just offered — you could not audition what you were asked to pick.
  * It also HID ten real voices, including the named show hosts (Jessica,
    Chloe, Wit, Brock, Dex, Sage) and both Spanish voices. Listeners could
    not choose the voices the platform actually ships.
  * Its ``tier`` field sold ``plus`` and ``pro`` voices the router will
    never reach: ``router.py`` refuses to let a metered provider LEAD a
    chain (``test_no_chain_leads_with_a_metered_provider``), and
    ``ELEVENLABS_MONTHLY_FREE_CHARS`` is 0. Picking "Rachel (Pro)"
    silently rendered Kokoro instead — the old docstring said so outright.

One source of truth removes all three at once. Every registry voice has a
self-hosted path (Kokoro, Piper or StyleTTS2), so every voice offered here
is genuinely free to render; ``self_hosted`` states that rather than
implying a paid ladder that does not exist.

## Response `200`

Successful Response

- object

---

[API](https://skmtc.dev/storyflo/apis/storyflo-inference-router.md) · [All operations](https://skmtc.dev/storyflo/apis/storyflo-inference-router/llms.txt) · [OpenAPI document](https://skmtc.dev/storyflo/apis/storyflo-inference-router/revisions/c3a1a735ac7a?raw)
