curl --request POST \
--url https://api.aireserve.com/v1/custom-voices \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form 'name=<string>' \
--form 'language=<string>' \
--form file='@example-file' \
--form consent_attestation=true \
--form 'description=<string>' \
--form 'accent=<string>'import requests
url = "https://api.aireserve.com/v1/custom-voices"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"name": "<string>",
"language": "<string>",
"consent_attestation": "true",
"description": "<string>",
"accent": "<string>"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('name', '<string>');
form.append('language', '<string>');
form.append('file', '<string>');
form.append('consent_attestation', 'true');
form.append('description', '<string>');
form.append('accent', '<string>');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.aireserve.com/v1/custom-voices', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"voice_id": "ab3f9c2e",
"name": "Product narrator",
"language": "en-US",
"tone": "warm",
"use_case": "narration",
"created_at": "2026-09-03T21:00:00.000Z"
}Create custom voice
Create a custom voice clone from reference audio (multipart/form-data). Required fields: name, language, file (audio upload, max 31 MB / 120 s), consent_attestation=true. Requires customVoicesEnabled org gate and an xAI Enterprise contract. US only, except Illinois. Creation is subject to the shared xAI team capacity.
curl --request POST \
--url https://api.aireserve.com/v1/custom-voices \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form 'name=<string>' \
--form 'language=<string>' \
--form file='@example-file' \
--form consent_attestation=true \
--form 'description=<string>' \
--form 'accent=<string>'import requests
url = "https://api.aireserve.com/v1/custom-voices"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"name": "<string>",
"language": "<string>",
"consent_attestation": "true",
"description": "<string>",
"accent": "<string>"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('name', '<string>');
form.append('language', '<string>');
form.append('file', '<string>');
form.append('consent_attestation', 'true');
form.append('description', '<string>');
form.append('accent', '<string>');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.aireserve.com/v1/custom-voices', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"voice_id": "ab3f9c2e",
"name": "Product narrator",
"language": "en-US",
"tone": "warm",
"use_case": "narration",
"created_at": "2026-09-03T21:00:00.000Z"
}Authorizations
Your AI Reserve API key (aireserve_api_…) from the API Keys page in the portal (https://portal.aireserve.com/keys).
Body
Display name for this custom voice.
255BCP-47 language code (e.g. en, en-US).
Reference audio file. Recommended: single-speaker mono WAV at 24 kHz, 90–120 s, quiet environment. Max 31 MB / 120 s.
Must be "true". Attests that the speaker has given informed consent to having their voice cloned.
true Optional free-text description.
10000Speaker gender.
male, female, neutral Speaker accent (free text).
100Approximate speaker age bracket.
young, middle-aged, old Intended use-case hint for voice model tuning.
conversational, narration, characters, educational, advertisement, social_media, entertainment Tonal quality hint.
warm, casual, professional, friendly, authoritative, expressive, calm Response
Custom voice created.
Allowlisted projection of an xAI custom voice object returned by create, read, and update operations. xAI-internal fields (team IDs, consent state) are excluded.