O feedback sobre as suas traduções raramente chega através de um clique num dashboard. Surge numa linha da sua ferramenta de suporte, numa nota de um revisor, numa entrada da sua fila de QA — "deixem de traduzir o nome do produto", "usem registo formal em alemão". A API de Sugestões do motor transforma esse texto livre em alterações ao motor a partir do código: envia o feedback em texto, a plataforma interpreta-o e devolve alterações concretas e estruturadas ao glossário, às instruções ou à voz da marca do seu motor, prontas para aplicar.
Esta é a contraparte programática da funcionalidade no dashboard. Aí, as sugestões são geradas automaticamente quando os seus avaliadores de IA atribuem uma pontuação baixa a uma tradução; aqui, é você que fornece o sinal em texto. Em ambos os casos, o resultado é o mesmo — sugestões pendentes para rever e aplicar.
O fluxo divide-se em duas partes. A geração é assíncrona — fornece o feedback e a plataforma processa-o em segundo plano, deixando sugestões pendentes no motor. A revisão é síncrona — lista as sugestões pendentes, lê o que cada uma propõe e aplica ou descarta cada uma. Esta página cobre ambas. Para a experiência no dashboard — geração automática a partir de pontuações baixas de revisão, o separador Sugestões, notificações — consulte Sugestões do motor.
Um endpoint de configuração, não de tradução
Estes endpoints leem e alteram a configuração de um motor — o respetivo glossário, instruções e voz da marca. Estão associados a um único motor através do respetivo :id e autenticam-se com o mesmo X-API-Key com âmbito de organização usado no resto da API. Nunca traduzem conteúdo nem alteram traduções passadas; uma sugestão aplicada só produz efeito na próxima tradução do motor.
Autenticação
Passe a sua chave de API no cabeçalho X-API-Key. As chaves têm âmbito de organização e dão acesso a todos os motores da organização. Consulte Authentication para mais detalhes e Errors and status codes para o modelo de erros partilhado por todos os endpoints desta página.
Gerar a partir de feedback#
POST /engines/:id/suggestions/from-textEnvie uma descrição em texto simples do que o motor está a fazer mal. A plataforma processa esse texto em conjunto com a configuração atual do motor e propõe alterações atómicas — não voltará a propor algo que o motor já tenha. A geração decorre de forma assíncrona, por isso a chamada devolve resposta assim que o trabalho é aceite, e não quando as sugestões estiverem prontas.
| Parâmetro | Tipo | Descrição |
|---|---|---|
id (path) | string | O motor para o qual pretende gerar sugestões. |
text | string | Feedback em texto livre sobre o resultado do motor. 1–10,000 caracteres; tem de conter pelo menos um caráter que não seja espaço em branco. |
const response = await fetch(
`https://api.lingo.dev/engines/${engineId}/suggestions/from-text`,
{
method: "POST",
headers: {
"X-API-Key": process.env.LINGO_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
text: "Our German (de-DE) translations keep using the informal 'du'. For our B2B audience they must always use the formal 'Sie'.",
}),
},
);
const { enqueued } = await response.json();
console.log(enqueued); // true – generation accepted, running in the background{ "enqueued": true }enqueued: true significa que a plataforma aceitou o trabalho, não que já existam sugestões. A geração é uma etapa em segundo plano — lê o seu texto, processa a configuração, elimina duplicados face ao que já existe e persiste tudo o que propuser. Uma execução pode, legitimamente, não propor nada (porque o feedback era vago ou porque o motor já cobre esse caso). Pode ler os resultados listando as sugestões do motor alguns instantes depois.
Feedback vazio é rejeitado
text tem de conter uma mensagem real. Uma string vazia, ou apenas com espaços em branco, é rejeitada com um 400 — não é silenciosamente convertida noutro tipo de pedido. Envie algo que o modelo consiga realmente interpretar.
Gerar a partir de pontuações de revisão
O mesmo gatilho de pontuação baixa que alimenta o dashboard também está disponível no código: POST /engines/:id/suggestions/generate (corpo vazio) pede à plataforma que proponha alterações a partir das avaliações por IA recentes do motor com pontuação baixa, em vez de as gerar a partir de texto. Mesma resposta { "enqueued": true }, mesmas sugestões pendentes no resultado. Recorra a from-text quando tiver feedback escrito específico; recorra a generate para obter sugestões a partir do que os seus avaliadores já assinalaram.
Listar sugestões pendentes#
GET /engines/:id/suggestionsDevolve as sugestões do motor — o resultado de qualquer execução de geração, quer tenha sido acionada por texto, pelo botão manual ou automaticamente a partir de pontuações baixas de revisão. Cada entrada é uma alteração proposta com a respetiva justificação associada.
[
{
"id": "egs_A1b2C3d4E5f6G7h8",
"ownerOrganizationId": "org_X1y2Z3a4B5c6D7e8",
"ownerEngineId": "eng_X1y2Z3a4B5c6D7e8",
"actionType": "add_instruction",
"targetKind": "instruction",
"targetId": null,
"targetLocale": "de-DE",
"payload": { "instruction": "Use the formal 'Sie' form in all German translations; never use the informal 'du'." },
"reasoning": "Feedback states the B2B audience requires formal address, but the engine has no instruction enforcing it.",
"sourceReviewLogIds": [],
"status": "pending",
"appliedTargetId": null,
"createdAt": "2026-06-18T10:30:00.000Z"
}
]| Campo | Descrição |
|---|---|
id | Identificador de sugestão com o prefixo egs_. Passe-o a apply ou dismiss. |
actionType | Um de add_glossary_item, update_glossary_item, add_instruction, update_instruction, add_brand_voice, update_brand_voice. |
targetKind | A parte do motor que a alteração afeta: glossary_item, instruction ou brand_voice. |
targetId | Para uma ação update_*, o id da entrada a alterar (gli_ / ins_ / bvc_). null para uma ação add_*. |
targetLocale | O idioma ao qual a sugestão se aplica. |
payload | A alteração pronta a aplicar. Os respetivos campos dependem de targetKind — é exatamente aquilo de que a operação de criação/atualização precisa, razão pela qual aplicar não exige mais nenhuma informação da sua parte. |
reasoning | Uma breve explicação do motivo pelo qual esta alteração foi proposta. |
sourceReviewLogIds | Os registos de revisão cujas falhas motivaram a sugestão (ids de esrl_); fica vazio quando a sugestão resulta de feedback em texto. |
status | pending, applied ou dismissed. |
appliedTargetId | A entrada criada ou atualizada assim que a sugestão é aplicada; null enquanto estiver pendente. |
O payload é o detalhe que torna a aplicação simples: a alteração proposta fica totalmente estruturada no momento da geração, pelo que aplicá-la é apenas uma gravação, não outra ronda de IA. A decisão é sua; a plataforma não volta a processar.
Aplicar uma sugestão#
POST /engine-suggestions/:id/applyGrava a alteração proposta no motor e marca a sugestão como applied. Trata-se de uma gravação determinística do payload que já viu na lista — não há uma segunda chamada à IA, por isso aquilo que reviu é exatamente o que será gravado. Uma sugestão add_* cria um novo item de glossário, instrução ou voz da marca; uma sugestão update_* altera a entrada existente identificada por targetId.
const response = await fetch(
`https://api.lingo.dev/engine-suggestions/${suggestionId}/apply`,
{
method: "POST",
headers: { "X-API-Key": process.env.LINGO_API_KEY },
},
);
const applied = await response.json();
console.log(applied.status); // "applied"
console.log(applied.appliedTargetId); // "ins_…" – the instruction it just createdA resposta devolve a sugestão no estado applied, com appliedTargetId agora a apontar para a entrada real do motor que foi criada ou atualizada. A partir desse momento, essa entrada passa a ser um item de glossário, instrução ou voz da marca como qualquer outro — pode abri-la, editá-la ou eliminá-la normalmente.
Aplicar altera a configuração, não traduções passadas
Aplicar edita a configuração do motor. O conteúdo já traduzido mantém o resultado atual; a alteração só aparece da próxima vez que o motor traduzir. Aplicar não relocaliza nada por si só.
Descartar uma sugestão#
POST /engine-suggestions/:id/dismissElimina uma sugestão de que não precisa, marcando-a como dismissed e deixando o motor inalterado. Use esta opção quando uma proposta não fizer sentido para o seu produto — o motor não é alterado e a sugestão deixa de aparecer como pendente.
await fetch(
`https://api.lingo.dev/engine-suggestions/${suggestionId}/dismiss`,
{
method: "POST",
headers: { "X-API-Key": process.env.LINGO_API_KEY },
},
);
// The suggestion is now "dismissed"; nothing was written to the engine.O ciclo, do princípio ao fim#
Os quatro endpoints formam um ciclo único que pode controlar inteiramente a partir do código: fornece feedback, vê o que foi proposto e confirma as alterações com que concorda.
Gerar
POST …/suggestions/from-text com o seu feedback escrito (ou …/suggestions/generate para, em alternativa, obter sugestões a partir de pontuações baixas de revisão). Recebe { "enqueued": true } de imediato.
Listar
GET /engines/:id/suggestions pouco depois para consultar as sugestões pendentes, cada uma com o respetivo payload e reasoning.
Aplicar ou descartar
POST /engine-suggestions/:id/apply para confirmar a alteração ou …/dismiss para a descartar. A aplicação produz efeito na próxima tradução do motor.
