Seznam úloh

Aktualizováno: minulé čtvrtletí · 4 min čtení

Webhooky a živý WebSocket vám dají vědět o úloze ve chvíli, kdy se dokončí. Jenže ani jedno nepomůže druhý den ráno, po nasazení nebo když potřebujete všechny jazyky, které za poslední hodinu selhaly. Ta chvíle už je pryč; událost je minulostí. Úlohy ale ne – každá z nich zůstává na platformě jako trvalý záznam ještě dlouho poté, co proces, který ji odeslal, doběhl dál.

GET /jobs/localization je způsob, jak se k těmto záznamům vrátit. Vrací vaše úlohy od nejnovějších, po stránkách procházených pomocí kurzoru, a umožňuje je zúžit podle engine, na kterém běžely, nebo podle stavu, v jakém skončily. Tohle je kanál pro dohledání: trvalý záznam, na který se ptáte, když jste nesledovali živé dění.

text
GET /jobs/localization

S async lokalizací teprve začínáte? Začněte s Přehled. Tato stránka předpokládá, že už máte úlohy, kterými se chcete probrat. Stejně jako každý endpoint se ověřuje pomocí vašeho X-API-Key.

Filtry a stránkování#

text
GET /jobs/localization?engineId=eng_abc123&status=completed&limit=20&cursor=...
ParametrTypPopis
engineIdstring (nepovinné)Vrátí jen úlohy, které běžely na tomto lokalizačním engine (eng_...).
statusstring (nepovinné)Vrátí jen úlohy v tomto stavu: queued, processing, completed, completed_with_warnings nebo failed.
limitnumber (nepovinné)Velikost stránky. Výchozí hodnota je 20, maximum 100.
cursorstring (nepovinné)Neprůhledný kurzor z nextCursor v předchozí odpovědi. Pro první stránku ho vynechte.

Oba filtry jsou nepovinné a dají se kombinovat: engineId=eng_abc123&status=failed vrátí selhané úlohy pro jeden engine a nic navíc. Přesně tak odpovíte na otázku, kterou si při incidentu opravdu položíte – ukaž mi všechno, co na tomto engine selhalo – aniž byste museli stahovat všechny úlohy v organizaci a filtrovat je na straně klienta.

cursor je pozice v proudu výsledků, ne číslo stránky. Nepočítáte ho, dostanete ho. Každá odpověď vrátí nextCursor a vy tuto hodnotu pošlete zpět, abyste načetli další stránku.

Odpověď#

Každá stránka obsahuje pole items a nextCursor. nextCursor je na poslední stránce null – to je ukončovací podmínka vaší smyčky, ne chyba.

json
{
  "items": [
    {
      "id": "ljb_C3d4E5f6G7h8I9j0",
      "groupId": "ljg_A1b2C3d4E5f6G7h8",
      "targetLocale": "ja",
      "status": "completed",
      "warnings": [],
      "createdAt": "2026-03-16T10:30:00.000Z",
      "completedAt": "2026-03-16T10:30:06.000Z"
    }
  ],
  "nextCursor": "eyJ0IjoiMjAyNi0wMy0xNlQxMDozMDowMC4wMDBaIiwiaSI6ImxqYl9CMmMzRDRlNUY2ZzdIOGk5In0"
}

Každá položka je jen souhrn – dost na to, abyste úlohu našli a přečetli si její výsledek: který jazyk, která skupina, jaký stav, kdy byla vytvořena a kdy dokončena. Záměrně neobsahuje přeložený výstup. Pokud chcete získat plné outputData a steps pro jednotlivé fáze jedné z těchto úloh, vezměte její id a zavolejte Získat jednu úlohu. Seznam slouží k nalezení, detail k přečtení.

Neznámé hodnoty status zpracovávejte bez pádů

Pracujte se známými hodnotami status a pro ostatní mějte výchozí větev, místo abyste při neznámé hodnotě shodili konzumenta. Tolerance k nerozpoznané hodnotě je bezpečný výchozí přístup pro jakýkoli řetězcový enum, který nevlastníte – udrží váš reader v chodu, místo aby vyhazoval chybu při vstupu, který neumí zařadit.

Projděte všechny výsledky po stránkách#

Ukončovací podmínka je tady to hlavní: pokračujte v požadavcích, dokud se nextCursor nevrátí jako null. Předejte nextCursor z jedné odpovědi jako cursor v další a smyčka se ukončí sama.

javascript
async function listFailedJobs(engineId) {
  const failed = [];
  let cursor = undefined; // first page: no cursor

  do {
    const url = new URL("https://api.lingo.dev/jobs/localization");
    url.searchParams.set("engineId", engineId);
    url.searchParams.set("status", "failed");
    url.searchParams.set("limit", "100"); // fewer round-trips
    if (cursor) url.searchParams.set("cursor", cursor);

    const response = await fetch(url, {
      headers: { "X-API-Key": process.env.LINGO_API_KEY },
    });

    const { items, nextCursor } = await response.json();
    failed.push(...items);
    cursor = nextCursor; // null on the last page -> loop ends
  } while (cursor);

  return failed; // every failed job for this engine
}

Když zvýšíte limit na 100, snížíte počet round-tripů u velkého backlogu; výsledek se nezmění, jen počet stránek, které musíte projít. Není tu žádný offset, který by se mohl rozjet, ani počet stránek, který by bylo potřeba držet synchronizovaný – kurzor nese vaši pozici a null vám řekne, kdy už jste přečetli všechno.

Další kroky#

Máte id úlohy. Kanál pro dohledání vás dovedl až sem; odsud si můžete přečíst výsledek nebo zapojit živé kanály, aby vám to příště neuniklo a viděli jste to v okamžiku, kdy se to stane.