Skip to main content
Custom voices let your organization create a reusable agent voice from a short audio sample. Creation is asynchronous: a new clone starts in queued, moves to processing, and finishes as either ready or failed.
Every endpoint on this page requires Authorization: Bearer sk_live_YOUR_API_KEY, except a signed preview URL. Resources are scoped to the organization associated with the credential.

Endpoints

Custom voice object

Request access and quota

Check policy

Check whether cloning is enabled and how many of your organization’s ThunderPhone custom voice slots are in use.
Response (200 OK)

Submit a quota request

Use the same flow to request initial access or a larger ThunderPhone limit. Only one request can be pending for an organization at a time.
Response (201 Created)

Check the latest request

Response (200 OK)
Returns 404 Not Found when the organization has never submitted a request.

Create a custom voice

Upload one WAV or MP3 file as multipart/form-data. The sample must contain 3–15 seconds of speech and be no larger than 4 MB. Use one language per clone, and only upload a voice you have the rights and consent to clone.
Response (202 Accepted)
The 202 Accepted response means the upload was queued, not that the voice is ready. Poll the clone detail until it reaches a terminal status, or subscribe to voice.ready and voice.failed for push notifications. The 403 response is:
The quota response includes current ThunderPhone usage and limit:

List and retrieve clones

List all non-deleted custom voices for the organization, newest first:
Response (200 OK)
Retrieve one clone with GET /v1/voices/clones/{public_id}. It returns the same custom voice object, or 404 Not Found if the voice does not exist, belongs to another organization, or was deleted.

Rename a clone

Only display_name can be changed. The agent-facing name, custom:<public_id>, stays stable.
Returns the updated custom voice object.

Delete a clone

Returns 204 No Content. Deletion is soft: the voice disappears from clone and catalog responses immediately and frees one ThunderPhone custom voice slot. A deleted voice can no longer be assigned to an agent.

Play the preview

A ready clone’s sample_url is a signed URL to: GET /v1/voices/clones/{public_id}/preview?sig={signature} It streams audio/mpeg without an Authorization header. You can also call the endpoint without sig while authenticated:
An unsigned, unauthenticated request—or one with an invalid or expired signature—returns 401 Unauthorized. A valid request returns 404 Not Found when the clone is not ready or has no stored preview.

Use a custom voice

Once status is ready, pass the clone’s name to an agent’s voice or draft_voice field:
The clone must be ready and owned by the agent’s organization. A clone from another organization, a non-ready clone, or a deleted clone is rejected. Ready custom voices also appear at the start of the voices array returned by GET /v1/voices:
The surcharges object is empty when the organization has no custom voice surcharge. You can filter the catalog with ?category=custom, ?languages=en, or ?gender=female.