Crie um grupo de jobs de localização: uma única solicitação que distribui seu conteúdo para todos os idiomas de destino que você informar.
Você tem um payload de strings e uma lista de idiomas, e quer traduzir tudo sem precisar implementar essa distribuição por conta própria. POST /jobs/localization recebe o payload completo e até 100 idiomas de destino em uma única solicitação, depois retorna 202 Accepted imediatamente com um ID de grupo e um job por idioma. Uma solicitação, todos os idiomas — a plataforma cria os jobs e processa cada um de forma independente.
POST /jobs/localizationEsta página cobre a chamada de criação: os parâmetros, o formato da solicitação, a resposta 202 e como tornar a chamada segura para novas tentativas. Está começando com localização assíncrona? Comece pela Visão geral da API de Localização Assíncrona para entender o modelo mental. Depois que um grupo existir, acompanhar um grupo de jobs mostra o que significa o status de cada idioma.
Autenticação
Envie sua chave de API no cabeçalho X-API-Key. As chaves têm escopo de organização e alcançam todos os engines da organização. Consulte Authentication para mais detalhes.
Parâmetros#
sourceLocale, targetLocales e data são obrigatórios. Todo o restante ajusta o comportamento ou torna a chamada mais segura de repetir.
| Parâmetro | Tipo | Descrição |
|---|---|---|
sourceLocale | string | idioma de origem em BCP-47 (por exemplo, en). |
targetLocales | string[] | Idiomas de destino em BCP-47 (por exemplo, ["de", "fr", "ja"]). De 1 a 100 por solicitação. Um job é criado por idioma. |
data | object | Conteúdo em chave-valor para traduzir. Objetos e arrays aninhados são permitidos em qualquer nível de profundidade. |
context | string (opcional) | Contexto geral para este payload de tradução, como a área do produto, o público ou a finalidade. Aplica-se a todos os jobs criados para a solicitação. |
hints | object (opcional) | Contexto por chave na forma de arrays de strings de breadcrumb, para desambiguar strings curtas ou reutilizadas. |
callbackUrl | string (opcional) | URL de webhook HTTPS para este grupo. Substitui o padrão da organização. URLs HTTP são rejeitadas. |
idempotencyKey | string (opcional) | Chave gerada pelo cliente. Envie a mesma solicitação duas vezes com a mesma chave, e o grupo existente será retornado em vez de um novo. O escopo é por engine. |
engineId | string (opcional) | Engine de localização usado para executar os jobs. Se omitido, usa o engine padrão da organização. |
pipelineConfig | object (opcional) | Overrides de pipeline por solicitação. As etapas que você omitir herdam a configuração do engine. |
lockedKeys | string[] (opcional) | Chaves ou padrões glob cujos valores ficam de fora da tradução e são mesclados de volta literalmente em outputData. Até 100 padrões. Consulte Lock non-translatable keys. |
Solicitação#
O campo data aceita pares simples de chave e valor ou estruturas aninhadas com objetos e arrays em qualquer profundidade. O engine traduz cada valor de string, preserva valores que não são string (números, booleanos, null) sem alteração e retorna exatamente a mesma estrutura que você enviou. Assim, você pode passar o mesmo objeto que seu app já armazena — sem achatar nem reestruturar.
{
"sourceLocale": "en",
"targetLocales": ["de", "fr", "ja"],
"data": {
"lesson_title": "Introduction to Machine Learning",
"lesson_summary": "This lesson covers the fundamentals of ML, including supervised and unsupervised learning."
},
"callbackUrl": "https://your-app.com/webhooks/translations",
"idempotencyKey": "course_101-v3"
}HTTPS obrigatório
O callbackUrl precisa usar HTTPS. URLs HTTP são rejeitadas com um erro 400.
Esse payload aninhado mistura texto traduzível com valores que precisam permanecer intactos — id, course_101, difficulty. As strings são traduzidas; o restante é preservado por tipo. Quando você também precisar segurar uma string (um slug, uma URL de asset, um código de enum), informe-a em lockedKeys e ela será mesclada de volta literalmente na saída de cada idioma.
Resposta (202 Accepted)#
A chamada retorna imediatamente. Ela não espera a tradução — entrega o ID do grupo e os IDs dos jobs por idioma, e depois a plataforma processa cada job de forma independente em segundo plano.
{
"groupId": "ljg_A1b2C3d4E5f6G7h8",
"status": "pending",
"jobs": [
{ "id": "ljb_A1b2C3d4E5f6G7h8", "targetLocale": "de", "status": "queued" },
{ "id": "ljb_B2c3D4e5F6g7H8i9", "targetLocale": "fr", "status": "queued" },
{ "id": "ljb_C3d4E5f6G7h8I9j0", "targetLocale": "ja", "status": "queued" }
],
"createdAt": "2026-03-16T10:30:00.000Z"
}| Campo | Descrição |
|---|---|
groupId | Identificador com prefixo ljg_ para o grupo inteiro. Guarde isso — é a referência para acompanhamento e progresso em tempo real. |
status | Status do grupo no momento da criação, normalmente pending. |
jobs | Uma entrada por idioma de destino: id (com prefixo ljb_), targetLocale e o status do job. |
createdAt | Timestamp em ISO 8601. |
Entram três idiomas, saem três jobs, cada um em queued e pronto para rodar. O que cada status significa à medida que os jobs avançam — e o que acontece quando um idioma falha enquanto os outros seguem adiante — está em Track a job group.
Exemplos#
A mesma solicitação em Node e Python. Ambos fazem um único POST e leem o ID do grupo e a quantidade de jobs direto de 202.
const response = await fetch("https://api.lingo.dev/jobs/localization", {
method: "POST",
headers: {
"X-API-Key": process.env.LINGO_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
sourceLocale: "en",
targetLocales: ["de", "fr", "ja"],
data: {
title: "Introduction to Machine Learning",
steps: [
{ heading: "What is ML?", body: "Machine learning is a subset of AI." },
{ heading: "Supervised Learning", body: "Training with labeled data." },
],
},
callbackUrl: "https://your-app.com/webhooks/translations",
}),
});
const { groupId, jobs } = await response.json();
// 202 Accepted – the call returns without waiting for translation.
console.log(groupId); // "ljg_A1b2C3d4E5f6G7h8"
console.log(jobs.length); // 3 – one queued job per target localeTorne a chamada segura para tentar de novo#
O lugar natural para disparar essa solicitação é um hook de salvamento ou um manipulador de eventos — exatamente o tipo de código que roda duas vezes quando acontece uma nova tentativa ou chega um evento duplicado. Sem proteção, duas chamadas significam dois grupos de jobs, e o mesmo conteúdo entra na fila de tradução duas vezes.
Envie um idempotencyKey e isso deixa de ser um risco. Envie a mesma solicitação duas vezes com a mesma chave e a plataforma retorna o grupo existente em vez de criar um novo — sem um segundo conjunto de jobs. As chaves têm escopo por engine, então a mesma chave em um engine diferente corresponde a um grupo diferente.
Escolha uma chave que faça sentido
Uma boa chave combina a identidade do conteúdo com a versão: {contentId}-v{contentVersion}. O mesmo conteúdo na mesma versão sempre aponta para o mesmo grupo, então uma nova tentativa automaticamente não faz nada. Atualize a versão quando o conteúdo mudar e você terá um grupo novo.
const key = `${content.id}-v${content.version}`;
async function submit() {
const response = await fetch("https://api.lingo.dev/jobs/localization", {
method: "POST",
headers: {
"X-API-Key": process.env.LINGO_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
sourceLocale: "en",
targetLocales: ["de", "fr", "ja", "ko", "pt-BR"],
data: { title: content.title, steps: content.steps },
callbackUrl: "https://your-app.com/webhooks/translations",
idempotencyKey: key,
}),
});
return (await response.json()).groupId;
}
const first = await submit();
const again = await submit(); // same key – duplicate submission
console.log(first === again); // true – same group returned, no second set of jobsEste é o POST que distribui um payload para todos os idiomas, e é seguro dispará-lo a partir do mesmo fluxo de código que faz novas tentativas. Guarde o groupId; é isso que você vai usar em acompanhamento e progresso em tempo real.
