Skip to main content

Voice Cloning

Create custom voices from audio samples — instantly from a single recording, or as a deep clone fine-tuned on a training dataset — then share them across your company and use them as any agent's voice.

All paths on this page are relative to https://api.autessa.com/autessa_poweruser/voice. Every request is a POST with a JSON body, and every ID is an opaque string. See the Poweruser API overview for authentication and conventions.


Instant clones vs deep clones​

There are two ways to clone a voice, with different quality/effort trade-offs and separate company entitlements:

If the relevant entitlement is missing, the create call returns a 400 with "Voice cloning is not enabled for this company" (instant) or "Voice fine-tuning is not enabled for this company" (deep).

A deep clone moves through these statuses: PENDING (dataset created) → UPLOADING (samples being added) → TRAINING (fine-tune running) → COMPLETED or FAILED.

Once an instant clone is created or a deep clone completes, the voice appears under customVoiceNames in the voice options returned by the Agents API and can be set as an agent's voiceConfig.voiceName.

Both clone types use the platform-wide sharing model. Endpoints enforce the linked user's access level on the clone:

OperationRequired access
get, get-all, get-status, get-sharing-detailsAny access (READ or higher)
upload-files, start-finetuneWRITE or ADMIN
share, delete, transfer-ownershipADMIN

POST/voice/generate-audio-upload-link

Returns a pre-signed S3 URL for uploading a WAV voice sample. Upload the file with an HTTP PUT to uploadUrl (with Content-Type: audio/wav), then pass the returned s3Uri as the sample reference to /instant-clone/create or /deep-clone/upload-files.

Request one link per file — each call returns a unique upload destination.

Request parameters​

None — send an empty object {} (WAV format is currently fixed).

Response​

  • Name
    uploadUrl
    Type
    string
    Description

    Pre-signed URL; PUT the file bytes here with Content-Type: audio/wav.

  • Name
    s3Uri
    Type
    string
    Description

    S3 URI referencing the uploaded file. Pass this to the clone endpoints.

  • Name
    expiresInSeconds
    Type
    integer
    Description

    How long the upload URL stays valid (currently 600 — ten minutes).

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

curl https://api.autessa.com/autessa_poweruser/voice/generate-audio-upload-link \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{}'

# Then upload the sample:
curl -X PUT "$UPLOAD_URL" \
-H "Content-Type: audio/wav" \
--data-binary '@voice-sample.wav'
Response
{
"uploadUrl": "https://s3.amazonaws.com/autessa-voice/...",
"s3Uri": "s3://autessa-voice/voice-clones/audio/prod/1234/8f3a2b.wav",
"expiresInSeconds": 600,
"errors": []
}

Create an instant clone​

POST/voice/instant-clone/create

Creates a voice clone from a single uploaded WAV sample. The clone is created synchronously — the response already carries the provider voice ID and the voice is immediately usable. New clones start PRIVATE; use /instant-clone/share to grant access.

Requires the company's voice cloning entitlement; without it the call returns a 400 with "Voice cloning is not enabled for this company".

Request parameters​

  • Name
    voiceName
    Type
    string
    Description

    Display name for the voice. Must be non-blank.

  • Name
    audioS3Uri
    Type
    string
    Description

    S3 URI of the uploaded WAV sample, from /generate-audio-upload-link.

Response​

  • Name
    voiceCloneId
    Type
    string
    Description

    The new instant clone's ID.

  • Name
    voiceName
    Type
    string
    Description

    The stored display name.

  • Name
    serviceVoiceId
    Type
    string
    Description

    The underlying speech provider's voice identifier.

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

curl https://api.autessa.com/autessa_poweruser/voice/instant-clone/create \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"voiceName": "Support Narrator",
"audioS3Uri": "s3://autessa-voice/voice-clones/audio/prod/1234/8f3a2b.wav"
}'
Response
{
"voiceCloneId": "V1StGXR8Z5",
"voiceName": "Support Narrator",
"serviceVoiceId": "a0e99841-438c-4a64-b679-ae501e7d6091",
"errors": []
}

Get an instant clone​

POST/voice/instant-clone/get

Retrieves a single instant clone, including its sharing state and the calling user's access level. Requires any access to the clone.

Request parameters​

  • Name
    instantVoiceCloneId
    Type
    string
    Description

    The instant clone to fetch.

Response​

  • Name
    voiceCloneId
    Type
    string
    Description

    The clone's ID.

  • Name
    voiceName
    Type
    string
    Description

    Display name.

  • Name
    serviceVoiceId
    Type
    string
    Description

    The speech provider's voice identifier.

  • Name
    sharingLevel
    Type
    string
    Description

    PRIVATE, SPECIFIC_MEMBER, or COMPANY.

  • Name
    companyPermissionLevel
    Type
    string
    Description

    Access level granted company-wide, when sharingLevel is COMPANY: READ, WRITE, PUBLISH, or ADMIN.

  • Name
    userAccessLevel
    Type
    string
    Description

    The calling user's effective access level on this clone.

  • Name
    createdAt
    Type
    string
    Description

    ISO-8601 creation timestamp.

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

cURL
curl https://api.autessa.com/autessa_poweruser/voice/instant-clone/get \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "instantVoiceCloneId": "V1StGXR8Z5" }'
Response
{
"voiceCloneId": "V1StGXR8Z5",
"voiceName": "Support Narrator",
"serviceVoiceId": "a0e99841-438c-4a64-b679-ae501e7d6091",
"sharingLevel": "PRIVATE",
"companyPermissionLevel": null,
"userAccessLevel": "ADMIN",
"createdAt": "2026-06-28T17:42:10",
"errors": []
}

List all instant clones​

POST/voice/instant-clone/get-all

Lists every instant clone visible to the linked user, grouped by how they have access.

Request parameters​

None — send an empty object {}.

Response​

Each entry is a summary with id, voiceName, serviceVoiceId, sharingLevel, and createdAt.

  • Name
    ownedClones
    Type
    array<VoiceCloneSummary>
    Description

    Instant clones the linked user owns.

  • Name
    companySharedClones
    Type
    array<VoiceCloneSummary>
    Description

    Clones shared with the whole company by other users.

  • Name
    sharedWithMeClones
    Type
    array<VoiceCloneSummary>
    Description

    Clones shared specifically with the linked user.

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

cURL
curl https://api.autessa.com/autessa_poweruser/voice/instant-clone/get-all \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{}'
Response
{
"ownedClones": [
{
"id": "V1StGXR8Z5",
"voiceName": "Support Narrator",
"serviceVoiceId": "a0e99841-438c-4a64-b679-ae501e7d6091",
"sharingLevel": "PRIVATE",
"createdAt": "2026-06-28T17:42:10"
}
],
"companySharedClones": [],
"sharedWithMeClones": [],
"errors": []
}

Delete an instant clone​

POST/voice/instant-clone/delete

Permanently deletes an instant clone. Agents configured to use the voice fall back to their built-in voice.

Requires ADMIN access on the clone.

Request parameters​

  • Name
    instantVoiceCloneId
    Type
    string
    Description

    The instant clone to delete.

Response​

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

cURL
curl https://api.autessa.com/autessa_poweruser/voice/instant-clone/delete \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "instantVoiceCloneId": "V1StGXR8Z5" }'
Response
{
"errors": []
}

Share an instant clone​

POST/voice/instant-clone/share

Sets the clone's sharing level and grants per-user access. When shareLevel is SPECIFIC_MEMBER, userIds and permissionLevels are parallel arrays — the user at index i receives the permission at index i (defaulting to READ when permissionLevels is shorter or omitted).

Requires ADMIN access on the clone.

Request parameters​

  • Name
    instantVoiceCloneId
    Type
    string
    Description

    The instant clone to share.

  • Name
    shareLevel
    Type
    string
    Description

    PRIVATE, SPECIFIC_MEMBER, or COMPANY.

  • Name
    companyPermissionLevel
    Type
    string
    Description

    When shareLevel is COMPANY, the access level every company member gets: READ, WRITE, PUBLISH, or ADMIN.

  • Name
    userIds
    Type
    array<string>
    Description

    When shareLevel is SPECIFIC_MEMBER, the users to grant access to.

  • Name
    permissionLevels
    Type
    array<string>
    Description

    Access level for each entry in userIds, positionally matched. Missing entries default to READ.

Response​

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

cURL
curl https://api.autessa.com/autessa_poweruser/voice/instant-clone/share \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"instantVoiceCloneId": "V1StGXR8Z5",
"shareLevel": "SPECIFIC_MEMBER",
"userIds": ["uB7nT2wQ9k"],
"permissionLevels": ["READ"]
}'
Response
{
"errors": []
}

Get instant clone sharing details​

POST/voice/instant-clone/get-sharing-details

Returns the clone's current sharing configuration and the calling user's own access level. Requires any access to the clone.

Request parameters​

  • Name
    instantVoiceCloneId
    Type
    string
    Description

    The instant clone to inspect.

Response​

  • Name
    sharingLevel
    Type
    string
    Description

    PRIVATE, SPECIFIC_MEMBER, or COMPANY.

  • Name
    companyPermissionLevel
    Type
    string
    Description

    Access level granted company-wide, when sharingLevel is COMPANY.

  • Name
    sharedWith
    Type
    array<UserShare>
    Description

    Per-user grants: userEmail, userId (string), accessLevel.

  • Name
    userAccessLevel
    Type
    string
    Description

    The calling user's effective access level.

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

cURL
curl https://api.autessa.com/autessa_poweruser/voice/instant-clone/get-sharing-details \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "instantVoiceCloneId": "V1StGXR8Z5" }'
Response
{
"sharingLevel": "SPECIFIC_MEMBER",
"companyPermissionLevel": null,
"sharedWith": [
{
"userEmail": "sam@acme.com",
"userId": "uB7nT2wQ9k",
"accessLevel": "READ"
}
],
"userAccessLevel": "ADMIN",
"errors": []
}

Transfer instant clone ownership​

POST/voice/instant-clone/transfer-ownership

Transfers the clone to another member of the company. Requires ADMIN access on the clone.

Request parameters​

  • Name
    instantVoiceCloneId
    Type
    string
    Description

    The instant clone to transfer.

  • Name
    newOwnerId
    Type
    string
    Description

    User ID of the new owner.

Response​

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

cURL
curl https://api.autessa.com/autessa_poweruser/voice/instant-clone/transfer-ownership \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"instantVoiceCloneId": "V1StGXR8Z5",
"newOwnerId": "uB7nT2wQ9k"
}'
Response
{
"errors": []
}

Create a deep clone dataset​

POST/voice/deep-clone/create-dataset

Starts a deep clone by creating its training dataset. The new clone starts in status PENDING with sharing level PRIVATE. Next, add samples with /deep-clone/upload-files.

Requires the company's voice fine-tuning entitlement; without it the call returns a 400 with "Voice fine-tuning is not enabled for this company".

Request parameters​

  • Name
    voiceName
    Type
    string
    Description

    Display name for the voice. Must be non-blank.

Response​

  • Name
    voiceCloneId
    Type
    string
    Description

    The new deep clone's ID. Use it as deepVoiceCloneId in the rest of the deep-clone endpoints.

  • Name
    datasetId
    Type
    string
    Description

    The speech provider's dataset identifier.

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

curl https://api.autessa.com/autessa_poweruser/voice/deep-clone/create-dataset \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "voiceName": "Brand Voice" }'
Response
{
"voiceCloneId": "dV7kM3pQ9w",
"datasetId": "ds_4f8c1a2b9d",
"errors": []
}

Upload files to a dataset​

POST/voice/deep-clone/upload-files

Adds WAV training samples to the clone's dataset and moves the clone to status UPLOADING. Upload each sample first via /generate-audio-upload-link and pass the resulting S3 URIs. If any upload fails, the clone is marked FAILED and the message is returned in errors.

Requires WRITE or ADMIN access on the clone, and that the dataset exists ("Dataset not created yet" otherwise).

Request parameters​

  • Name
    deepVoiceCloneId
    Type
    string
    Description

    The deep clone whose dataset to fill.

  • Name
    audioS3Uris
    Type
    array<string>
    Description

    S3 URIs of the uploaded WAV samples.

Response​

  • Name
    filesUploaded
    Type
    integer
    Description

    Number of files added to the dataset in this call.

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

curl https://api.autessa.com/autessa_poweruser/voice/deep-clone/upload-files \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"deepVoiceCloneId": "dV7kM3pQ9w",
"audioS3Uris": [
"s3://autessa-voice/voice-clones/audio/prod/1234/8f3a2b.wav",
"s3://autessa-voice/voice-clones/audio/prod/1234/2c9d7e.wav"
]
}'
Response
{
"filesUploaded": 2,
"errors": []
}

Start a fine-tune​

POST/voice/deep-clone/start-finetune

Kicks off fine-tuning on the clone's dataset and moves the clone to status TRAINING. Training is asynchronous — poll /deep-clone/get-status until it reports COMPLETED (or FAILED). If the fine-tune cannot be started, the clone is marked FAILED with the message in errors.

Requires WRITE or ADMIN access on the clone, and that the dataset exists.

Request parameters​

  • Name
    deepVoiceCloneId
    Type
    string
    Description

    The deep clone to train.

Response​

  • Name
    fineTuneJobId
    Type
    string
    Description

    The speech provider's fine-tune job identifier.

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

cURL
curl https://api.autessa.com/autessa_poweruser/voice/deep-clone/start-finetune \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "deepVoiceCloneId": "dV7kM3pQ9w" }'
Response
{
"fineTuneJobId": "ft_9c2e5b7a1d",
"errors": []
}

Get fine-tune status​

POST/voice/deep-clone/get-status

Returns the clone's training status. While the clone is still in progress (PENDING, UPLOADING, TRAINING) this endpoint live-polls the speech provider and updates the stored progress; once the clone is COMPLETED or FAILED the cached result is returned without polling. On completion, serviceVoiceId is populated and the voice becomes usable.

Requires any access to the clone.

Request parameters​

  • Name
    deepVoiceCloneId
    Type
    string
    Description

    The deep clone to check.

Response​

  • Name
    status
    Type
    string
    Description

    PENDING, UPLOADING, TRAINING, COMPLETED, or FAILED.

  • Name
    progress
    Type
    integer
    Description

    Training progress, 0–100.

  • Name
    serviceVoiceId
    Type
    string
    Description

    The speech provider's voice identifier. Populated once training completes; null before that.

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

curl https://api.autessa.com/autessa_poweruser/voice/deep-clone/get-status \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "deepVoiceCloneId": "dV7kM3pQ9w" }'
Response
{
"status": "TRAINING",
"progress": 62,
"serviceVoiceId": null,
"errors": []
}

List all deep clones​

POST/voice/deep-clone/get-all

Lists every deep clone visible to the linked user, grouped by how they have access.

Request parameters​

None — send an empty object {}.

Response​

Each entry is a summary with id, voiceName, serviceVoiceId, status, progress, sharingLevel, and createdAt.

  • Name
    ownedClones
    Type
    array<DeepVoiceCloneSummary>
    Description

    Deep clones the linked user owns.

  • Name
    companySharedClones
    Type
    array<DeepVoiceCloneSummary>
    Description

    Clones shared with the whole company by other users.

  • Name
    sharedWithMeClones
    Type
    array<DeepVoiceCloneSummary>
    Description

    Clones shared specifically with the linked user.

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

cURL
curl https://api.autessa.com/autessa_poweruser/voice/deep-clone/get-all \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{}'
Response
{
"ownedClones": [
{
"id": "dV7kM3pQ9w",
"voiceName": "Brand Voice",
"serviceVoiceId": "b1f88932-527d-4b75-c78a-bf612e8e7182",
"status": "COMPLETED",
"progress": 100,
"sharingLevel": "COMPANY",
"createdAt": "2026-06-25T11:08:44"
}
],
"companySharedClones": [],
"sharedWithMeClones": [],
"errors": []
}

Get a deep clone​

POST/voice/deep-clone/get

Fetches a single deep clone. This returns the same status payload as /deep-clone/get-status — status, progress, and serviceVoiceId — including the same live provider poll while training is in progress.

Requires any access to the clone.

Request parameters​

  • Name
    deepVoiceCloneId
    Type
    string
    Description

    The deep clone to fetch.

Response​

  • Name
    status
    Type
    string
    Description

    PENDING, UPLOADING, TRAINING, COMPLETED, or FAILED.

  • Name
    progress
    Type
    integer
    Description

    Training progress, 0–100.

  • Name
    serviceVoiceId
    Type
    string
    Description

    The speech provider's voice identifier, once training completes.

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

cURL
curl https://api.autessa.com/autessa_poweruser/voice/deep-clone/get \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "deepVoiceCloneId": "dV7kM3pQ9w" }'
Response
{
"status": "COMPLETED",
"progress": 100,
"serviceVoiceId": "b1f88932-527d-4b75-c78a-bf612e8e7182",
"errors": []
}

Share a deep clone​

POST/voice/deep-clone/share

Sets the clone's sharing level and grants per-user access — same semantics as sharing an instant clone: with SPECIFIC_MEMBER, userIds and permissionLevels are positionally matched arrays, defaulting to READ.

Requires ADMIN access on the clone.

Request parameters​

  • Name
    deepVoiceCloneId
    Type
    string
    Description

    The deep clone to share.

  • Name
    shareLevel
    Type
    string
    Description

    PRIVATE, SPECIFIC_MEMBER, or COMPANY.

  • Name
    companyPermissionLevel
    Type
    string
    Description

    When shareLevel is COMPANY, the access level every company member gets: READ, WRITE, PUBLISH, or ADMIN.

  • Name
    userIds
    Type
    array<string>
    Description

    When shareLevel is SPECIFIC_MEMBER, the users to grant access to.

  • Name
    permissionLevels
    Type
    array<string>
    Description

    Access level for each entry in userIds, positionally matched. Missing entries default to READ.

Response​

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

cURL
curl https://api.autessa.com/autessa_poweruser/voice/deep-clone/share \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"deepVoiceCloneId": "dV7kM3pQ9w",
"shareLevel": "COMPANY",
"companyPermissionLevel": "READ"
}'
Response
{
"errors": []
}

Get deep clone sharing details​

POST/voice/deep-clone/get-sharing-details

Returns the clone's current sharing configuration and the calling user's own access level. Requires any access to the clone.

Request parameters​

  • Name
    deepVoiceCloneId
    Type
    string
    Description

    The deep clone to inspect.

Response​

  • Name
    sharingLevel
    Type
    string
    Description

    PRIVATE, SPECIFIC_MEMBER, or COMPANY.

  • Name
    companyPermissionLevel
    Type
    string
    Description

    Access level granted company-wide, when sharingLevel is COMPANY.

  • Name
    sharedWith
    Type
    array<UserShare>
    Description

    Per-user grants: userEmail, userId (string), accessLevel.

  • Name
    userAccessLevel
    Type
    string
    Description

    The calling user's effective access level.

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

cURL
curl https://api.autessa.com/autessa_poweruser/voice/deep-clone/get-sharing-details \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "deepVoiceCloneId": "dV7kM3pQ9w" }'
Response
{
"sharingLevel": "COMPANY",
"companyPermissionLevel": "READ",
"sharedWith": [],
"userAccessLevel": "ADMIN",
"errors": []
}

Transfer deep clone ownership​

POST/voice/deep-clone/transfer-ownership

Transfers the clone to another member of the company. Requires ADMIN access on the clone.

Request parameters​

  • Name
    deepVoiceCloneId
    Type
    string
    Description

    The deep clone to transfer.

  • Name
    newOwnerId
    Type
    string
    Description

    User ID of the new owner.

Response​

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

cURL
curl https://api.autessa.com/autessa_poweruser/voice/deep-clone/transfer-ownership \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"deepVoiceCloneId": "dV7kM3pQ9w",
"newOwnerId": "uB7nT2wQ9k"
}'
Response
{
"errors": []
}

Delete a deep clone​

POST/voice/deep-clone/delete

Permanently deletes a deep clone, whatever its training status. Agents configured to use the voice fall back to their built-in voice.

Requires ADMIN access on the clone.

Request parameters​

  • Name
    deepVoiceCloneId
    Type
    string
    Description

    The deep clone to delete.

Response​

  • Name
    errors
    Type
    array<string>
    Description

    Error messages, if any occurred.

cURL
curl https://api.autessa.com/autessa_poweruser/voice/deep-clone/delete \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "deepVoiceCloneId": "dV7kM3pQ9w" }'
Response
{
"errors": []
}

Errors​

StatusWhen
200Success — check errors for validation messages.
400Feature gating or validation: voice cloning / fine-tuning not enabled for the company, blank voiceName, missing audioS3Uri, or dataset not created yet.
401The linked user lacks the required access level (see the access table).
403Scoped key without the endpoint in its allow-list.
404Voice clone not found.
408Unexpected server error; errors contains the message.
500Speech-provider call failed (clone creation, dataset upload, fine-tune start, or status poll); errors contains the message.

Failures during /deep-clone/upload-files or /deep-clone/start-finetune also mark the clone FAILED, which is then reported by /deep-clone/get-status.