Voices
The Voices endpoints of the Kenso API.
List the voices this workspace can use
/v1/voicesvoices.listNeeds the linkedin_voice_notes feature on your workspace. Until it is on, calls answer 404.
Deepgram's generally available voices, ElevenLabs stock voices and the workspace's imported ElevenLabs voices, never early-access voices. This is a catalogue, not a cursor API: pagination.nextCursor is null and pagination.hasMore is false. provider is deepgram or elevenlabs; language is a language (fr, every French locale) or a locale (fr-CA), and a multilingual voice (multi, every ElevenLabs voice) matches every language; includeImported defaults to true. sampleUrl is a presigned URL valid for one hour. Any workspace member.
Parameters
404 where the path exists only in this version. A date that is not a version answers 400 unsupported_version; any other value that is not a version is treated as legacy.400 workspace_required).Response 200
data is a list of VoiceModel. Each item has these fields. The response also carries pagination.
curl -X GET "https://api.ken.so/v1/voices" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 1.1" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": [
{
"provider": "string",
"voiceId": "string",
"name": "string",
"family": "string",
"language": "string",
"languageName": "string",
"accent": "string",
"gender": "string",
"age": "string",
"traits": [
"string"
],
"earlyAccess": true,
"imported": true,
"featured": true,
"sampleUrl": "https://example.com"
}
],
"pagination": {
"nextCursor": "eyJpZCI6ODE1fQ",
"hasMore": true,
"total": 1,
"isTotalCapped": true
}
}Import a voice from the workspace's ElevenLabs account
/v1/voicesvoices.importNeeds the linkedin_voice_notes feature on your workspace. Until it is on, calls answer 404.
Body { provider: "elevenlabs", voiceId, rightsConfirmed: true }. rightsConfirmed must be true: the caller confirms the workspace has the rights to use the voice. Kenso checks the voice is on the workspace's ElevenLabs account right now. Answers 201 with the catalog item, or 200 when it was already imported. A removed voice can be imported again. 400 for a bad field, 404 when the voice is not on the account, 409 provider_key_missing, 502 provider_rejected. Needs the integrations feature; never a Client seat.
Parameters
404 where the path exists only in this version. A date that is not a version answers 400 unsupported_version; any other value that is not a version is treated as legacy.400 workspace_required).Request body
application/json, optional.
Response 201
Also answers 200. data is a VoiceModel.
curl -X POST "https://api.ken.so/v1/voices" \
-H "Authorization: Bearer $KEN_API_KEY" \
-H "Ken-Version: 1.1" \
-H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID" \
-H "Content-Type: application/json" \
-d '{
"provider": "string",
"voiceId": "string",
"rightsConfirmed": true
}'{
"success": true,
"data": {
"provider": "string",
"voiceId": "string",
"name": "string",
"family": "string",
"language": "string",
"languageName": "string",
"accent": "string",
"gender": "string",
"age": "string",
"traits": [
"string"
],
"earlyAccess": true,
"imported": true,
"featured": true,
"sampleUrl": "https://example.com"
}
}List the voices on the workspace's own ElevenLabs account that it can import
/v1/voices/importablevoices.list-importableNeeds the linkedin_voice_notes feature on your workspace. Until it is on, calls answer 404.
Needs the workspace's ElevenLabs key (Settings, Integrations): 409 provider_key_missing without one, 502 provider_rejected when ElevenLabs refuses it. Stock voices are left out: they are in GET /v1/voices already. imported marks voices this workspace already imported. Needs the integrations feature; never a Client seat.
Parameters
404 where the path exists only in this version. A date that is not a version answers 400 unsupported_version; any other value that is not a version is treated as legacy.400 workspace_required).Response 200
data is a list of ImportableVoiceModel. Each item has these fields. The response also carries pagination.
curl -X GET "https://api.ken.so/v1/voices/importable" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 1.1" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": [
{
"voiceId": "string",
"name": "string",
"category": "string",
"labels": {
"key": "string"
},
"previewUrl": "https://example.com",
"imported": true
}
],
"pagination": {
"nextCursor": "eyJpZCI6ODE1fQ",
"hasMore": true,
"total": 1,
"isTotalCapped": true
}
}Remove an imported voice from this workspace
/v1/voices/{provider}/{voiceId}voices.removeNeeds the linkedin_voice_notes feature on your workspace. Until it is on, calls answer 404.
Answers 204, or 404 when the voice is not imported here. Sequence steps that use it keep their settings; their notes fail with voice_removed and the step sends its text instead. Needs the integrations feature; never a Client seat.
Parameters
404 where the path exists only in this version. A date that is not a version answers 400 unsupported_version; any other value that is not a version is treated as legacy.400 workspace_required).Response 204
curl -X DELETE "https://api.ken.so/v1/voices/string/string" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 1.1" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
HTTP/1.1 204 No Content