Text to synthesize for the preview.
Voice and TTS
List TTS voices, clone custom voices, and retrieve voice provider models through the Talkturo API — browse system and cloned voices, submit voice enrollment samples, and query supported TTS providers.
curl "https://app.talkturo.com/api/tts-voices?provider=all&accountId=9b9c8c1d-7c35-4f8a-8d5d-2e7a5c9d1123"
const response = await fetch(
"https://app.talkturo.com/api/tts-voices?provider=all&accountId=9b9c8c1d-7c35-4f8a-8d5d-2e7a5c9d1123"
);
const voices = await response.json();
console.log(voices);
[
{
"id": "c2d91f6d-7e2b-4d4f-8a5c-f7d264d6a2c0",
"provider": "elevenlabs",
"voice_id": "EXAVITQu4vr4xnSDxMaL",
"name": "Bella",
"description": "English female voice for conversational synthesis",
"language": "en",
"preview_url": "https://storage.talkturo.com/voices/previews/bella.mp3",
"metadata": {
"gender": "female",
"accent": "US"
},
"voice_model": "eleven_multilingual_v2",
"account_id": null,
"voice_type": "system"
},
{
"id": "8d9b11a9-0b0b-4ee7-b5da-c1d6c7ce0a45",
"provider": "dashscope",
"voice_id": "clone_7c8f3f1a",
"name": "Jane Sales Demo",
"description": "Cloned voice enrolled from account audio",
"language": "en",
"preview_url": null,
"metadata": {
"enrollment_status": "completed"
},
"voice_model": "cosyvoice-v1",
"account_id": "9b9c8c1d-7c35-4f8a-8d5d-2e7a5c9d1123",
"voice_type": "cloned"
}
]
{
"error": "Failed to list TTS voices"
}
curl -X POST "https://app.talkturo.com/api/voice-cloning" \
-H "Content-Type: application/json" \
-H "Cookie: sb-access-token=sample_session_cookie" \
-d '{
"accountId": "9b9c8c1d-7c35-4f8a-8d5d-2e7a5c9d1123",
"preferred_name": "Jane Sales Demo",
"language": "en",
"audio_base64": "UklGRiS3AABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YcS2AAB/f39/fn5+fn19fXx8fHt7e3p6enl5eXd3d3Z2dnV1dXV0dHRzc3NycnJxcXFwcHBvb29ubm5tbW1sbGxra2tqamppaWlo",
"audio_mime_type": "audio/wav"
}'
const response = await fetch("https://app.talkturo.com/api/voice-cloning", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
accountId: "9b9c8c1d-7c35-4f8a-8d5d-2e7a5c9d1123",
preferred_name: "Jane Sales Demo",
language: "en",
audio_base64: "UklGRiS3AABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YcS2AAB/f39/fn5+fn19fXx8fHt7e3p6enl5eXd3d3Z2dnV1dXV0dHRzc3NycnJxcXFwcHBvb29ubm5tbW1sbGxra2tqamppaWlo",
audio_mime_type: "audio/wav"
})
});
const result = await response.json();
console.log(result);
{
"success": true,
"voice": {
"id": "8d9b11a9-0b0b-4ee7-b5da-c1d6c7ce0a45",
"provider": "dashscope",
"voice_id": "clone_7c8f3f1a",
"name": "Jane Sales Demo",
"description": "Cloned voice enrolled from account audio",
"language": "en",
"preview_url": null,
"metadata": {
"enrollment_provider": "dashscope",
"preferred_name": "Jane Sales Demo"
},
"voice_model": "cosyvoice-v1",
"account_id": "9b9c8c1d-7c35-4f8a-8d5d-2e7a5c9d1123",
"voice_type": "cloned"
}
}
{
"error": "Missing required fields: accountId and audio_base64"
}
{
"error": "Forbidden"
}
{
"error": "DashScope voice enrollment failed"
}
{
"error": "DASHSCOPE_API_KEY is not configured"
}
{
"error": "Failed to save cloned voice"
}
curl "https://app.talkturo.com/api/voice-providers/models?provider=elevenlabs"
const response = await fetch(
"https://app.talkturo.com/api/voice-providers/models?provider=elevenlabs"
);
const models = await response.json();
console.log(models);
[
{
"id": "eleven_multilingual_v2",
"name": "Eleven Multilingual v2"
},
{
"id": "eleven_turbo_v2",
"name": "Eleven Turbo v2"
}
]
{
"error": "Unsupported provider"
}
curl "https://app.talkturo.com/api/voice-providers/voices?provider=cartesia"
const response = await fetch(
"https://app.talkturo.com/api/voice-providers/voices?provider=cartesia"
);
const voices = await response.json();
console.log(voices);
[
{
"id": "sonic-en-female-1",
"name": "Sonic English Female 1",
"description": "English conversational voice",
"previewUrl": "https://storage.talkturo.com/voices/previews/sonic-en-female-1.mp3",
"language": "en"
}
]
{
"error": "Provider is required"
}
Endpoint summary
| Method | Path | Purpose | Auth |
|---|---|---|---|
GET | /api/tts-voices | List system voices and optionally merge cloned voices for an account | Public |
POST | /api/voice-cloning | Create a cloned voice from an enrollment audio sample | Session cookie |
GET | /api/voice-providers/models | List supported models for a voice provider | Public |
GET | /api/voice-providers/voices | List provider voices from legacy providers | Public, deprecated |
GET | /api/voice-cloning | List cloned voices for an account | Session cookie |
DELETE | /api/voice-cloning/{voiceId} | Delete a cloned voice | Session cookie |
POST | /api/tts-voices/cartesia-preview | Generate a Cartesia voice preview | Session cookie |
POST | /api/tts-voices/dashscope-preview | Generate a DashScope voice preview | Session cookie |
POST | /api/tts-voices/inworld-preview | Generate an Inworld voice preview | Session cookie |
POST | /api/tts-voices/kugel-preview | Generate a Kugel voice preview | Session cookie |
POST | /api/tts-voices/gpt-live-preview | Generate a GPT Live voice preview | Session cookie |
GET | /api/voice-cloning/{voiceId} | Retrieve a single cloned voice | Session cookie |
PATCH | /api/voice-cloning/{voiceId} | Update a cloned voice | Session cookie |
GET /api/tts-voices, GET /api/voice-providers/models, and GET /api/voice-providers/voices do not require caller authentication. POST /api/voice-cloning requires a valid session cookie and verifies that your user belongs to the target account.
GET /api/voice-providers/voices is deprecated. Use GET /api/tts-voices for new integrations.
GET /api/tts-voices
List available TTS voices across Talkturo system voices and, when you provide an account ID, cloned voices owned by that account.
Query parameters
Filter voices by provider name. Pass all to return voices from every provider. If omitted, the endpoint returns the default unfiltered result set.
Account UUID used to merge cloned voices with system voices. Without accountId, the response only includes public system voices.
Response fields
Unique voice record ID in Talkturo.
Voice provider name such as elevenlabs, cartesia, or dashscope.
Provider-specific voice identifier used when generating speech.
Display name of the voice.
Short description of the voice. Some records may store an empty string or null.
Language code or provider language label for the voice.
Preview audio URL when the provider or stored record includes one. This field may be null.
Provider-specific metadata stored with the voice record.
Provider model associated with the voice.
Owning account UUID for cloned voices. System voices return null.
Voice origin. Values are system or cloned.
Error responses
| Status | Meaning |
|---|---|
500 | The server failed to fetch or assemble the voice list. |
POST /api/voice-cloning
Create a cloned voice by submitting an enrollment audio sample for an account you can access.
Request body
Account UUID that will own the cloned voice. The server checks that your authenticated user belongs to this account before creating the enrollment.
Display name to store for the cloned voice. If omitted, Talkturo uses the provider enrollment result or a server-defined fallback.
Language label to associate with the cloned voice.
Base64-encoded audio sample used for voice enrollment.
MIME type for the enrollment audio. Defaults to audio/wav.
Response fields
Returns true when the voice was enrolled and stored successfully.
Stored cloned voice record from tts_voices.
Unique voice record ID in Talkturo.
Provider used for enrollment. This flow submits voice cloning to DashScope.
Provider-specific ID for the enrolled cloned voice.
Stored display name for the cloned voice.
Description saved with the cloned voice record.
Language associated with the cloned voice.
Preview audio URL if available. This field may be null.
Provider enrollment details and Talkturo metadata stored with the voice.
Model name associated with the cloned voice.
Owning account UUID for the cloned voice.
Always cloned for this endpoint.
Error responses
| Status | Meaning |
|---|---|
400 | Missing required accountId or audio_base64. |
403 | Your session does not have access to the target account. |
502 | DashScope returned an upstream enrollment error. |
503 | The DashScope API key is not configured on the server. |
500 | Talkturo failed to insert the cloned voice into tts_voices. |
This endpoint expects a full base64-encoded audio payload in the request body. Large samples increase request size and can trigger upstream or gateway limits. Keep enrollment clips short and clean.
GET /api/voice-providers/models
List supported model IDs for a specific voice provider.
Query parameters
Voice provider to query. Supported values are elevenlabs, cartesia, dashscope, inworld, kugel, and fish.
elevenlabscartesiadashscopeinworldkugelfishResponse fields
Provider model ID.
Human-readable model name.
Error responses
| Status | Meaning |
|---|---|
400 | The provider query parameter is missing or not supported. |
GET /api/voice-providers/voices
List legacy provider voice catalogs for supported providers.
Query parameters
Legacy provider catalog to query. Supported values are elevenlabs and cartesia.
elevenlabscartesiaResponse fields
Provider voice ID.
Voice display name.
Voice description when the provider includes one.
Preview audio URL when available.
Voice language label when available.
Error responses
| Status | Meaning |
|---|---|
400 | The provider query parameter is missing or invalid. |
List cloned voices
Retrieve cloned voices for a specific account. Requires an authenticated session and account membership.
Endpoint
GET /api/voice-cloning
Query parameters
Account UUID to list cloned voices for.
Response fields
Array of cloned voice records. Each record includes id, provider, voice_id, name, description, language, preview_url, metadata, voice_model, account_id, and voice_type, which is always cloned.
Delete a cloned voice
Remove a cloned voice by its ID. The voice is removed from both Talkturo and the provider when applicable.
Endpoint
DELETE /api/voice-cloning/{voiceId}
Path parameters
The ID of the cloned voice to delete.
Response fields
Returns true when the cloned voice is deleted.
Get a cloned voice
Retrieve a single cloned voice by its ID.
Endpoint
GET /api/voice-cloning/{voiceId}
Path parameters
The ID of the cloned voice to retrieve.
Response fields
Returns true when the cloned voice is found.
The cloned voice record, including id, provider, voice_id, name, description, language, preview_url, metadata, voice_model, account_id, and voice_type.
Update a cloned voice
Update one or more fields on an existing cloned voice.
Endpoint
PATCH /api/voice-cloning/{voiceId}
Path parameters
The ID of the cloned voice to update.
Body parameters
Updated display name for the cloned voice.
Updated description for the cloned voice.
Response fields
Returns true when the cloned voice is updated.
The updated cloned voice record.
Voice previews
Generate preview audio for specific TTS providers. All preview endpoints require session authentication and return an audio response or a URL to the generated preview audio.
| Method | Path | Provider |
|---|---|---|
POST | /api/tts-voices/cartesia-preview | Cartesia |
POST | /api/tts-voices/dashscope-preview | DashScope |
POST | /api/tts-voices/inworld-preview | Inworld |
POST | /api/tts-voices/kugel-preview | Kugel/Fish |
POST | /api/tts-voices/gpt-live-preview | GPT Live |
Each preview endpoint accepts a voice ID and preview text in the request body, generates a short audio sample, and returns the preview audio. Use these endpoints to let users audition voices before assigning them to an assistant.
Common body parameters
Provider-specific voice ID to preview.
Common response
URL to the generated preview audio file, or the audio data directly depending on the provider.