KanutusDocs
kanutus.com Sign in / Create accountSign in

Voices

GET/v1/voices

List voices: consented clones of the organization, your own clones and your chosen generic voices

Permission: voices:read

Response 200

NameTypeDescription
data requiredobject[]
data[].id requiredstring
data[].name requiredstring
data[].kind required"clone" | "generic"
data[].active requiredboolean
data[].gender required"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_urlstring | nullSend 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[].languagestring
data[].personobject
data[].person.name requiredstring
data[].person.email requiredstringMasked
data[].failure_codestring | null
data[].expires_atstring | null
data[].created_atstring
data[].livemodeboolean

Example

curl
curl "https://api.kanutus.com/v1/voices" \
  -H "Authorization: Bearer $KANUTUS_API_KEY"
Try it

Runs from your browser against the real API. Use a kt_test_ key: nothing is charged. The key stays in this tab only.

GET /v1/voices

Responses by status

200 Voices
200
{
  "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
400 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 400,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

401 Missing, invalid, expired or revoked credential
401 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 401,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

403 Missing permission, blocked or not allowed
403 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 403,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
429 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 429,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

POST/v1/voices

Clone a voice with verifiable consent: returns a link the person opens to read the consent sentence and record live Soon

Permission: voices:clone

Live mode answers 501 coming soon. Try it now with a kt_test_ key (simulator).

Parameters

NameTypeDescription
idempotency-key requiredheader · stringUnique key per create request; retries with the same key return the same result.

Request body

NameTypeDescription
name requiredstringlength 1–60
language requiredstringLanguage the person will read in (consent sentence: pt, en or es; others read in English).
person requiredobject
person.name requiredstringlength 1–80
person.email requiredstringThe person signs in with this email to give consent and record. · length 0–254

Response 202

NameTypeDescription
id requiredstring
name requiredstring
kind required"clone" | "generic"
active requiredboolean
gender required"male" | "female" | null
status"awaiting_consent" | "processing" | "ready" | "failed" | "revoked" | "expired"Voices created through the API (consent flow). ready = usable in say.
consent_urlstring | nullSend 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.
languagestring
personobject
person.name requiredstring
person.email requiredstringMasked
failure_codestring | null
expires_atstring | null
created_atstring
livemodeboolean

Example

curl
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"}}'
Try it

Runs from your browser against the real API. Use a kt_test_ key: nothing is charged. The key stays in this tab only.

POST /v1/voices

Responses by status

202 Waiting for the person's consent (status awaiting_consent)
202
{
  "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
400 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 400,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

401 Missing, invalid, expired or revoked credential
401 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 401,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

403 Missing permission, blocked or not allowed
403 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 403,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

409 Conflict (idempotency or state)
409 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 409,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
429 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 429,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

501 Not available yet in live mode (use a kt_test_ key)
501 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 501,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

GET/v1/voices/catalog

Generic voices you can choose (no consent needed)

Permission: voices:read

Response 200

NameTypeDescription
data requiredobject[]
data[].id requiredstring
data[].name requiredstring
data[].gender required"male" | "female"
data[].accent requiredstring | null
data[].description requiredstring | null
data[].preview_url requiredstring | null

Example

curl
curl "https://api.kanutus.com/v1/voices/catalog" \
  -H "Authorization: Bearer $KANUTUS_API_KEY"
Try it

Runs from your browser against the real API. Use a kt_test_ key: nothing is charged. The key stays in this tab only.

GET /v1/voices/catalog

Responses by status

200 Catalog
200
{
  "data": [
    {
      "id": "string",
      "name": "string",
      "gender": "male",
      "accent": "string",
      "description": "string",
      "preview_url": "string"
    }
  ]
}
400 Invalid request
400 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 400,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

401 Missing, invalid, expired or revoked credential
401 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 401,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

403 Missing permission, blocked or not allowed
403 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 403,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
429 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 429,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

POST/v1/voices/generic

Choose a generic voice from the catalog (adds it to your voices)

Permission: voices:write

Request body

NameTypeDescription
voice_id requiredstring

Response 200

NameTypeDescription
id requiredstring
name requiredstring
kind required"clone" | "generic"
active requiredboolean
gender required"male" | "female" | null
status"awaiting_consent" | "processing" | "ready" | "failed" | "revoked" | "expired"Voices created through the API (consent flow). ready = usable in say.
consent_urlstring | nullSend 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.
languagestring
personobject
person.name requiredstring
person.email requiredstringMasked
failure_codestring | null
expires_atstring | null
created_atstring
livemodeboolean

Example

curl
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"}'
Try it

Runs from your browser against the real API. Use a kt_test_ key: nothing is charged. The key stays in this tab only.

POST /v1/voices/generic

Responses by status

200 Chosen
200
{
  "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
400 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 400,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

401 Missing, invalid, expired or revoked credential
401 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 401,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

403 Missing permission, blocked or not allowed
403 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 403,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

409 Conflict (idempotency or state)
409 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 409,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
429 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 429,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

GET/v1/voices/{id}

Get a voice (and its consent status)

Permission: voices:read

Parameters

NameTypeDescription
id requiredpath · string

Response 200

NameTypeDescription
id requiredstring
name requiredstring
kind required"clone" | "generic"
active requiredboolean
gender required"male" | "female" | null
status"awaiting_consent" | "processing" | "ready" | "failed" | "revoked" | "expired"Voices created through the API (consent flow). ready = usable in say.
consent_urlstring | nullSend 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.
languagestring
personobject
person.name requiredstring
person.email requiredstringMasked
failure_codestring | null
expires_atstring | null
created_atstring
livemodeboolean

Example

curl
curl "https://api.kanutus.com/v1/voices/kqz-mbdt-wpa" \
  -H "Authorization: Bearer $KANUTUS_API_KEY"
Try it

Runs from your browser against the real API. Use a kt_test_ key: nothing is charged. The key stays in this tab only.

GET /v1/voices/{id}

Responses by status

200 Voice
200
{
  "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
400 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 400,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

401 Missing, invalid, expired or revoked credential
401 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 401,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

403 Missing permission, blocked or not allowed
403 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 403,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

404 Not found
404 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 404,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
429 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 429,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

DELETE/v1/voices/{id}

Delete a voice: revokes a consented clone or removes a chosen generic voice

Permission: voices:write

Parameters

NameTypeDescription
id requiredpath · string

Response 200

NameTypeDescription
id requiredstring
deleted requiredtrue

Example

curl
curl -X DELETE "https://api.kanutus.com/v1/voices/kqz-mbdt-wpa" \
  -H "Authorization: Bearer $KANUTUS_API_KEY"
Try it

Runs from your browser against the real API. Use a kt_test_ key: nothing is charged. The key stays in this tab only.

DELETE /v1/voices/{id}

Responses by status

200 Deleted
200
{
  "id": "string",
  "deleted": true
}
400 Invalid request
400 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 400,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

401 Missing, invalid, expired or revoked credential
401 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 401,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

403 Missing permission, blocked or not allowed
403 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 403,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

404 Not found
404 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 404,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
429 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 429,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes