Los comentarios sobre tus traducciones casi nunca llegan como un clic en un panel. Llegan como una línea en tu propia herramienta de soporte, una nota de un revisor o una fila en tu propia cola de QA: "dejen de traducir el nombre del producto", "usen el registro formal en alemán". La API de sugerencias del motor convierte ese texto libre en cambios del motor desde código: envías el comentario como texto, la plataforma razona sobre él y te devuelve ediciones concretas y estructuradas para el glosario, las instrucciones o la voz de marca de tu motor, listas para aplicar.
Esta es la contraparte programática de la función del panel. Allí, las sugerencias se generan automáticamente cuando tus AI Reviewers le dan una puntuación baja a una traducción; aquí, tú aportas la señal en texto. En ambos casos, el resultado es el mismo: sugerencias pendientes para que las revises y apliques.
El flujo tiene dos partes. La generación es asíncrona: entregas el comentario y la plataforma razona sobre él en segundo plano, dejando sugerencias pendientes en el motor. La revisión es síncrona: consultas las sugerencias pendientes, lees qué propone cada una y la aplicas o la descartas. Esta página cubre ambas. Para la experiencia en el panel —generación automática a partir de puntuaciones bajas de revisión, la pestaña Suggestions y las notificaciones— consulta Engine Suggestions.
Un endpoint de configuración, no de traducción
Estos endpoints leen y cambian la configuración de un motor: su glosario, sus instrucciones y su voz de marca. Están limitados a un solo motor por su :id y se autentican con el mismo X-API-Key con alcance a nivel de organización que usa el resto de la API. Nunca traducen contenido ni alteran traducciones anteriores; una sugerencia aplicada entra en vigor en la siguiente traducción del motor.
Autenticación
Pasa tu API key en el encabezado X-API-Key. Las claves tienen alcance a nivel de organización y dan acceso a todos los motores de la organización. Consulta Authentication para más detalles y Errors and status codes para el modelo de errores que comparten todos los endpoints de esta página.
Generar a partir de comentarios#
POST /engines/:id/suggestions/from-textEnvía una descripción en texto plano de lo que el motor está haciendo mal. La plataforma razona sobre ese texto junto con la configuración actual del motor y propone ediciones atómicas; no volverá a proponer algo que el motor ya tenga. La generación se ejecuta de forma asíncrona, así que la llamada devuelve respuesta en cuanto se acepta el trabajo, no cuando las sugerencias ya están listas.
| Parámetro | Tipo | Descripción |
|---|---|---|
id (ruta) | string | El motor para el que se generarán las sugerencias. |
text | string | Comentarios en texto libre sobre la salida del motor. De 1 a 10,000 caracteres; debe contener al menos un carácter que no sea un espacio en blanco. |
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 la plataforma aceptó el trabajo, no que ya existan sugerencias. La generación es un paso en segundo plano: lee tu texto, razona sobre la configuración, elimina duplicados con lo que ya existe y guarda lo que proponga. Es totalmente válido que una ejecución no proponga nada (porque el comentario era vago o porque el motor ya cubre ese caso). Consulta los resultados listando las sugerencias del motor unos momentos después.
Se rechazan los comentarios vacíos
text debe contener un mensaje real. Una cadena vacía, o solo espacios en blanco, se rechaza con un 400; no se convierte silenciosamente en otro tipo de solicitud. Envía algo sobre lo que el modelo realmente pueda razonar.
Genera a partir de puntuaciones de revisión
El mismo disparador por puntuación baja que impulsa el panel también está disponible desde código: POST /engines/:id/suggestions/generate (cuerpo vacío) le pide a la plataforma que proponga ediciones a partir de las evaluación de IA recientes del motor con puntuaciones bajas, en lugar de hacerlo a partir de texto. Misma respuesta { "enqueued": true }, mismo resultado: sugerencias pendientes. Usa from-text cuando tengas comentarios escritos específicos; usa generate para extraer sugerencias de lo que tus revisores ya marcaron.
Listar sugerencias pendientes#
GET /engines/:id/suggestionsDevuelve las sugerencias del motor: el resultado de cualquier ejecución de generación, ya sea activada desde texto, desde el botón manual o automáticamente a partir de puntuaciones bajas de revisión. Cada entrada es una edición propuesta con su razonamiento asociado.
[
{
"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 | Descripción |
|---|---|
id | Identificador de sugerencia con prefijo egs_. Pásalo a apply o dismiss. |
actionType | Uno de add_glossary_item, update_glossary_item, add_instruction, update_instruction, add_brand_voice, update_brand_voice. |
targetKind | La parte del motor que toca la edición: glossary_item, instruction o brand_voice. |
targetId | Para una acción update_*, el id de la entrada que se va a cambiar (gli_ / ins_ / bvc_). null para una acción add_*. |
targetLocale | El idioma al que aplica la sugerencia. |
payload | La edición lista para aplicar. Sus campos dependen de targetKind; es exactamente lo que necesita la operación de creación o actualización, por eso aplicarla no requiere más información de tu parte. |
reasoning | Una breve explicación de por qué se propone esta edición. |
sourceReviewLogIds | Los registros de revisión cuyos fallos motivaron la sugerencia (ids de esrl_); queda vacío cuando la sugerencia proviene de texto de comentarios. |
status | pending, applied o dismissed. |
appliedTargetId | La entrada creada o actualizada una vez que se aplica la sugerencia; null mientras sigue pendiente. |
El payload es el detalle que hace que aplicar sea barato: el cambio propuesto queda completamente estructurado en el momento de la generación, así que aplicarlo es una simple escritura, no otra ronda de IA. Tú decides; la plataforma no vuelve a razonar.
Aplicar una sugerencia#
POST /engine-suggestions/:id/applyEscribe el cambio propuesto en el motor y marca la sugerencia como applied. Esta es una escritura determinística del payload que ya viste en la lista; no hay una segunda llamada de IA, así que lo que revisaste es exactamente lo que se escribe. Una sugerencia add_* crea un nuevo elemento de glosario, una nueva instrucción o una nueva voz de marca; una sugerencia update_* cambia la entrada existente indicada 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 createdLa respuesta es la sugerencia en su estado applied, con appliedTargetId apuntando ahora a la entrada real del motor que creó o actualizó. A partir de ese momento, esa entrada es un elemento de glosario, una instrucción o una voz de marca normal: puedes abrirla, editarla o eliminarla como cualquier otra.
Aplicar cambia la configuración, no las traducciones anteriores
Aplicar edita la configuración del motor. El contenido ya traducido conserva su salida actual; el cambio aparece la próxima vez que el motor traduzca. Aplicar no vuelve a localizar nada por sí solo.
Descartar una sugerencia#
POST /engine-suggestions/:id/dismissDescarta una sugerencia que no quieres, marcándola como dismissed y dejando el motor intacto. Úsalo cuando una propuesta no sea adecuada para tu producto: el motor no cambia y la sugerencia deja de aparecer como pendiente.
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.El ciclo completo#
Los cuatro endpoints forman un ciclo completo que puedes manejar enteramente desde código: envías comentarios, lees lo que se propuso y confirmas las ediciones con las que estás de acuerdo.
Generar
POST …/suggestions/from-text con tus comentarios por escrito (o …/suggestions/generate para basarte en puntuaciones bajas de revisión). Recibes { "enqueued": true } de inmediato.
Listar
GET /engines/:id/suggestions un momento después para leer las sugerencias pendientes, cada una con su payload y reasoning.
Aplicar o descartar
POST /engine-suggestions/:id/apply para confirmar la edición o …/dismiss para descartarla. Al aplicarla, el cambio surte efecto en la siguiente traducción del motor.
