Voice Design (MiniMax)
curl --request POST \
--url https://kymaapi.com/v1/audio/voice-design \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"description": "<string>",
"model": "<string>",
"name": "<string>",
"preview_text": "<string>",
"gender": "<string>",
"age_group": "<string>"
}
'import requests
url = "https://kymaapi.com/v1/audio/voice-design"
payload = {
"description": "<string>",
"model": "<string>",
"name": "<string>",
"preview_text": "<string>",
"gender": "<string>",
"age_group": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
description: '<string>',
model: '<string>',
name: '<string>',
preview_text: '<string>',
gender: '<string>',
age_group: '<string>'
})
};
fetch('https://kymaapi.com/v1/audio/voice-design', 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/voice-design",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'description' => '<string>',
'model' => '<string>',
'name' => '<string>',
'preview_text' => '<string>',
'gender' => '<string>',
'age_group' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://kymaapi.com/v1/audio/voice-design"
payload := strings.NewReader("{\n \"description\": \"<string>\",\n \"model\": \"<string>\",\n \"name\": \"<string>\",\n \"preview_text\": \"<string>\",\n \"gender\": \"<string>\",\n \"age_group\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://kymaapi.com/v1/audio/voice-design")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"<string>\",\n \"model\": \"<string>\",\n \"name\": \"<string>\",\n \"preview_text\": \"<string>\",\n \"gender\": \"<string>\",\n \"age_group\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://kymaapi.com/v1/audio/voice-design")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"description\": \"<string>\",\n \"model\": \"<string>\",\n \"name\": \"<string>\",\n \"preview_text\": \"<string>\",\n \"gender\": \"<string>\",\n \"age_group\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyVoice Design (MiniMax)
Generate a synthesized voice profile from a natural-language description. No reference recording needed. Returns a voice_id usable in /v1/audio/speech.
POST
/
v1
/
audio
/
voice-design
Voice Design (MiniMax)
curl --request POST \
--url https://kymaapi.com/v1/audio/voice-design \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"description": "<string>",
"model": "<string>",
"name": "<string>",
"preview_text": "<string>",
"gender": "<string>",
"age_group": "<string>"
}
'import requests
url = "https://kymaapi.com/v1/audio/voice-design"
payload = {
"description": "<string>",
"model": "<string>",
"name": "<string>",
"preview_text": "<string>",
"gender": "<string>",
"age_group": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
description: '<string>',
model: '<string>',
name: '<string>',
preview_text: '<string>',
gender: '<string>',
age_group: '<string>'
})
};
fetch('https://kymaapi.com/v1/audio/voice-design', 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/voice-design",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'description' => '<string>',
'model' => '<string>',
'name' => '<string>',
'preview_text' => '<string>',
'gender' => '<string>',
'age_group' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://kymaapi.com/v1/audio/voice-design"
payload := strings.NewReader("{\n \"description\": \"<string>\",\n \"model\": \"<string>\",\n \"name\": \"<string>\",\n \"preview_text\": \"<string>\",\n \"gender\": \"<string>\",\n \"age_group\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://kymaapi.com/v1/audio/voice-design")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"<string>\",\n \"model\": \"<string>\",\n \"name\": \"<string>\",\n \"preview_text\": \"<string>\",\n \"gender\": \"<string>\",\n \"age_group\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://kymaapi.com/v1/audio/voice-design")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"description\": \"<string>\",\n \"model\": \"<string>\",\n \"name\": \"<string>\",\n \"preview_text\": \"<string>\",\n \"gender\": \"<string>\",\n \"age_group\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyVoice design is paused. As of 2026-09-12 no voice-design model is being served — no customer jobs in the preceding 30 days. The endpoint still exists; a request returns
404 model_not_found. Nothing was deleted. This page is no longer in the docs navigation; it records how the endpoint behaves.voice_id you can immediately use in /v1/audio/speech on any MiniMax voice model.
Use this when you don’t have voice talent, you’re prototyping a fictional character, or you want a brand-safe persona voice from scratch.
curl -X POST https://kymaapi.com/v1/audio/voice-design \
-H "Authorization: Bearer $KYMA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"description": "Warm female narrator with a slight British accent, mid-30s, calm cadence",
"gender": "female",
"age_group": "young"
}'
Request
application/json body.
string
required
Natural-language voice description. Max 1000 characters. Also accepts the alias
text.string
default:"minimax-voice-design"
Voice design SKU. Currently only
minimax-voice-design is supported.string
Optional human-readable label, max 64 chars.
string
Optional sample text MiniMax will render in the new voice for an internal preview. Max 500 characters. Doesn’t appear in the response — the audio bytes are not returned (you’d call
/v1/audio/speech afterward to render).string
Optional hint:
male or female.string
Optional hint:
child, young, middle-aged, or elderly.Response
200 OK JSON. Same shape as /v1/audio/voice-clone.
{
"voice_id": "kyma_a91f4d2e7c8b5301",
"name": null,
"model": "minimax-voice-design",
"cost_usd": 2.00,
"balance_usd": 48.00
}
Pricing
Flat $2.00 per designed voice, the same as a cloned voice. One-time charge — once designed, thevoice_id is reusable in unlimited TTS calls.
Ownership
Same gating as voice clone — designed voice IDs are owned by the requesting user. Sharing thevoice_id with another account is rejected with 403 voice_not_owned.
Errors
| Status | error.code | When |
|---|---|---|
400 | not_a_voice_design_model | model is not a design SKU |
400 | description_too_long | description > 1000 chars |
400 | invalid_request | missing description |
402 | insufficient_credits | balance below $2.00 |
500 | ownership_write_failed | design succeeded but ownership row insert failed |
502 | provider_error | upstream MiniMax failure |
See also
POST /v1/audio/voice-clone— clone from reference audio insteadPOST /v1/audio/speech— use the designed voice