One recording in, a voice out. POST /v3/models/audio/voices with "mode": "instant" returns a voice_id that is usually ACTIVE within seconds. No training and no voice clone slot.
Set up with an agent
Not technical? Paste this into Claude Code, Codex, or Cursor and it walks you through every step on this page in your own terminal.Prompt for your agent
1. Create the voice
Upload the recording and pass itsasset_id, or send a public HTTPS URL or base64 audio. The call returns 202 Accepted. Free-plan workspaces can make 20 clone calls per rolling 24 hours by default, shared by all members.
voice_id. The full field list is in the API reference. Fields worth knowing:
audiotakes exactly one recording.nameis 1–64 characters, andlanguageis detected from the recording when omitted (see Languages).similaritysets how closely the voice follows the recording:medium,high,extra_high(default) ormax.remove_background_noise(defaulttrue) removes background noise, not room echo.imageis a JPEG, PNG or WebP of the speaker in their setting, and the voice takes on the ambience of its background: a quiet room keeps it clean, and a busy street adds matching background sound. Send it withoutgenderorage, which are otherwise detected from the recording.
audio/mpeg or audio/wav for inline data. OGG is supported through a public audio URL; audio/ogg inline data and OGG assets are not accepted.
About the recording: about 1 minute of clear speech gives the best voice, and only the first 3 minutes are used. A file can be up to 100 MiB, or 16 MB after decoding for inline base64. A URL must point at the audio file itself and download within 30 seconds; HeyGen fetches it after returning 202, and a fetch failure ends the voice FAILED with INVALID_AUDIO. A silent recording fails. Record in a quiet room without echo: the voice keeps the room sound of the recording, and keeps more of it at extra_high and max than at medium.
An instant voice cannot be retrained. To change it, create a new one.
Idempotency-Key is optional. Reusing a key within 24 hours returns the first response, and a duplicate that arrives while the first is still being accepted returns 409 request_in_progress. Without the header, each retry creates a new voice.
2. Wait until it is ACTIVE
PollGET /v3/models/audio/voices/{voice_id} until status is ACTIVE or FAILED. PENDING means HeyGen is checking and cleaning the recording. FAILED is final, and failure_reason says why:
A voice created without
language has no language field until HeyGen detects it. A failed voice stays in the list as FAILED until you delete it.
Wait for ACTIVE before you generate speech. A speech request for a PENDING voice returns 409 voice_not_ready: keep polling, and send it once the voice is ACTIVE.
3. Generate speech
Once the voice isACTIVE, pass it to Text to Speech. POST /v3/models/audio/tts returns one 44.1 kHz WAV; POST /v3/models/audio/tts/stream streams audio parts over Server-Sent Events from the same body. To speak a recording again in the voice instead, use Speech to Speech.
An instant voice takes expressiveness_boost and audio tags; it ignores the professional-only seed, speed, pitch_shift and pitch_variance, and a <break> tag returns 400 invalid_parameter. See request fields.
Languages
Cloning and speech support the same languages. See Supported languages.Manage voices
GET /v3/models/audio/voices lists the workspace’s instant and professional voices, newest first; mode tells them apart. Paging and type=public are on Voices. Any workspace can read and speak a public voice, but not delete it.
Each ACTIVE voice in the list and in GET /v3/models/audio/voices/{voice_id} has a preview_audio_url: a WAV of the voice reading a short fixed preview script in its language, about 15 seconds. The URL can expire, so read the voice again rather than storing it. It is null while a voice is not ACTIVE.
DELETE /v3/models/audio/voices/{voice_id} deletes a voice. Deleting an instant voice that is still PENDING cancels it.
Errors
Speech errors are on Text to Speech. The full catalog is in Error Codes.

