curl --location 'https://api.inworld.ai/voices/v1/voices/<voice-id>:approveLocalization' \
--header "Authorization: Basic $INWORLD_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"draftVoiceId": "your_workspace_id__localize-70f3d90e",
"candidateId": "f81e64399e72"
}'import requests
voice_id = "<voice-id>"
url = f"https://api.inworld.ai/voices/v1/voices/{voice_id}:approveLocalization"
headers = {
"Authorization": "Basic <api-key>",
"Content-Type": "application/json"
}
payload = {
"draftVoiceId": "your_workspace_id__localize-70f3d90e",
"candidateId": "f81e64399e72"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json()["promptLanguages"])const voiceId = '<voice-id>';
const url = `https://api.inworld.ai/voices/v1/voices/${voiceId}:approveLocalization`;
const response = await fetch(url, {
method: 'POST',
headers: {
'Authorization': 'Basic <api-key>',
'Content-Type': 'application/json',
},
body: JSON.stringify({
draftVoiceId: 'your_workspace_id__localize-70f3d90e',
candidateId: 'f81e64399e72',
}),
});
const voice = await response.json();
console.log(voice.promptLanguages);{
"name": "workspaces/your_workspace_id/voices/my_voice",
"voiceId": "your_workspace_id__my_voice",
"langCode": "EN_US",
"displayName": "My Voice",
"source": "IVC",
"promptLanguages": [
"en-US",
"de-DE"
]
}{
"code": 5,
"message": "candidate not found",
"details": []
}Approve a localization
Confirm one candidate from a Localize a voice response. The chosen candidate becomes the voice’s prompt for the target language, and the draft is deleted. Approving replaces any existing prompt the voice had for that language.
curl --location 'https://api.inworld.ai/voices/v1/voices/<voice-id>:approveLocalization' \
--header "Authorization: Basic $INWORLD_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"draftVoiceId": "your_workspace_id__localize-70f3d90e",
"candidateId": "f81e64399e72"
}'import requests
voice_id = "<voice-id>"
url = f"https://api.inworld.ai/voices/v1/voices/{voice_id}:approveLocalization"
headers = {
"Authorization": "Basic <api-key>",
"Content-Type": "application/json"
}
payload = {
"draftVoiceId": "your_workspace_id__localize-70f3d90e",
"candidateId": "f81e64399e72"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json()["promptLanguages"])const voiceId = '<voice-id>';
const url = `https://api.inworld.ai/voices/v1/voices/${voiceId}:approveLocalization`;
const response = await fetch(url, {
method: 'POST',
headers: {
'Authorization': 'Basic <api-key>',
'Content-Type': 'application/json',
},
body: JSON.stringify({
draftVoiceId: 'your_workspace_id__localize-70f3d90e',
candidateId: 'f81e64399e72',
}),
});
const voice = await response.json();
console.log(voice.promptLanguages);{
"name": "workspaces/your_workspace_id/voices/my_voice",
"voiceId": "your_workspace_id__my_voice",
"langCode": "EN_US",
"displayName": "My Voice",
"source": "IVC",
"promptLanguages": [
"en-US",
"de-DE"
]
}{
"code": 5,
"message": "candidate not found",
"details": []
}/workspaces/{workspace} is no longer required in the path for simplicity and clarity. When omitted, the workspace is derived from your API key. The previous URL with the full path /voices/v1/workspaces/{workspace}/voices/{voice}:approveLocalization would continue to be supported.{voiceId} in the URL must be the voice the draft was created from; the target language is not passed, it is read from the draft.
404 NOT_FOUND on this call usually means the candidate was superseded — localizing the same voice and language again replaces the draft’s candidates. Re-run localize and approve from the newest response. A 429 (rate limit) is harmless here: the draft still exists, so the call can simply be retried.voiceId with the target language — the voice now uses its localized prompt for that language. See Languages.Authorizations
Your API key. Read permissions are required for GET endpoints. Write permissions are required for POST, PATCH, and DELETE endpoints.
For Basic authentication, please populate Basic $INWORLD_API_KEY. You can create a key in one command with the Inworld CLI: inworld workspace add-key.
Path Parameters
Voice ID of the voice the draft was created from. Must match the voice used in the localize call.
[^/]+Body
Response
A successful response. Returns the updated voice; promptLanguages now includes the new language.
Voice resource representing a voice configuration.
Voice ID. SYSTEM voices use a simple name (e.g. Alex); IVC voices are workspace-prefixed ({workspace}__{voice}).
Primary language of the voice in upper-snake format (e.g. EN_US). Note that when filtering via lang_code, you can pass BCP-47 (en-US), underscore form (en_US), or a language prefix (en) — but the response always returns upper-snake.
EN_US, ZH_CN, KO_KR, JA_JP, RU_RU, AUTO, IT_IT, ES_ES, PT_BR, DE_DE, FR_FR, AR_SA, PL_PL, NL_NL, HI_IN, HE_IL Canonical wire form of the voice's primary language as a single string (e.g. en-US, es-MX, vi). Populated on every read alongside the legacy langCode enum. Immutable after creation.
The human-readable name shown anywhere the voice is listed or selected.
Longer blurb that explains the voice's tone, accent, use cases, or other relevant attributes.
Free-form labels for filtering, grouping, and discovery (e.g. british, calm).
Resource name. Format: workspaces/{workspace}/voices/{voice}.
Origin of the voice:
SYSTEM: Built-in voice provided by Inworld, visible to all workspaces.IVC: Voice cloned from audio or created via Voice Design — owned by your workspace only.PVC: Professional Voice Clone.
SYSTEM, IVC, PVC Voice gender (male, female, neutral). Empty string if unspecified. Voices with no gender are excluded when filtering with an explicit gender = predicate.
male, female, neutral, Age group of the voice (young, middle_aged, elderly). Empty string if unspecified.
young, middle_aged, elderly, Use-case categories the voice belongs to. Filterable with the : (has) operator.
Supported values: companions, enterprise, education_training, developer_assistants, healthcare, interactive_media.
companions, enterprise, education_training, developer_assistants, healthcare, interactive_media Languages the voice can handle, in BCP-47 format (e.g. en-US). May differ from langCode for multilingual voices.