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:
- Instant clones are created synchronously from a single WAV sample in one
/instant-clone/createcall. Available when voice cloning is enabled for the company. - Deep clones are fine-tuned voice models trained on a dataset of samples.
They follow a three-step lifecycle —
/deep-clone/create-dataset, then/deep-clone/upload-files, then/deep-clone/start-finetune— and train asynchronously. Poll/deep-clone/get-statusuntil the clone reachesCOMPLETED. Available only when voice fine-tuning is enabled for the company (a separate, higher-tier entitlement).
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:
| Operation | Required access |
|---|---|
get, get-all, get-status, get-sharing-details | Any access (READ or higher) |
upload-files, start-finetune | WRITE or ADMIN |
share, delete, transfer-ownership | ADMIN |
Generate an audio upload link
/voice/generate-audio-upload-linkReturns 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;
PUTthe file bytes here withContent-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
- JavaScript
- Python
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'
const response = await fetch(
'https://api.autessa.com/autessa_poweruser/voice/generate-audio-upload-link',
{
method: 'POST',
headers: {
'Authorization': process.env.POWERUSER_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({})
}
);
const { uploadUrl, s3Uri } = await response.json();
// Upload the WAV bytes
await fetch(uploadUrl, {
method: 'PUT',
headers: { 'Content-Type': 'audio/wav' },
body: wavFileBytes
});
import os
import requests
response = requests.post(
'https://api.autessa.com/autessa_poweruser/voice/generate-audio-upload-link',
headers={'Authorization': os.environ['POWERUSER_KEY']},
json={}
)
link = response.json()
with open('voice-sample.wav', 'rb') as f:
requests.put(
link['uploadUrl'],
headers={'Content-Type': 'audio/wav'},
data=f
)
s3_uri = link['s3Uri']
{
"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
/voice/instant-clone/createCreates 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
- JavaScript
- Python
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"
}'
const response = await fetch(
'https://api.autessa.com/autessa_poweruser/voice/instant-clone/create',
{
method: 'POST',
headers: {
'Authorization': process.env.POWERUSER_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
voiceName: 'Support Narrator',
audioS3Uri: 's3://autessa-voice/voice-clones/audio/prod/1234/8f3a2b.wav'
})
}
);
const { voiceCloneId } = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/autessa_poweruser/voice/instant-clone/create',
headers={'Authorization': os.environ['POWERUSER_KEY']},
json={
'voiceName': 'Support Narrator',
'audioS3Uri': 's3://autessa-voice/voice-clones/audio/prod/1234/8f3a2b.wav'
}
)
voice_clone_id = response.json()['voiceCloneId']
{
"voiceCloneId": "V1StGXR8Z5",
"voiceName": "Support Narrator",
"serviceVoiceId": "a0e99841-438c-4a64-b679-ae501e7d6091",
"errors": []
}
Get an instant clone
/voice/instant-clone/getRetrieves 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, orCOMPANY.
- Name
companyPermissionLevel- Type
- string
- Description
Access level granted company-wide, when
sharingLevelisCOMPANY:READ,WRITE,PUBLISH, orADMIN.
- 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 https://api.autessa.com/autessa_poweruser/voice/instant-clone/get \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "instantVoiceCloneId": "V1StGXR8Z5" }'
{
"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
/voice/instant-clone/get-allLists 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 https://api.autessa.com/autessa_poweruser/voice/instant-clone/get-all \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{}'
{
"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
/voice/instant-clone/deletePermanently 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 https://api.autessa.com/autessa_poweruser/voice/instant-clone/delete \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "instantVoiceCloneId": "V1StGXR8Z5" }'
{
"errors": []
}
Share an instant clone
/voice/instant-clone/shareSets 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, orCOMPANY.
- Name
companyPermissionLevel- Type
- string
- Description
When
shareLevelisCOMPANY, the access level every company member gets:READ,WRITE,PUBLISH, orADMIN.
- Name
userIds- Type
- array<string>
- Description
When
shareLevelisSPECIFIC_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 toREAD.
Response
- Name
errors- Type
- array<string>
- Description
Error messages, if any occurred.
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"]
}'
{
"errors": []
}
Get instant clone sharing details
/voice/instant-clone/get-sharing-detailsReturns 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, orCOMPANY.
- Name
companyPermissionLevel- Type
- string
- Description
Access level granted company-wide, when
sharingLevelisCOMPANY.
- 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 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" }'
{
"sharingLevel": "SPECIFIC_MEMBER",
"companyPermissionLevel": null,
"sharedWith": [
{
"userEmail": "sam@acme.com",
"userId": "uB7nT2wQ9k",
"accessLevel": "READ"
}
],
"userAccessLevel": "ADMIN",
"errors": []
}
Transfer instant clone ownership
/voice/instant-clone/transfer-ownershipTransfers 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 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"
}'
{
"errors": []
}
Create a deep clone dataset
/voice/deep-clone/create-datasetStarts 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
deepVoiceCloneIdin 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
- JavaScript
- Python
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" }'
const response = await fetch(
'https://api.autessa.com/autessa_poweruser/voice/deep-clone/create-dataset',
{
method: 'POST',
headers: {
'Authorization': process.env.POWERUSER_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({ voiceName: 'Brand Voice' })
}
);
const { voiceCloneId } = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/autessa_poweruser/voice/deep-clone/create-dataset',
headers={'Authorization': os.environ['POWERUSER_KEY']},
json={'voiceName': 'Brand Voice'}
)
voice_clone_id = response.json()['voiceCloneId']
{
"voiceCloneId": "dV7kM3pQ9w",
"datasetId": "ds_4f8c1a2b9d",
"errors": []
}
Upload files to a dataset
/voice/deep-clone/upload-filesAdds 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
- JavaScript
- Python
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"
]
}'
const response = await fetch(
'https://api.autessa.com/autessa_poweruser/voice/deep-clone/upload-files',
{
method: 'POST',
headers: {
'Authorization': process.env.POWERUSER_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
deepVoiceCloneId: 'dV7kM3pQ9w',
audioS3Uris: [
's3://autessa-voice/voice-clones/audio/prod/1234/8f3a2b.wav',
's3://autessa-voice/voice-clones/audio/prod/1234/2c9d7e.wav'
]
})
}
);
const { filesUploaded } = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/autessa_poweruser/voice/deep-clone/upload-files',
headers={'Authorization': os.environ['POWERUSER_KEY']},
json={
'deepVoiceCloneId': 'dV7kM3pQ9w',
'audioS3Uris': [
's3://autessa-voice/voice-clones/audio/prod/1234/8f3a2b.wav',
's3://autessa-voice/voice-clones/audio/prod/1234/2c9d7e.wav'
]
}
)
files_uploaded = response.json()['filesUploaded']
{
"filesUploaded": 2,
"errors": []
}
Start a fine-tune
/voice/deep-clone/start-finetuneKicks 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 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" }'
{
"fineTuneJobId": "ft_9c2e5b7a1d",
"errors": []
}
Get fine-tune status
/voice/deep-clone/get-statusReturns 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, orFAILED.
- Name
progress- Type
- integer
- Description
Training progress,
0–100.
- Name
serviceVoiceId- Type
- string
- Description
The speech provider's voice identifier. Populated once training completes;
nullbefore that.
- Name
errors- Type
- array<string>
- Description
Error messages, if any occurred.
- cURL
- JavaScript
- Python
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" }'
async function waitForClone(deepVoiceCloneId) {
while (true) {
const response = await fetch(
'https://api.autessa.com/autessa_poweruser/voice/deep-clone/get-status',
{
method: 'POST',
headers: {
'Authorization': process.env.POWERUSER_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({ deepVoiceCloneId })
}
);
const data = await response.json();
if (data.status === 'COMPLETED' || data.status === 'FAILED') {
return data;
}
await new Promise((r) => setTimeout(r, 30_000));
}
}
import os
import time
import requests
def wait_for_clone(deep_voice_clone_id):
while True:
response = requests.post(
'https://api.autessa.com/autessa_poweruser/voice/deep-clone/get-status',
headers={'Authorization': os.environ['POWERUSER_KEY']},
json={'deepVoiceCloneId': deep_voice_clone_id}
)
data = response.json()
if data['status'] in ('COMPLETED', 'FAILED'):
return data
time.sleep(30)
{
"status": "TRAINING",
"progress": 62,
"serviceVoiceId": null,
"errors": []
}
List all deep clones
/voice/deep-clone/get-allLists 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 https://api.autessa.com/autessa_poweruser/voice/deep-clone/get-all \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{}'
{
"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
/voice/deep-clone/getFetches 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, orFAILED.
- 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 https://api.autessa.com/autessa_poweruser/voice/deep-clone/get \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "deepVoiceCloneId": "dV7kM3pQ9w" }'
{
"status": "COMPLETED",
"progress": 100,
"serviceVoiceId": "b1f88932-527d-4b75-c78a-bf612e8e7182",
"errors": []
}
Share a deep clone
/voice/deep-clone/shareSets 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, orCOMPANY.
- Name
companyPermissionLevel- Type
- string
- Description
When
shareLevelisCOMPANY, the access level every company member gets:READ,WRITE,PUBLISH, orADMIN.
- Name
userIds- Type
- array<string>
- Description
When
shareLevelisSPECIFIC_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 toREAD.
Response
- Name
errors- Type
- array<string>
- Description
Error messages, if any occurred.
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"
}'
{
"errors": []
}
Get deep clone sharing details
/voice/deep-clone/get-sharing-detailsReturns 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, orCOMPANY.
- Name
companyPermissionLevel- Type
- string
- Description
Access level granted company-wide, when
sharingLevelisCOMPANY.
- 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 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" }'
{
"sharingLevel": "COMPANY",
"companyPermissionLevel": "READ",
"sharedWith": [],
"userAccessLevel": "ADMIN",
"errors": []
}
Transfer deep clone ownership
/voice/deep-clone/transfer-ownershipTransfers 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 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"
}'
{
"errors": []
}
Delete a deep clone
/voice/deep-clone/deletePermanently 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 https://api.autessa.com/autessa_poweruser/voice/deep-clone/delete \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "deepVoiceCloneId": "dV7kM3pQ9w" }'
{
"errors": []
}
Errors
| Status | When |
|---|---|
200 | Success — check errors for validation messages. |
400 | Feature gating or validation: voice cloning / fine-tuning not enabled for the company, blank voiceName, missing audioS3Uri, or dataset not created yet. |
401 | The linked user lacks the required access level (see the access table). |
403 | Scoped key without the endpoint in its allow-list. |
404 | Voice clone not found. |
408 | Unexpected server error; errors contains the message. |
500 | Speech-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.