Skip to main content
Vapi is a platform for building voice agents. Kova plugs in as a custom voice: Vapi sends each utterance to a Kova endpoint and plays back the audio Kova returns.

Configure your assistant

Set your assistant’s voice to Vapi’s custom-voice provider, pointed at the Kova Vapi endpoint with your chosen voice and API key.
  • url: the Kova Vapi endpoint. Set the voice query parameter to any speaker id from /v1/tts/speakers (for example cal).
  • headers.x-api-key: your Kova API key from platform.kova.ai. Vapi sends it on every request; Kova validates and bills it.
Each Vapi voice maps to one Kova speaker. To offer multiple voices, create one custom-voice config per speaker, changing the voice query parameter.

How it works

Vapi POSTs a voice-request for each utterance:
Kova synthesizes the text and returns raw headerless 16-bit mono little-endian PCM at the requested sample rate as application/octet-stream — not JSON, and not base64. sampleRate accepts any value from 8000 to 48000 Hz, which covers all of Vapi’s standard rates (8000, 16000, 22050, 24000). Omitting sampleRate is accepted and falls back to a default. A sampleRate outside 8000–48000 returns 422 ("Input should be greater than or equal to 8000" / "less than or equal to 48000"), and an unknown voice returns 422 with an unknown_voice body listing every valid id.
Only message.type == "voice-request" synthesizes. Other Vapi message types — status-update, end-of-call-report, transcript — are acknowledged with an empty 200 and no body, which is what Vapi expects.
The voice query parameter is required — omitting it returns 422 with {"detail":[{"loc":["query","voice"],"msg":"Field required"}]}.

Billing and errors

Usage is billed to the API key in the x-api-key header, the same as direct API calls. An invalid key returns 401; an account out of credits returns 402. Top up at platform.kova.ai/dashboard/billing.