Vozes
GET/v1/voices
Listar vozes (seus clones e as vozes genéricas escolhidas)
Resposta 200
| Nome | Tipo | Descrição |
|---|---|---|
data obrigatório | object[] | |
data[].id obrigatório | string | |
data[].name obrigatório | string | |
data[].kind obrigatório | "clone" | "generic" | |
data[].active obrigatório | boolean | |
data[].gender obrigatório | "male" | "female" | null | |
data[].status | "awaiting_consent" | "processing" | "ready" | "failed" | "revoked" | "expired" | Voices created through the API (consent flow). ready = usable in say. |
data[].consent_url | string | null | Send this link to the person whose voice it is. They sign in with the email of the request, read the consent sentence and record live. Shown while awaiting consent. |
data[].language | string | |
data[].person | object | |
data[].person.name obrigatório | string | |
data[].person.email obrigatório | string | Masked |
data[].failure_code | string | null | |
data[].expires_at | string | null | |
data[].created_at | string | |
data[].livemode | boolean |
Exemplo
curl "https://api.kanutus.com/v1/voices" \
-H "Authorization: Bearer $KANUTUS_API_KEY"const res = await fetch("https://api.kanutus.com/v1/voices", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.KANUTUS_API_KEY}`,
},
});
console.log(res.status, await res.json());import os, uuid, requests
r = requests.request(
"GET",
"https://api.kanutus.com/v1/voices",
headers={"Authorization": f"Bearer {os.environ['KANUTUS_API_KEY']}"},
)
print(r.status_code, r.json())Testar agora
Roda no seu navegador contra a API de verdade. Use uma chave kt_test_: nada é cobrado. A chave fica só nesta aba.
GET /v1/voicesRespostas por status
200 Voices
{
"data": [
{
"id": "string",
"name": "string",
"kind": "clone",
"active": true,
"gender": "male",
"status": "awaiting_consent",
"consent_url": "https://example.com",
"language": "string",
"person": {
"name": "string",
"email": "string"
},
"failure_code": "string",
"expires_at": "string",
"created_at": "string",
"livemode": true
}
]
}400 Invalid request
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 400,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}401 Missing, invalid, expired or revoked credential
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 401,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}403 Missing permission, blocked or not allowed
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 403,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 429,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}POST/v1/voices
Clonar uma voz com consentimento verificável: devolve um link para a pessoa ler a frase de consentimento e gravar ao vivo Em breve
Em produção responde 501 (em breve). Já dá para testar com uma chave kt_test_ (simulador).
Parâmetros
| Nome | Tipo | Descrição |
|---|---|---|
idempotency-key obrigatório | header · string | Unique key per create request; retries with the same key return the same result. |
Corpo da requisição
| Nome | Tipo | Descrição |
|---|---|---|
name obrigatório | string | length 1–60 |
language obrigatório | string | Language the person will read in (consent sentence: pt, en or es; others read in English). |
person obrigatório | object | |
person.name obrigatório | string | length 1–80 |
person.email obrigatório | string | The person signs in with this email to give consent and record. · length 0–254 |
Resposta 202
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | string | |
name obrigatório | string | |
kind obrigatório | "clone" | "generic" | |
active obrigatório | boolean | |
gender obrigatório | "male" | "female" | null | |
status | "awaiting_consent" | "processing" | "ready" | "failed" | "revoked" | "expired" | Voices created through the API (consent flow). ready = usable in say. |
consent_url | string | null | Send this link to the person whose voice it is. They sign in with the email of the request, read the consent sentence and record live. Shown while awaiting consent. |
language | string | |
person | object | |
person.name obrigatório | string | |
person.email obrigatório | string | Masked |
failure_code | string | null | |
expires_at | string | null | |
created_at | string | |
livemode | boolean |
Exemplo
curl -X POST "https://api.kanutus.com/v1/voices" \
-H "Authorization: Bearer $KANUTUS_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"name":"Ana (atendimento)","language":"pt","person":{"name":"Ana Ribeiro","email":"ana@vertice.com"}}'const res = await fetch("https://api.kanutus.com/v1/voices", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KANUTUS_API_KEY}`,
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json",
},
body: JSON.stringify({"name":"Ana (atendimento)","language":"pt","person":{"name":"Ana Ribeiro","email":"ana@vertice.com"}}),
});
console.log(res.status, await res.json());import os, uuid, requests
r = requests.request(
"POST",
"https://api.kanutus.com/v1/voices",
headers={"Authorization": f"Bearer {os.environ['KANUTUS_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={"name":"Ana (atendimento)","language":"pt","person":{"name":"Ana Ribeiro","email":"ana@vertice.com"}},
)
print(r.status_code, r.json())Testar agora
Roda no seu navegador contra a API de verdade. Use uma chave kt_test_: nada é cobrado. A chave fica só nesta aba.
POST /v1/voicesRespostas por status
202 Waiting for the person's consent (status awaiting_consent)
{
"id": "string",
"name": "string",
"kind": "clone",
"active": true,
"gender": "male",
"status": "awaiting_consent",
"consent_url": "https://example.com",
"language": "string",
"person": {
"name": "string",
"email": "string"
},
"failure_code": "string",
"expires_at": "string",
"created_at": "string",
"livemode": true
}400 Invalid request
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 400,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}401 Missing, invalid, expired or revoked credential
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 401,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}403 Missing permission, blocked or not allowed
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 403,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}409 Conflict (idempotency or state)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 409,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 429,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}501 Not available yet in live mode (use a kt_test_ key)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 501,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}GET/v1/voices/catalog
Vozes genéricas que você pode escolher (sem consentimento)
Resposta 200
| Nome | Tipo | Descrição |
|---|---|---|
data obrigatório | object[] | |
data[].id obrigatório | string | |
data[].name obrigatório | string | |
data[].gender obrigatório | "male" | "female" | |
data[].accent obrigatório | string | null | |
data[].description obrigatório | string | null | |
data[].preview_url obrigatório | string | null |
Exemplo
curl "https://api.kanutus.com/v1/voices/catalog" \
-H "Authorization: Bearer $KANUTUS_API_KEY"const res = await fetch("https://api.kanutus.com/v1/voices/catalog", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.KANUTUS_API_KEY}`,
},
});
console.log(res.status, await res.json());import os, uuid, requests
r = requests.request(
"GET",
"https://api.kanutus.com/v1/voices/catalog",
headers={"Authorization": f"Bearer {os.environ['KANUTUS_API_KEY']}"},
)
print(r.status_code, r.json())Testar agora
Roda no seu navegador contra a API de verdade. Use uma chave kt_test_: nada é cobrado. A chave fica só nesta aba.
GET /v1/voices/catalogRespostas por status
200 Catalog
{
"data": [
{
"id": "string",
"name": "string",
"gender": "male",
"accent": "string",
"description": "string",
"preview_url": "string"
}
]
}400 Invalid request
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 400,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}401 Missing, invalid, expired or revoked credential
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 401,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}403 Missing permission, blocked or not allowed
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 403,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 429,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}POST/v1/voices/generic
Escolher uma voz genérica do catálogo (entra nas suas vozes)
Corpo da requisição
| Nome | Tipo | Descrição |
|---|---|---|
voice_id obrigatório | string |
Resposta 200
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | string | |
name obrigatório | string | |
kind obrigatório | "clone" | "generic" | |
active obrigatório | boolean | |
gender obrigatório | "male" | "female" | null | |
status | "awaiting_consent" | "processing" | "ready" | "failed" | "revoked" | "expired" | Voices created through the API (consent flow). ready = usable in say. |
consent_url | string | null | Send this link to the person whose voice it is. They sign in with the email of the request, read the consent sentence and record live. Shown while awaiting consent. |
language | string | |
person | object | |
person.name obrigatório | string | |
person.email obrigatório | string | Masked |
failure_code | string | null | |
expires_at | string | null | |
created_at | string | |
livemode | boolean |
Exemplo
curl -X POST "https://api.kanutus.com/v1/voices/generic" \
-H "Authorization: Bearer $KANUTUS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"voice_id":"generic_EXAVITQu4vr4xnSDxMaL"}'const res = await fetch("https://api.kanutus.com/v1/voices/generic", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KANUTUS_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"voice_id":"generic_EXAVITQu4vr4xnSDxMaL"}),
});
console.log(res.status, await res.json());import os, uuid, requests
r = requests.request(
"POST",
"https://api.kanutus.com/v1/voices/generic",
headers={"Authorization": f"Bearer {os.environ['KANUTUS_API_KEY']}"},
json={"voice_id":"generic_EXAVITQu4vr4xnSDxMaL"},
)
print(r.status_code, r.json())Testar agora
Roda no seu navegador contra a API de verdade. Use uma chave kt_test_: nada é cobrado. A chave fica só nesta aba.
POST /v1/voices/genericRespostas por status
200 Chosen
{
"id": "string",
"name": "string",
"kind": "clone",
"active": true,
"gender": "male",
"status": "awaiting_consent",
"consent_url": "https://example.com",
"language": "string",
"person": {
"name": "string",
"email": "string"
},
"failure_code": "string",
"expires_at": "string",
"created_at": "string",
"livemode": true
}400 Invalid request
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 400,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}401 Missing, invalid, expired or revoked credential
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 401,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}403 Missing permission, blocked or not allowed
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 403,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}409 Conflict (idempotency or state)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 409,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 429,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}GET/v1/voices/{id}
Ler uma voz (e o status do consentimento)
Parâmetros
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | path · string |
Resposta 200
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | string | |
name obrigatório | string | |
kind obrigatório | "clone" | "generic" | |
active obrigatório | boolean | |
gender obrigatório | "male" | "female" | null | |
status | "awaiting_consent" | "processing" | "ready" | "failed" | "revoked" | "expired" | Voices created through the API (consent flow). ready = usable in say. |
consent_url | string | null | Send this link to the person whose voice it is. They sign in with the email of the request, read the consent sentence and record live. Shown while awaiting consent. |
language | string | |
person | object | |
person.name obrigatório | string | |
person.email obrigatório | string | Masked |
failure_code | string | null | |
expires_at | string | null | |
created_at | string | |
livemode | boolean |
Exemplo
curl "https://api.kanutus.com/v1/voices/kqz-mbdt-wpa" \
-H "Authorization: Bearer $KANUTUS_API_KEY"const res = await fetch("https://api.kanutus.com/v1/voices/kqz-mbdt-wpa", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.KANUTUS_API_KEY}`,
},
});
console.log(res.status, await res.json());import os, uuid, requests
r = requests.request(
"GET",
"https://api.kanutus.com/v1/voices/kqz-mbdt-wpa",
headers={"Authorization": f"Bearer {os.environ['KANUTUS_API_KEY']}"},
)
print(r.status_code, r.json())Testar agora
Roda no seu navegador contra a API de verdade. Use uma chave kt_test_: nada é cobrado. A chave fica só nesta aba.
GET /v1/voices/{id}Respostas por status
200 Voice
{
"id": "string",
"name": "string",
"kind": "clone",
"active": true,
"gender": "male",
"status": "awaiting_consent",
"consent_url": "https://example.com",
"language": "string",
"person": {
"name": "string",
"email": "string"
},
"failure_code": "string",
"expires_at": "string",
"created_at": "string",
"livemode": true
}400 Invalid request
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 400,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}401 Missing, invalid, expired or revoked credential
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 401,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}403 Missing permission, blocked or not allowed
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 403,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}404 Not found
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 404,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 429,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}DELETE/v1/voices/{id}
Apagar uma voz: revoga um clone consentido ou remove uma voz genérica escolhida
Parâmetros
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | path · string |
Resposta 200
| Nome | Tipo | Descrição |
|---|---|---|
id obrigatório | string | |
deleted obrigatório | true |
Exemplo
curl -X DELETE "https://api.kanutus.com/v1/voices/kqz-mbdt-wpa" \
-H "Authorization: Bearer $KANUTUS_API_KEY"const res = await fetch("https://api.kanutus.com/v1/voices/kqz-mbdt-wpa", {
method: "DELETE",
headers: {
Authorization: `Bearer ${process.env.KANUTUS_API_KEY}`,
},
});
console.log(res.status, await res.json());import os, uuid, requests
r = requests.request(
"DELETE",
"https://api.kanutus.com/v1/voices/kqz-mbdt-wpa",
headers={"Authorization": f"Bearer {os.environ['KANUTUS_API_KEY']}"},
)
print(r.status_code, r.json())Testar agora
Roda no seu navegador contra a API de verdade. Use uma chave kt_test_: nada é cobrado. A chave fica só nesta aba.
DELETE /v1/voices/{id}Respostas por status
200 Deleted
{
"id": "string",
"deleted": true
}400 Invalid request
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 400,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}401 Missing, invalid, expired or revoked credential
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 401,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}403 Missing permission, blocked or not allowed
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 403,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}404 Not found
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 404,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
{
"type": "https://docs.kanutus.com/errors",
"title": "<code>",
"status": 429,
"code": "<code>",
"message": "…",
"request_id": "req_…"
}