Voices
Voices: the library and your clones.
/v1/voicesList voices (the studio voices and your clones)
The studio voices first, then your organisation's clones, oldest first.
Query parameters
limitintegerPage size, 1-200 (default 50).
cursorstringThe
nextCursorof the previous page.kind"builtin" | "custom"builtin: the studio voices only; custom: your clones only.
gender"female" | "male"
Returns
200 A page of voices. A page: data is a list of Voice, and nextCursor fetches the next page.
Fields of data
idstringrequiredVoice id (
vo_…).pattern `^vo_.*`
namestringrequiredlanguagestringrequiredIts default language (a catalogue code).
languagesstring[]requiredThe languages this voice is promised in, as catalogue codes (GET /languages): every catalogue language for a studio voice, the ten marked for duos for a cloned voice. Set the language on the persona or the session, not by choosing another voice.
engine"premier" | "global"requiredThe voice engine a persona speaking with this voice runs on: global for the studio voices, premier for cloned voices.
genderstring | nullrequiredfemale or male for a studio voice; null when not known.
kind"builtin" | "custom"requiredbuiltin: a studio voice; custom: your organisation's clone.
createdAtstring (date-time)requiredISO 8601 UTC timestamp.
Errors
invalid_requestunauthorizedforbiddenupgrade_requiredrate_limitedserver_error
Request
curl "https://app.zentiqai.com/v1/voices?limit=20" \
-H "Authorization: Bearer $ZENTIQ_API_KEY"import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const page = await zentiq.listVoices({
limit: 20,
});import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
page = zentiq.list_voices(limit=20)Example answer
{
"data": [
{
"id": "vo_cmfq2b7x10000abcd1234",
"name": "Zoe",
"language": "en",
"languages": [
"en"
],
"engine": "premier",
"gender": "…"
}
],
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d",
"nextCursor": null
}/v1/voicesClone a voice
Send 10 to 60 seconds of clean speech as JSON (audioBase64), or as a multipart sample file. consent is required: whose voice it is and that they agreed (in multipart, a JSON string field). Without it the request is refused with 400 consent_required before anything is uploaded. The consent is kept as a consent record the organisation's owners can export and withdraw; withdrawing it retires the voice from new sessions. Cloning is a plan feature (403 upgrade_required).
Body
namestringDefault "My voice".
audioBase64stringrequired10 to 60 seconds of clean speech: base64, or a data:audio/… URI (25 MB at most).
formatstringThe sample's format when it isn't in the data URI.
Consent to clone a real person's voice or to make an avatar from their picture. Recorded with who confirmed it (the API key), when, a hashed IP address, the exact wording and its version. The organisation's owners can export records and withdraw them; a withdrawn voice or face stops starting new sessions.
Or a multipart/form-data upload:
namestringsamplestring (binary)requiredThe audio file: 10 to 60 seconds of clean speech, 25 MB at most.
consentstringrequiredThe Consent object as a JSON string.
Returns
201 The new voice. data is Voice.
Fields of data
idstringrequiredVoice id (
vo_…).pattern `^vo_.*`
namestringrequiredlanguagestringrequiredIts default language (a catalogue code).
languagesstring[]requiredThe languages this voice is promised in, as catalogue codes (GET /languages): every catalogue language for a studio voice, the ten marked for duos for a cloned voice. Set the language on the persona or the session, not by choosing another voice.
engine"premier" | "global"requiredThe voice engine a persona speaking with this voice runs on: global for the studio voices, premier for cloned voices.
genderstring | nullrequiredfemale or male for a studio voice; null when not known.
kind"builtin" | "custom"requiredbuiltin: a studio voice; custom: your organisation's clone.
createdAtstring (date-time)requiredISO 8601 UTC timestamp.
Errors
invalid_requestconsent_requiredconsent_invalidconsent_outdatedunauthorizedforbiddenupgrade_requiredidempotency_conflictidempotency_in_progresstoo_largerate_limitedserver_errorupstream_error
Events
Request
curl -X POST "https://app.zentiqai.com/v1/voices" \
-H "Authorization: Bearer $ZENTIQ_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"audioBase64": "…",
"consent": {
"attested": true,
"subject": "myself"
}
}'import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const result = await zentiq.createVoice({
audioBase64: "…",
consent: {
attested: true,
subject: "myself",
},
});import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
result = zentiq.create_voice({
"audioBase64": "…",
"consent": {
"attested": True,
"subject": "myself",
},
})Example answer
{
"data": {
"id": "vo_cmfq2b7x10000abcd1234",
"name": "Zoe",
"language": "en",
"languages": [
"en"
],
"engine": "premier",
"gender": "…"
},
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d"
}/v1/voices/{id}Get a voice
Path parameters
idstringrequiredVoice id (
vo_…); the id without its prefix is accepted too.
Returns
200 The voice. data is Voice.
Fields of data
idstringrequiredVoice id (
vo_…).pattern `^vo_.*`
namestringrequiredlanguagestringrequiredIts default language (a catalogue code).
languagesstring[]requiredThe languages this voice is promised in, as catalogue codes (GET /languages): every catalogue language for a studio voice, the ten marked for duos for a cloned voice. Set the language on the persona or the session, not by choosing another voice.
engine"premier" | "global"requiredThe voice engine a persona speaking with this voice runs on: global for the studio voices, premier for cloned voices.
genderstring | nullrequiredfemale or male for a studio voice; null when not known.
kind"builtin" | "custom"requiredbuiltin: a studio voice; custom: your organisation's clone.
createdAtstring (date-time)requiredISO 8601 UTC timestamp.
Errors
invalid_requestunauthorizedforbiddenupgrade_requirednot_foundgonerate_limitedserver_error
Request
curl "https://app.zentiqai.com/v1/voices/vo_123" \
-H "Authorization: Bearer $ZENTIQ_API_KEY"import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const result = await zentiq.getVoice("vo_123");import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
result = zentiq.get_voice("vo_123")Example answer
{
"data": {
"id": "vo_cmfq2b7x10000abcd1234",
"name": "Zoe",
"language": "en",
"languages": [
"en"
],
"engine": "premier",
"gender": "…"
},
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d"
}/v1/voices/{id}Delete a cloned voice
The voice stops being offered at once. Personas that speak with it keep it until they are given another voice; its recording is removed once no persona uses it. Studio voices can't be deleted.
Path parameters
idstringrequiredVoice id (
vo_…); the id without its prefix is accepted too.
Returns
200 Deleted. data is object.
Fields of data
deletedtruerequiredidstringrequiredVoice id (
vo_…).pattern `^vo_.*`
Errors
invalid_requestunauthorizedforbiddenupgrade_requirednot_foundrate_limitedserver_error
Request
curl -X DELETE "https://app.zentiqai.com/v1/voices/vo_123" \
-H "Authorization: Bearer $ZENTIQ_API_KEY"import { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY });
const result = await zentiq.deleteVoice("vo_123");import os
from zentiq import Zentiq
zentiq = Zentiq(api_key=os.environ["ZENTIQ_API_KEY"])
result = zentiq.delete_voice("vo_123")Example answer
{
"data": {
"deleted": true,
"id": "vo_cmfq2b7x10000abcd1234"
},
"error": null,
"requestId": "req_4f1c2e9a7b3d5e6f7a8b9c0d"
}