Skip to main content
GET
/
v1
/
audio
/
voices
Audio Voices
curl --request GET \
  --url https://kymaapi.com/v1/audio/voices \
  --header 'Authorization: Bearer <token>'
Read-only passthrough of TTS voice catalogs across both supported providers:
  • ElevenLabs — ~3,000 voices (premade + community)
  • MiniMax — ~300 system voices spanning Chinese, English, Japanese, and other languages
Cached server-side for 5 minutes per provider so back-to-back calls share one upstream request. Use this to populate a voice picker UI, then pass the chosen voice_id to POST /v1/audio/speech.
Voice ↔ model compatibility: ElevenLabs voice_ids only work with eleven-* SKUs. MiniMax voice_ids only work with minimax-speech-* SKUs. The two are not cross-compatible.
# Default — ElevenLabs only (back-compat)
curl https://kymaapi.com/v1/audio/voices \
  -H "Authorization: Bearer $KYMA_API_KEY"

# MiniMax system voices
curl "https://kymaapi.com/v1/audio/voices?provider=minimax" \
  -H "Authorization: Bearer $KYMA_API_KEY"

# Both providers merged
curl "https://kymaapi.com/v1/audio/voices?provider=all" \
  -H "Authorization: Bearer $KYMA_API_KEY"

Query parameters

ParamValuesDefaultNotes
providerelevenlabs | minimax | allelevenlabsWhich catalog to return

Response

200 OK. Each voice record carries a provider field so you can disambiguate when fetching ?provider=all.
{
  "object": "list",
  "provider": "all",
  "data": [
    {
      "provider": "elevenlabs",
      "voice_id": "JBFqnCBsd6RMkjVDRZzb",
      "name": "George - Warm, Captivating Storyteller",
      "category": "premade",
      "labels": { "accent": "british", "age": "middle_aged", "gender": "male" },
      "preview_url": "https://...",
      "description": "Mature, calm, warm — ideal for narration"
    },
    {
      "provider": "minimax",
      "voice_id": "English_radiant_girl",
      "name": "Radiant Girl",
      "description": ["Energetic", "English", "Female"]
    }
  ]
}

Common fields

FieldTypeNotes
provider"elevenlabs" | "minimax"Which provider serves this voice
voice_idstringOpaque id — pass to /v1/audio/speech
namestringHuman-readable name

ElevenLabs-only fields

FieldTypeNotes
categorystringpremade, cloned, etc.
labelsobjectFilter facets — gender, age, accent, use case
preview_urlstringShort audio sample of the voice
descriptionstringFree-text description

MiniMax-only fields

FieldTypeNotes
descriptionstring[]Tags like ["Energetic", "English", "Female"]
The full ElevenLabs catalog is large (~100 KB JSON). For a picker UI, fetch once on mount and cache client-side. The MiniMax catalog is smaller (~300 voices) and trivial to ship inline.

Cache headers

HeaderWhat
X-Kyma-Cache: may-hitCatalog likely served from Redis (5-min TTL per provider)
X-Kyma-Cache: partial?provider=all — at least one provider returned, possibly cached, possibly fresh
X-Kyma-Cache: missNo Redis available; fetched fresh from upstream

Errors

StatusWhen
400provider query param value is not one of the allowed options
401Missing or invalid API key
502Upstream catalog endpoint unavailable. With ?provider=all, only returned when both providers fail — partial responses succeed with the available data.

Picking the right voice for your SKU

Speech SKUEligible voices
eleven-v3Any provider: "elevenlabs" voice
eleven-multilingual-v2Any provider: "elevenlabs" voice
eleven-flash-v2-5Any provider: "elevenlabs" voice
eleven-turbo-v2-5Any provider: "elevenlabs" voice
minimax-speech-hdAny provider: "minimax" voice + your own cloned or designed voices
minimax-speech-turboAny provider: "minimax" voice + your own cloned/designed voices

See also