curl --request POST 'https://api.voicecheap.ai/v1/actions/translations_start' \
--header "x-api-key: $VOICECHEAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"projectId":"project_launch_2026","targetLanguage":"english","voiceMode":"cloning","keepBackgroundMusic":true,"requestId":"41321bda-e243-4b6f-96a4-622cd047c991"}'
const input = {
projectId: 'project_launch_2026',
targetLanguage: 'english',
voiceMode: 'cloning',
keepBackgroundMusic: true,
requestId: '41321bda-e243-4b6f-96a4-622cd047c991',
};
const response = await fetch('https://api.voicecheap.ai/v1/actions/translations_start', {
method: 'POST',
headers: {
'x-api-key': process.env.VOICECHEAP_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify(input),
});
const body = await response.json();
if (!response.ok) throw new Error(body.code + ': ' + body.message);
console.log(body);
import os
import requests
response = requests.post(
"https://api.voicecheap.ai/v1/actions/translations_start",
headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
json={"projectId": "project_launch_2026", "targetLanguage": "english", "voiceMode": "cloning", "keepBackgroundMusic": True, "requestId": "41321bda-e243-4b6f-96a4-622cd047c991"},
timeout=120,
)
body = response.json()
if not response.ok:
raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
print(body)
{
"data": {
"success": true,
"message": "Translation started successfully. Use the status endpoint to track progress.",
"projectId": "project_launch_2026",
"estimatedDuration": 10,
"workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24"
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
{
"data": {
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
"operation": "translations_start",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "running",
"pollAfterSeconds": 5
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
{
"data": {
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
"operation": "translations_start",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "completed",
"resultStored": false,
"message": "The action completed. Retrieve its output from the corresponding history or resource action."
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
Tradução e dublagem
Traduzir um projeto existente
Traduza e duble um projeto já transcrito para outro idioma, com as verificações normais de créditos, vozes e simultaneidade. Consulte projects_status.
POST
/
v1
/
actions
/
translations_start
curl --request POST 'https://api.voicecheap.ai/v1/actions/translations_start' \
--header "x-api-key: $VOICECHEAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"projectId":"project_launch_2026","targetLanguage":"english","voiceMode":"cloning","keepBackgroundMusic":true,"requestId":"41321bda-e243-4b6f-96a4-622cd047c991"}'
const input = {
projectId: 'project_launch_2026',
targetLanguage: 'english',
voiceMode: 'cloning',
keepBackgroundMusic: true,
requestId: '41321bda-e243-4b6f-96a4-622cd047c991',
};
const response = await fetch('https://api.voicecheap.ai/v1/actions/translations_start', {
method: 'POST',
headers: {
'x-api-key': process.env.VOICECHEAP_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify(input),
});
const body = await response.json();
if (!response.ok) throw new Error(body.code + ': ' + body.message);
console.log(body);
import os
import requests
response = requests.post(
"https://api.voicecheap.ai/v1/actions/translations_start",
headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
json={"projectId": "project_launch_2026", "targetLanguage": "english", "voiceMode": "cloning", "keepBackgroundMusic": True, "requestId": "41321bda-e243-4b6f-96a4-622cd047c991"},
timeout=120,
)
body = response.json()
if not response.ok:
raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
print(body)
{
"data": {
"success": true,
"message": "Translation started successfully. Use the status endpoint to track progress.",
"projectId": "project_launch_2026",
"estimatedDuration": 10,
"workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24"
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
{
"data": {
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
"operation": "translations_start",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "running",
"pollAfterSeconds": 5
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
{
"data": {
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
"operation": "translations_start",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "completed",
"resultStored": false,
"message": "The action completed. Retrieve its output from the corresponding history or resource action."
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
Traduza e duble um projeto já transcrito para outro idioma, com as verificações normais de créditos, vozes e simultaneidade. Consulte projects_status.
Permissões necessárias:
POST https://api.voicecheap.ai/v1/actions/translations_start
Autenticação e permissões
string
obrigatório
Envie uma chave de API VoiceCheap neste cabeçalho. Authorization: Bearer com a mesma chave de API também é aceito. Tokens de acesso OAuth são
aceitos apenas pelo MCP, não por este endpoint REST.
translations:write.
É necessária uma assinatura paga ativa. As permissões não alteram funções na equipe, propriedade dos recursos, créditos de mídia ou limites do plano.
Parâmetros
string
obrigatório
Valor de texto.Comprimento mínimo: 1. Comprimento máximo: 200. Padrão:
^[^/\\]+$.boolean
Valor booleano.
boolean
Valor booleano.
number
Valor numérico.Mínimo: 1. Máximo: 70.
string
Valor de texto.Valores aceitos: “cloning”, “custom”.
string
Valor de texto.Comprimento mínimo: 1. Comprimento máximo: 128.
boolean
Valor booleano.
string
Valor de texto.Valores aceitos: “translated”, “original”.
string
Valor de texto.Valores aceitos: “studio”, “realistic”.
string
Valor de texto.Valores aceitos: “standard”, “pro”, “studio”.
boolean
Valor booleano.
object
Objeto JSON. Consulte o esquema de entrada completo para ver os campos aninhados.
array
Lista de valores. Consulte o esquema de entrada completo para ver a estrutura dos itens.Máximo de itens: 100.
string
obrigatório
Valor de texto.Valores aceitos: “afrikaans”, “albanian”, “amharic”, “arabic”, “armenian”, “assamese”, “azerbaijani”, “basque”, “belarusian”, “bengali”, “bosnian”, “bulgarian”, “catalan”, “croatian”, “czech”, “danish”, “dutch”, “english”, “british english”, “estonian”, “finnish”, “french”, “french canadian”, “galician”, “german”, “greek”, “gujarati”, “hebrew”, “hindi”, “hungarian”, “icelandic”, “indonesian”, “irish”, “italian”, “japanese”, “kannada”, “kazakh”, “khmer”, “korean”, “lao”, “latvian”, “lithuanian”, “macedonian”, “malay”, “malayalam”, “mandarin”, “marathi”, “mongolian”, “nepali”, “norwegian”, “persian”, “polish”, “portuguese”, “brazilian portuguese”, “pt_brazil”, “punjabi”, “romanian”, “russian”, “serbian”, “slovak”, “slovenian”, “spanish”, “swahili”, “swedish”, “tagalog”, “tamil”, “telugu”, “thai”, “turkish”, “ukrainian”, “urdu”, “vietnamese”, “welsh”, “yoruba”, “zulu”.
string
Opcional na camada de transporte: o servidor insere um identificador antes da validação quando ele é omitido. Forneça seu próprio UUID v4 estável para recuperar com segurança uma resposta perdida.Formato: “uuid”. Padrão:
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$.Esquema de entrada completo
Esquema de entrada completo
O JSON Schema abaixo preserva os nomes exatos dos campos, tipos aninhados, valores padrão, limites e valores aceitos expostos pela descoberta. Regras adicionais entre campos são listadas nas notas da operação.
{
"type": "object",
"properties": {
"projectId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[^/\\\\]+$"
},
"keepBackgroundMusic": {
"type": "boolean"
},
"keepOriginalVoice": {
"type": "boolean"
},
"originalVoiceVolume": {
"type": "number",
"minimum": 1,
"maximum": 70
},
"voiceMode": {
"type": "string",
"enum": ["cloning", "custom"]
},
"voiceId": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"subtitles": {
"type": "boolean"
},
"subtitlesSource": {
"type": "string",
"enum": ["translated", "original"]
},
"voiceIsolatorOption": {
"type": "string",
"enum": ["studio", "realistic"]
},
"lipSyncMode": {
"type": "string",
"enum": ["standard", "pro", "studio"]
},
"activeSpeakerDetectionEnabled": {
"type": "boolean"
},
"voiceCloningSettings": {
"type": "object",
"properties": {
"stability": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"similarity": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": ["stability", "similarity"],
"additionalProperties": false
},
"translationTimeSkips": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"startTime": {
"type": "number",
"minimum": 0
},
"endTime": {
"type": "number",
"exclusiveMinimum": 0
}
},
"required": ["startTime", "endTime"],
"additionalProperties": false
}
},
"targetLanguage": {
"type": "string",
"enum": [
"afrikaans",
"albanian",
"amharic",
"arabic",
"armenian",
"assamese",
"azerbaijani",
"basque",
"belarusian",
"bengali",
"bosnian",
"bulgarian",
"catalan",
"croatian",
"czech",
"danish",
"dutch",
"english",
"british english",
"estonian",
"finnish",
"french",
"french canadian",
"galician",
"german",
"greek",
"gujarati",
"hebrew",
"hindi",
"hungarian",
"icelandic",
"indonesian",
"irish",
"italian",
"japanese",
"kannada",
"kazakh",
"khmer",
"korean",
"lao",
"latvian",
"lithuanian",
"macedonian",
"malay",
"malayalam",
"mandarin",
"marathi",
"mongolian",
"nepali",
"norwegian",
"persian",
"polish",
"portuguese",
"brazilian portuguese",
"pt_brazil",
"punjabi",
"romanian",
"russian",
"serbian",
"slovak",
"slovenian",
"spanish",
"swahili",
"swedish",
"tagalog",
"tamil",
"telugu",
"thai",
"turkish",
"ukrainian",
"urdu",
"vietnamese",
"welsh",
"yoruba",
"zulu"
]
},
"requestId": {
"type": "string",
"format": "uuid",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$",
"description": "UUID v4 for this action. Reuse the same ID with identical arguments on retries."
}
},
"required": ["projectId", "targetLanguage"],
"additionalProperties": false
}
Idempotência
Use um UUID v4 em requestId ou no cabeçalho HTTP Idempotency-Key para cada alteração. Reutilize o mesmo identificador e argumentos idênticos após uma falha de rede. Se ambos forem fornecidos, devem ser iguais. Repetir uma requisição salva não repete a operação nem consome outra chamada mensal. Requisições com falha ou interrompidas não são reiniciadas automaticamente. Qualquer alteração pode retornar HTTP 202 quando uma nova tentativa encontra a mesma requisição ainda em execução, mesmo que a primeira execução normalmente seja síncrona. Se a execução foi concluída, mas resultStored é false, uma nova tentativa retorna HTTP 200 com o estado salvo da requisição em vez do resultado original. Recupere a saída pela ação de histórico, resultado ou download do domínio correspondente.Exemplos de requisição
Substitua os identificadores de recursos e as chaves de mídia dos exemplos pelos valores retornados para sua conta. Mantenha o identificador da requisição ao tentar novamente a mesma alteração.curl --request POST 'https://api.voicecheap.ai/v1/actions/translations_start' \
--header "x-api-key: $VOICECHEAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"projectId":"project_launch_2026","targetLanguage":"english","voiceMode":"cloning","keepBackgroundMusic":true,"requestId":"41321bda-e243-4b6f-96a4-622cd047c991"}'
const input = {
projectId: 'project_launch_2026',
targetLanguage: 'english',
voiceMode: 'cloning',
keepBackgroundMusic: true,
requestId: '41321bda-e243-4b6f-96a4-622cd047c991',
};
const response = await fetch('https://api.voicecheap.ai/v1/actions/translations_start', {
method: 'POST',
headers: {
'x-api-key': process.env.VOICECHEAP_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify(input),
});
const body = await response.json();
if (!response.ok) throw new Error(body.code + ': ' + body.message);
console.log(body);
import os
import requests
response = requests.post(
"https://api.voicecheap.ai/v1/actions/translations_start",
headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
json={"projectId": "project_launch_2026", "targetLanguage": "english", "voiceMode": "cloning", "keepBackgroundMusic": True, "requestId": "41321bda-e243-4b6f-96a4-622cd047c991"},
timeout=120,
)
body = response.json()
if not response.ok:
raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
print(body)
Resposta
Uma primeira execução bem-sucedida retorna HTTP 200 com o resultado da operação em data. Uma repetição pode retornar o estado salvo da requisição. O exemplo mostra uma resposta aceita, não todos os campos opcionais. Retorna os identificadores do projeto e do trabalho no idioma de destino após admitir a tradução e a dublagem de um projeto existente já transcrito.{
"data": {
"success": true,
"message": "Translation started successfully. Use the status endpoint to track progress.",
"projectId": "project_launch_2026",
"estimatedDuration": 10,
"workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24"
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
{
"data": {
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
"operation": "translations_start",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "running",
"pollAfterSeconds": 5
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
{
"data": {
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
"operation": "translations_start",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "completed",
"resultStored": false,
"message": "The action completed. Retrieve its output from the corresponding history or resource action."
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
Campos do resultado
| Campo | Descrição |
|---|---|
data.success | true quando o fluxo de trabalho em segundo plano foi admitido; não indica mídia concluída. |
data.message | Confirmação de tradução ou de dublagem com tradução fornecida. |
data.projectId | Identificador do projeto pai. |
data.estimatedDuration | Estimativa aproximada de processamento em minutos: ceil(duração da origem em segundos / 60) * 5. |
data.workId | Identificador do trabalho no idioma de destino existente ou recém-criado. |
Recuperar e consultar esta requisição
Use o mesmo identificador mesmo após perder a conexão. Se resultStored for false, recupere a saída pela ação correspondente de histórico, resultado ou download. Nunca inicie uma segunda geração apenas para verificar o progresso.curl --request POST 'https://api.voicecheap.ai/v1/actions/action_request_get' \
--header "x-api-key: $VOICECHEAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"requestId":"41321bda-e243-4b6f-96a4-622cd047c991","operation":"translations_start"}'
HTTP 200
{
"data": {
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
"operation": "translations_start",
"status": "completed",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"resultStored": true,
"result": {
"success": true,
"message": "Translation started successfully. Use the status endpoint to track progress.",
"projectId": "project_launch_2026",
"estimatedDuration": 10,
"workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24"
}
}
}
Notas da operação
- Exige uma transcrição original concluída e não vazia. O projeto armazenado fornece sua duração e seu tipo de mídia.
- Reutiliza o trabalho existente do idioma quando presente; caso contrário, o cria. Uma execução simultânea de dublagem nesse idioma deve terminar antes que outra comece.
- Esta ação não aceita sourceSrt, translatedSrt, fileKey, uma URL de mídia ou webhookUrl.
- voiceMode usa cloning por padrão. Com voiceMode custom, use uma voz do catálogo ou uma voz personalizada salva pela conta autenticada; não envie voiceCloningSettings. A cobrança da equipe não concede acesso às vozes salvas de outros membros.
- Os campos opcionais subtitles, lipSyncMode e translationTimeSkips exigem uma entrada de vídeo. Os intervalos ignorados devem ficar dentro da duração da mídia, keepBackgroundMusic deve ser true e keepOriginalVoice deve ser false.
- lipSyncMode aceita standard, pro ou studio, sujeito ao plano e às verificações normais de créditos de mídia. Fala e sincronização labial não se tornam gratuitas porque as chamadas mensais de API são ilimitadas.
- Consulte projects_status periodicamente para acompanhar o fluxo de mídia; obtenha todas as versões de idioma com projects_get.
Uso
Cada chamada bem-sucedida consome uma chamada mensal da API/MCP. Os créditos de mídia e as cotas de geração da própria operação também se aplicam.Erros
| Status HTTP | Código | Significado ou recuperação |
|---|---|---|
| 400 | CREDENTIAL_IN_QUERY | Foram fornecidas credenciais em um parâmetro de consulta access_token ou api_key. Envie as credenciais nos cabeçalhos. |
| 400 | DURATION_DETECTION_FAILED | A duração da mídia armazenada do projeto não está disponível. |
| 400 | IDEMPOTENCY_CONFLICT | O cabeçalho Idempotency-Key e o campo requestId do corpo devem ser iguais. |
| 400 | INVALID_REQUEST_ID | Forneça um requestId ou Idempotency-Key no formato UUID v4. |
| 400 | LIPSYNC_NOT_AVAILABLE_FOR_AUDIO | A sincronização labial requer entrada de vídeo. |
| 400 | LIPSYNC_VIDEO_TOO_LONG | O vídeo excede o limite de duração do modo de sincronização labial selecionado. |
| 400 | SUBTITLES_NOT_AVAILABLE_FOR_AUDIO | Legendas incorporadas requerem entrada de vídeo. |
| 400 | TRANSLATION_TIME_SKIP_CONFLICT | Os saltos de tempo da tradução não podem ser combinados com keepOriginalVoice true. |
| 400 | TRANSLATION_TIME_SKIP_NOT_AVAILABLE_FOR_AUDIO | Os saltos de tempo da tradução requerem entrada de vídeo. |
| 400 | TRANSLATION_TIME_SKIP_OUT_OF_RANGE | Um intervalo ignorado ultrapassa a duração da mídia. |
| 400 | TRANSLATION_TIME_SKIP_REQUIRES_BACKGROUND | Os saltos de tempo da tradução requerem keepBackgroundMusic true. |
| 400 | VALIDATION_ERROR | Corrija a entrada usando o esquema. Valores inválidos ou inconsistentes são rejeitados antes da execução. |
| 400 | VOICE_CLONING_SETTINGS_NOT_ALLOWED | voiceCloningSettings só se aplica a voiceMode cloning. |
| 400 | VOICE_ID_NOT_ALLOWED_WITH_CLONING | voiceId não pode ser combinado com voiceMode cloning. |
| 400 | VOICE_ID_REQUIRED | voiceMode custom exige voiceId. |
| 401 | API_KEY_EXPIRED | A chave de API expirou. |
| 401 | INVALID_API_KEY | Forneça uma chave de API válida e dentro do prazo de validade. |
| 401 | INVALID_CREDENTIAL | O cabeçalho Authorization está malformado ou entra em conflito com x-api-key. |
| 401 | MISSING_CREDENTIAL | Nenhuma credencial utilizável foi fornecida no cabeçalho, ou ela excedeu 4096 caracteres. |
| 401 | USER_NOT_FOUND | A conta da credencial não existe mais. |
| 403 | ACCOUNT_UNAVAILABLE | A conta que executa a ação ou a conta de cobrança está indisponível ou em processo de exclusão. |
| 403 | AMBIGUOUS_TEAM_API_KEY | O usuário da credencial pertence a mais de uma equipe, portanto o contexto de cobrança é ambíguo. |
| 403 | CUSTOM_VOICE_ACCESS_DENIED | A voz selecionada não é uma voz do catálogo nem uma voz personalizada salva pela conta autenticada. |
| 403 | FORBIDDEN | O autor autenticado da ação não pode acessar este projeto. |
| 403 | INSUFFICIENT_CREDITS | A conta não tem créditos de mídia suficientes para as configurações de fala e de sincronização labial opcional selecionadas. |
| 403 | INSUFFICIENT_SCOPE | Conceda todas as permissões necessárias ou escolha outra credencial. |
| 403 | INTEGRATION_PLAN_UNSUPPORTED | Não foi possível verificar os limites de integração da conta. |
| 403 | LIPSYNC_MODE_ACCESS_DENIED | O modo opcional de sincronização labial selecionado está indisponível no plano atual. |
| 403 | SUBSCRIPTION_REQUIRED | Use uma assinatura paga ativa. |
| 403 | TEAM_OWNER_NOT_FOUND | Não foi possível encontrar a conta efetiva do proprietário da equipe. |
| 404 | PROJECT_NOT_FOUND | O projeto não existe na conta acessível. |
| 409 | CONCURRENT_ACTION_LIMIT_REACHED | Esta conta já tem 10 ações de integração em execução. Consulte uma requisição existente antes de iniciar outra. |
| 409 | DUB_ONLY_REQUIRES_TRANSCRIPTION | Aguarde uma transcrição original concluída e não vazia antes de iniciar esta ação. |
| 409 | IDEMPOTENCY_CONFLICT | Reutilize um identificador apenas com a mesma operação e os mesmos argumentos. |
| 409 | TRANSLATION_ALREADY_IN_PROGRESS | Uma execução de dublagem para este idioma de destino já está em andamento. |
| 429 | CONCURRENT_TRANSLATION_LIMIT_REACHED | A conta atingiu seu limite de traduções simultâneas. |
| 429 | INTEGRATION_MONTHLY_LIMIT_REACHED | Aguarde a renovação do limite mensal ou mude de plano. |
| 429 | INTEGRATION_RATE_LIMIT_REACHED | Aguarde o prazo de Retry-After, quando presente, e aumente progressivamente o intervalo entre as tentativas. |
| 500 | INTERNAL_ERROR | Verifique o estado da requisição salva e o histórico do recurso antes de decidir repetir uma alteração. |
| 503 | ACTION_RESULT_UNAVAILABLE | A ação foi executada, mas não foi possível salvar seu resultado. Inspecione o estado salvo da requisição e o histórico do recurso antes de iniciar uma nova geração. |
| 503 | SERVER_RESTARTING | O servidor está reiniciando. Tente novamente em breve e mantenha o mesmo identificador de requisição para uma alteração. |
{
"code": "INSUFFICIENT_SCOPE",
"message": "This credential does not permit the requested action.",
"status": 403,
"details": {
"requiredScopes": ["translations:write"]
}
}
Esta página foi útil?

