Skip to main content
POST
cURL
Creates a new voice AI agent. Returns HTTP 201 with { "agent_id": "...", "state": "created", "version_id": "..." }.
The quickest path is creating an agent in the dashboard (Auto Build) and copying its ID. Use the API when you need to programmatically provision agents at scale or integrate agent creation into your deployment pipeline.

Minimal example

The smallest body that produces a working English conversation agent:
Minimal request body
201 Response

Supported providers

tools_config wires four pluggable components. The provider value on the transcriber, synthesizer and input/output blocks is validated at creation time — anything outside the lists below is rejected with 400 Invalid value for provider:'<value>' provided.

LLM

Set on tools_config.llm_agent.llm_config.provider. Ten more are accepted and routed through LiteLLM using that vendor’s own model ids, without a dedicated reference page: groq, cohere, together, fireworks, deepinfra, perplexity, anyscale, ollama, vllm, ola.
The LLM provider is not checked against a fixed list at creation time, unlike the transcriber and synthesizer. An unroutable provider or model is accepted by POST /v2/agent and only fails once a call runs, so verify it against the table above.

Transcriber

Set on tools_config.transcriber.provider. model and language are validated as a pair — an unsupported combination returns 400 Provided language: <language> is not available for the model: <model>.
language takes a plain ISO 639-1 code for every provider, including Sarvam: send "language": "hi". "hi-IN" is rejected, even though Sarvam’s own API uses locale codes — Bolna resolves them for you.
Keyword weights are not carried through. keywords accepts the dashboard’s word:boost form, but the boost is stripped before storage: "Bolna:100,Acme:50,Zeta" is persisted as "Bolna,Acme,Zeta". The terms themselves still apply. Deepgram sends them as keyterm on nova-3 and Flux and as keywords on nova-2 and earlier, and Sarvam reads them on saaras:v4 only. See provider support for every provider that reads this field and its limits.

Synthesizer

Set on tools_config.synthesizer.provider. Resolve a valid model + voice_id pair with List TTS providers and List voices before creating the agent — the voice catalog changes over time, and availability varies by language and by whether you have connected your own provider key.
language inside provider_config is required for most providers — cartesia, sarvam, smallest, rime, azuretts, gemini, soniox and polly. Leaving it out fails with 400 Tools Config > Voice > Language: This field is required, even though the agent already has a transcriber language. elevenlabs, deepgram and openai do not take it at all, and it is optional on maya (defaults to en) and kalpa.

Telephony

Set on tools_config.input.provider and tools_config.output.provider. twilio, plivo, exotel, vobiz and sip-trunk are the telephony providers. Use wav as the format for twilio, plivo, exotel and vobiz, and ulaw for sip-trunk — Twilio and sip-trunk stream mulaw audio, the rest linear16. See Supported telephony providers. The enum also accepts freeswitch, used for web calling (linear16, 16 kHz in / 24 kHz out), and default and database, which are internal.
To mix providers per language in one agent — for example Deepgram + Cartesia for English and ElevenLabs + Sarvam for Hindi — use multilingual_config. See the Multilingual Config Reference.
To replace the transcriber, LLM and synthesizer with a single realtime model, set tools_config.s2s and leave the other three null. See Speech-to-Speech.

Common 400 errors

Next steps

After creating an agent, place a call with POST /call using the returned agent_id. See the API Quickstart for a complete end-to-end example.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Body

application/json

Creates a new agent

agent_config
object
required

Configuration of the agent

agent_prompts
object
required

Prompts to be provided to the agent. It can have multiple tasks of the form task_<task_id>

Response

agent created response

agent_id
string<uuid>
state
enum<string>
Available options:
created
Example:

"created"

version_id
string<uuid>

Id of the initial version created alongside the agent. Use it with the agent version APIs to pin or roll back a configuration.

Example:

"7e775357-d9d3-4c82-a7d7-b7c3346caf79"