|
Документация
Заказать демоПлатформа
ПлатформаMCPCLIAPI
Процессы
РуководстваЖурнал изменений

Добро пожаловать

  • Обзор
  • Аутентификация
  • Ошибки и коды статуса
  • Подписи webhook

Локализация

  • Обзор
  • Создать задачи
  • Заблокировать непереводимые ключи
  • Отслеживание группы заданий
  • Получить одно задание
  • Список заданий
  • Доставка через вебхук
  • Прогресс в реальном времени (WebSocket)

Пайплайн

  • Обзор
  • AI-редактирование перед локализацией
  • Проверка человеком
  • AI-оценка (post-edit)
  • Перефразирование для естественного звучания
  • Проверка обратным переводом
  • Настройка пайплайна
  • Как отслеживать запуски пайплайна

Развёртывание

  • Обзор
  • Создать задание развёртывания
  • Типы источников
  • Что извлекает AI
  • Доставка webhook
  • Прогресс в реальном времени (WebSocket)

Синхронный

  • Локализация
  • Распознавание

Управление движком

  • Предложения для движка

Получить одно задание

Получите переведённый результат для одной локали и историю по каждому этапу его получения.

К этому эндпоинту обращаются, когда у вас уже есть jobId — он приходит в ответе 202 from create, передаётся через webhook или указан в группе заданий. Эндпоинт группы показывает, сколько локалей уже готово. Этот эндпоинт показывает, что получилось для одной конкретной локали и что происходило по пути.

text
GET /jobs/localization/:jobId

Если вы только знакомитесь с асинхронной локализацией, начните с раздела Обзор.

В этом и есть смысл всей страницы. Ответ группы — это табло: счётчики и статусы по заданиям, о них рассказано на странице группы заданий. А одно задание — это полная история по одной локали: переведённый outputData, финальный status, любые warnings и цепочка steps[] всех этапов, которые выполнил пайплайн. Когда вам нужно записать немецкий текст в свою базу данных, именно этот вызов его и вернёт.

Аутентификация#

Передайте API-ключ в заголовке X-API-Key. Ключи привязаны к организации и дают доступ ко всем движкам в её пределах. Подробности см. в разделе Authentication.

Ответ#

Поле outputData повторяет структуру входного data: все строковые значения переведены, а все нестроковые значения (числа, булевы значения, null) сохранены на своих местах. Те же ключи, та же вложенность, тот же порядок в массивах — меняются только строки.

json
{
  "id": "ljb_A1b2C3d4E5f6G7h8",
  "groupId": "ljg_A1b2C3d4E5f6G7h8",
  "targetLocale": "de",
  "status": "completed",
  "outputData": {
    "id": "course_101",
    "title": "Einführung in maschinelles Lernen",
    "steps": [
      { "heading": "Was ist ML?", "body": "Maschinelles Lernen ist ein Teilbereich der künstlichen Intelligenz." },
      { "heading": "Überwachtes Lernen", "body": "Trainieren eines Modells mit gelabelten Daten." }
    ],
    "metadata": { "author": "Dr. Smith", "difficulty": "beginner" }
  },
  "errorMessage": null,
  "warnings": [],
  "callbackStatus": "delivered",
  "createdAt": "2026-03-16T10:30:00.000Z",
  "startedAt": "2026-03-16T10:30:01.000Z",
  "completedAt": "2026-03-16T10:30:04.000Z",
  "steps": [
    {
      "stepId": "localize",
      "type": "action",
      "status": "completed",
      "errorMessage": null,
      "externalRefType": null,
      "externalRefId": null,
      "externalRefUrl": null,
      "createdAt": "2026-03-16T10:30:01.000Z",
      "startedAt": "2026-03-16T10:30:01.000Z",
      "completedAt": "2026-03-16T10:30:04.000Z"
    }
  ]
}

Блок metadata выше сохранился без изменений: Dr. Smith и beginner — это нестроковые листья, которые движок оставил как есть. Полученный outputData соответствует форме отправленных данных, поэтому тот же код, который собрал payload, может обработать и перевод.

ПолеОписание
idID этого задания (ljb_…). Значение, которое вы передали в path.
groupIdРодительская группа заданий (ljg_…), к которой относится это задание. Передайте её в эндпоинт группы заданий, чтобы сразу увидеть все соседние локали.
targetLocaleBCP-47 локаль, на которую переведено это задание — для каждой целевой локали создаётся отдельное задание. Именно по этому полю вы ветвите логику, чтобы направить outputData в нужный столбец или файл.
statusqueued, processing, completed, completed_with_warnings или failed.
outputDataПереведённый контент, соответствующий структуре входных данных. Присутствует, когда status равно completed или completed_with_warnings.
errorMessageОписание ошибки. Присутствует, когда status равно failed, в противном случае — null.
warningsНекритичные сбои этапов пайплайна. Каждая запись — это { step, message }. Пусто, если только status не равно completed_with_warnings.
callbackStatusСостояние доставки webhook: pending, delivered или failed. null, если URL для обратного вызова не настроен.
createdAtКогда задание было принято (временная метка из 202, которым оно было создано).
startedAtКогда движок начал переводить эту локаль. Устанавливается, как только задание выходит из состояния queued.
completedAtКогда задание достигло финального состояния. Устанавливается, как только status становится completed, completed_with_warnings или failed.
stepsИстория выполнения по этапам. Всегда содержит этап localize, а также по одной записи для каждого включённого необязательного этапа пайплайна. Полная структура записи — в Observe pipeline runs.

outputData равен null, пока задание не завершится

Пока status равно queued или processing, outputData пуст, а errorMessage равно null — читать пока нечего. Читайте outputData только после того, как status достигнет значения completed или completed_with_warnings; при failed вместо этого читайте errorMessage. Сначала ветвите логику по status, а уже потом обращайтесь к payload.

Значения статуса задания#

Задание переходит из queued в processing, а затем — ровно в одно финальное состояние. Прежде чем читать что-либо ещё, проверьте status — оно показывает, какие поля заполнены.

СтатусЧто означаетЧто читать
queuedПринято, но ещё не запущено.Пока ничего — опрашивайте или дождитесь webhook.
processingДвижок переводит эту локаль.Пока ничего.
completedПеревод завершён, все включённые этапы прошли успешно.outputData.
completed_with_warningsПеревод завершён, и outputData готов, но один из некритичных этапов пайплайна не отработал.Сначала outputData, затем warnings.
failedЗадание не дало перевода.errorMessage.

completed_with_warnings всё равно возвращает перевод

completed_with_warnings — это не мягкий сбой. Вы получаете полный outputData — основной этап перевода завершился успешно. Изменилось только одно: некритичный этап (например, pre-edit или back-translation) не завершился, и каждый такой сбой записан в warnings как { step, message }. Считайте результат пригодным к использованию, а warnings — сигналом качества, который стоит показать тому, кто выполняет проверку переводов. Только failed означает, что читать перевод не из чего.

Обрабатывайте неизвестные значения статуса

Пять значений статуса выше — это текущий контракт. Этапы пайплайна развиваются, поэтому воспринимайте status как открытое множество: ветвите логику по известным значениям, а всё неожиданное направляйте в ветку по умолчанию, которая читает outputData, если оно есть, и в противном случае пишет в лог. switch без запасного варианта — именно та строка, которая сломается в день появления нового состояния.

Массив steps#

steps[] — это история этапов одного задания: по одной записи на каждый этап, который выполнил движок, в порядке выполнения. Каждое задание содержит как минимум этап localize, потому что базовый перевод выполняется всегда. Каждый включённый необязательный этап пайплайна добавляет ещё одну запись. Поэтому задание без дополнительных этапов содержит только один этап localize, а задание с включёнными pre-edit и back-translation — уже три.

Именно это делает задание проверяемым, а не чёрным ящиком. Вам не нужно верить, что этап отработал, — вы читаете его запись: какой это был этап (stepId), был ли он completed, failed или skipped, сколько стоил (costUsd) и когда начался и закончился. Для этапов с ручной проверкой externalRef* указывает на внешнюю запись.

json
"steps": [
  {
    "stepId": "preEdit",
    "type": "action",
    "status": "completed",
    "errorMessage": null,
    "costUsd": 0.0012,
    "createdAt": "2026-03-16T10:30:01.000Z",
    "completedAt": "2026-03-16T10:30:02.000Z"
  },
  {
    "stepId": "localize",
    "type": "action",
    "status": "completed",
    "errorMessage": null,
    "costUsd": 0.0184,
    "createdAt": "2026-03-16T10:30:02.000Z",
    "completedAt": "2026-03-16T10:30:05.000Z"
  }
]

Запись failed здесь не обязательно означает сбой всего задания. Когда некритичный этап завершается с ошибкой, в его записи steps[] указано failed, тот же сбой появляется в верхнеуровневом поле задания warnings, а само задание всё равно доходит до состояния completed_with_warnings с полным outputData. Полная структура записи — каждое поле, каждый stepId, семантика completed/failed/skipped — описана на одной канонической странице: Observe pipeline runs. Эта страница показывает, где найти эти данные у задания; та страница задаёт спецификацию.

Чтение завершённого задания#

Обычно клиент сначала ветвит логику по status, при успехе записывает outputData, а при сбое пишет в лог errorMessage. Вызов ниже можно просто скопировать и вставить — он вернёт payload, показанный выше.

javascript
const jobId = "ljb_A1b2C3d4E5f6G7h8";
const response = await fetch(`https://api.lingo.dev/jobs/localization/${jobId}`, {
  headers: { "X-API-Key": process.env.LINGO_API_KEY },
});

const job = await response.json();

switch (job.status) {
  case "completed":
  case "completed_with_warnings":
    // outputData is populated; warnings may carry non-critical stage failures
    await db.content.update({
      where: { id: job.outputData.id },
      data: { [`content_${job.targetLocale}`]: job.outputData },
    });
    if (job.warnings.length) console.warn(job.targetLocale, job.warnings);
    break;
  case "failed":
    console.error(`${job.targetLocale} failed: ${job.errorMessage}`);
    break;
  default:
    // queued or processing - nothing to read yet; also catches future states
    break;
}

Polling или push

Этот эндпоинт показывает состояние на конкретный момент времени. Для большинства заданий движку требуется 2–8 секунд на локаль, поэтому при polling разумно начать с интервала в 2 секунды. Чтобы вообще не использовать polling, зарегистрируйте webhook и запрашивайте задание только тогда, когда он сообщит, что локаль готова, или следите за всей группой через WebSocket. В любом случае финальное значение GET здесь — это каноничное чтение outputData.

Если этот эндпоинт возвращает ошибку — неизвестный jobId, отсутствующий ключ, — он использует стандартную JSON-модель ошибок. См. Errors and status codes.

Следующие шаги#

Отслеживать группу заданий
Смотрите агрегированные счётчики и обрабатывайте частичные сбои по всем локалям
Список заданий
Просматривайте задания постранично с курсорной пагинацией и фильтрацией по статусу или движку
Прогресс в реальном времени (WebSocket)
Получайте статус по каждой локали по мере завершения заданий без polling

Эта страница была полезной?

Max PrilutskiyMax Prilutskiy·Обновлено 12 дней назад·6 минут чтения