---
title: "Create Voice"
method: POST
path: "/v2/voices"
tags: ["Voices"]
---

# Create Voice

`POST /v2/voices`

## Request

- Base URL: `https://tavusapi.com`
- URL: `https://tavusapi.com/v2/voices`
- Auth: API key in header `x-api-key`

Creates a voice from a sample of audio and returns immediately with `status: "started"`.

**A new voice can take up to a few minutes to be ready.** Cloning runs after this call returns, so the voice cannot speak yet and a conversation that references it will not resolve a voice. Wait for `status` to reach `completed`, in one of two ways:

- **Pass `callback_url`** and Tavus posts an `application.voice_status_changed` event once the status settles, carrying `voice_id`, `voice_name`, and `status`. On `error` it also carries `error_message`. The payload is a state snapshot, so a duplicate delivery is safe to apply twice.
- **Poll [Get Voice](/api-reference/voices/get-voice)** if you would rather not receive a webhook.

`completed` means the voice can speak. It stays `completed` while Tavus continues preparing the remaining languages, so you do not need to wait for those.

Once ready, use the `voice_id` as `layers.tts.voice_id` on a PAL, or as a face's `default_voice_id`.

Most teams create and audition voices in [PAL Maker](https://maker.tavus.io/dev/voices/create), where you can hear the result before shipping it. See [Voices](/sections/conversational-video-interface/voices).

You must hold the rights to the voice in your training audio.

## Request body

- object
  - `voice_name` string, required: A name for the voice.
  - `training_audio_url` string, required: Publicly accessible link to the training audio. Accepts `.mp3`, `.wav`, `.m4a`, `.flac`, `.ogg`, `.oga`, `.webm`, `.mp4`, `.mov`, a video file is fine, the audio track is what is used.
  - `description` string: Free-text note about the voice, returned on reads.
  - `callback_url` string: URL to receive the `application.voice_status_changed` webhook when the voice reaches `completed` or `error`.
  - `tags` string[]: Up to 50 tags, 64 characters each. Filter on them with the `tag` query parameter on List Voices.

## Response `200`

- Voice: A Tavus Voice. Reference it by `voice_id`; Tavus picks the provider that is the best fit for the language(s) of the conversation.
  - `voice_id` string: Stable identifier. Use as `layers.tts.voice_id` on a PAL, or `default_voice_id` on a face.
  - `voice_name` string
  - `description` string, nullable
  - `voice_type` 'user' | 'system': `user` for voices you created, `system` for the Tavus catalog.
  - `status` 'started' | 'completed' | 'error': `started` while the voice is still being created, `completed` once it is ready to use, `error` if creation failed (see `error_message`).
  - `error_message` string: Present only when `status` is `error`.
  - `tags` string[]
  - `created_at` string, date-time

## Other responses

- `400`: BAD REQUEST
- `401`: UNAUTHORIZED
- `429`: TOO MANY REQUESTS

## Changes

- **2026-11-03** `932c24e63be2`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/tavus/apis/tavus-developer-api-collection/changes/v2/voices/post.md)

---

[API](https://skmtc.dev/tavus/apis/tavus-developer-api-collection.md) - [All operations](https://skmtc.dev/tavus/apis/tavus-developer-api-collection/llms.txt) - [OpenAPI document](https://skmtc.dev/tavus/apis/tavus-developer-api-collection/revisions/932c24e63be2?raw)
