Audio Voices
curl --request GET \
--url https://kymaapi.com/v1/audio/voices \
--header 'Authorization: Bearer <token>'import requests
url = "https://kymaapi.com/v1/audio/voices"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://kymaapi.com/v1/audio/voices', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://kymaapi.com/v1/audio/voices",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://kymaapi.com/v1/audio/voices"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://kymaapi.com/v1/audio/voices")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://kymaapi.com/v1/audio/voices")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodyEndpoints
Audio Voices
Browse the available voice library across both providers. Pick a voice_id for /v1/audio/speech.
GET
/
v1
/
audio
/
voices
Audio Voices
curl --request GET \
--url https://kymaapi.com/v1/audio/voices \
--header 'Authorization: Bearer <token>'import requests
url = "https://kymaapi.com/v1/audio/voices"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://kymaapi.com/v1/audio/voices', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://kymaapi.com/v1/audio/voices",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://kymaapi.com/v1/audio/voices"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://kymaapi.com/v1/audio/voices")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://kymaapi.com/v1/audio/voices")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodyRead-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
voice_id to POST /v1/audio/speech.
Voice ↔ model compatibility: ElevenLabsvoice_ids only work witheleven-*SKUs. MiniMaxvoice_ids only work withminimax-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
| Param | Values | Default | Notes |
|---|---|---|---|
provider | elevenlabs | minimax | all | elevenlabs | Which 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",
"category": "premade",
"description": ["Energetic", "English", "Female"]
}
]
}
Common fields
| Field | Type | Notes |
|---|---|---|
provider | "elevenlabs" | "minimax" | Which provider serves this voice |
voice_id | string | Opaque id — pass to /v1/audio/speech |
name | string | Human-readable name |
category | string | premade for a catalog voice, cloned for a voice your account created |
ElevenLabs-only fields
| Field | Type | Notes |
|---|---|---|
labels | object | Filter facets — gender, age, accent, use case |
preview_url | string | Short audio sample of the voice |
description | string | Free-text description |
MiniMax-only fields
| Field | Type | Notes |
|---|---|---|
description | string[] | Tags like ["Energetic", "English", "Female"]. Absent on your own cloned voices |
?provider=minimax (and all) also lists the voices your account created, first, with category: "cloned".
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
| Header | What |
|---|---|
X-Kyma-Cache: may-hit | Catalog likely served from Redis (5-min TTL per provider) |
X-Kyma-Cache: partial | ?provider=all — at least one provider returned, possibly cached, possibly fresh |
Errors
| Status | When |
|---|---|
400 | provider query param value is not one of the allowed options |
401 | Missing or invalid API key |
502 | Upstream 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 SKU | Eligible voices |
|---|---|
eleven-multilingual-v2 | Any provider: "elevenlabs" voice |
eleven-flash-v2-5 | Any provider: "elevenlabs" voice |
eleven-turbo-v2-5 | Any provider: "elevenlabs" voice |
minimax-speech-hd | Any provider: "minimax" voice + your own cloned or designed voices |
minimax-speech-turbo | Any provider: "minimax" voice + your own cloned/designed voices |
See also
POST /v1/audio/speech— use avoice_idfrom this list- Creating a voice (clone, design) is paused.