Preskočiť na obsah
Sursa Developers

Chyby

Sursa používa stavové kódy HTTP na to, aby povedala, či požiadavka uspela, a stabilný chybový kód na to, aby povedala, prečo neuspela. Každá chybová odpoveď má rovnaký tvar:

{
  "detail": "the cursor is malformed or was issued for different filters",
  "error": {
    "code": "api.cursor_invalid",
    "message": "the cursor is malformed or was issued for different filters",
    "details": {"parameter": "cursor"},
    "request_id": "01JB7Q2M4X9V3K8T5N6P0R1S2A",
    "doc_url": "https://developers.sursa.com/errors/api.cursor_invalid"
  }
}
PoleVýznam
error.codeStabilný kód v tvare <area>.<reason>. Podľa neho vetvite svoj kód.
error.messageČitateľné vysvetlenie v angličtine. Jeho znenie sa môže kedykoľvek zmeniť; neanalyzujte ho.
error.detailsŠtruktúrované údaje o chybe, napríklad parameter, limit alebo kedy opakovať. Jeho polia závisia od kódu.
error.request_idID tejto požiadavky, rovnaké ako hlavička odpovede X-Request-Id.
error.doc_urlStránka o tomto kóde na tomto portáli.
detailStarší tvar chyby ponechaný pre existujúce integrácie. Nový kód by mal čítať error.

Každý kód má vlastnú stránku v časti Chybové kódy so stavovým kódom HTTP, poliami details a operáciami, ktoré ho vracajú. Stránka každej operácie v referencii API uvádza kódy, ktoré táto operácia môže vrátiť.

Stavové kódy HTTP

StavVýznam
200, 201, 202, 204Požiadavka uspela. 202 znamená, že bola prijatá a ešte sa spracúva.
400Požiadavka má nesprávny tvar: chybný parameter, kurzor, metadata alebo Idempotency-Key. Opravte požiadavku.
401Chýba platný kľúč. Pozri Autentifikácia.
402Dosiahol sa limit tarify organizácie, napríklad počet kariet alebo úložisko.
403Kľúč je platný, ale toto robiť nesmie: chýba rola, rozsah alebo funkcia tarify.
404Objekt neexistuje alebo ho kľúč nesmie vidieť.
409Požiadavka je v rozpore s aktuálnym stavom: duplicitné external_id, otvorená synchronizácia, stále prebiehajúca požiadavka s rovnakým Idempotency-Key.
410Platnosť objektu vypršala, napríklad nahrávania po 24 hodinách, alebo bola cesta vyradená.
413Telo alebo súbor je príliš veľký.
415Typ súboru nie je podporovaný alebo jeho obsah nezodpovedá názvu.
422Požiadavka má správny tvar, ale je neplatná: chýbajúce pole alebo hodnota mimo rozsahu.
429Príliš veľa požiadaviek alebo je vyčerpaná kvóta. Pozri Limity frekvencie a kvóty.
500, 502, 503, 504Problém na strane Sursy. Opakujte neskôr.

Chyby validácie

Pri 422 s kódom validation.failed uvádza detail každé pole, ktoré neprešlo validáciou, spolu s jeho umiestnením:

{
  "detail": [
    {"loc": ["body", "title"], "msg": "String should have at least 1 character", "type": "string_too_short"}
  ],
  "error": {"code": "validation.failed", "message": "request validation failed", "request_id": "01JB7…"}
}

Ktoré chyby opakovať

ChybaOpakovať?
Sieťová chyba alebo vypršanie časového limitu, žiadna odpoveďÁno, s rovnakým Idempotency-Key.
429Áno, po počte sekúnd z Retry-After.
500, 502, 503, 504Áno, s exponenciálne rastúcim oneskorením: 1 s, 2 s, 4 s… až do minúty, s náhodným rozptylom.
409 api.idempotency_in_progressÁno, po Retry-After: prvá požiadavka s týmto kľúčom ešte prebieha.
Akýkoľvek iný 4xxNie. Rovnaká požiadavka znova zlyhá; najprv ju opravte.

Požiadavky POST a PATCH opakujte len s Idempotency-Key, aby opakovanie po stratenej odpovedi nemohlo vytvoriť druhý objekt. GET, PUT a DELETE možno bezpečne opakovať tak, ako sú.

// Retries a request on network errors, 429 and 5xx. The same Idempotency-Key is sent on every attempt.
async function withRetries(send, attempts = 5) {
  for (let attempt = 1; ; attempt++) {
    let response;
    try {
      response = await send();
    } catch (error) {
      if (attempt >= attempts) throw error;
    }
    if (response && response.status !== 429 && response.status < 500) return response;
    if (attempt >= attempts) return response;
    const retryAfter = Number(response?.headers.get("Retry-After"));
    const backoff = Math.min(60, 2 ** (attempt - 1)) * (0.8 + Math.random() * 0.4);
    await new Promise((resolve) => setTimeout(resolve, 1000 * (retryAfter || backoff)));
  }
}

const key = crypto.randomUUID();
const response = await withRetries(() =>
  fetch("https://api.sursa.com/v1/cards/text", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.SURSA_API_KEY}`,
      "Content-Type": "application/json",
      "Idempotency-Key": key,
    },
    body: JSON.stringify({ title: "Refund policy", body_markdown: "Refunds take 14 days." }),
  }),
);

Nahlásenie problému

Každá odpoveď, úspešná aj neúspešná, má hlavičku X-Request-Id a každá chyba má rovnakú hodnotu v error.request_id. Zapisujte ju do logu spolu s vlastným záznamom o požiadavke. Keď sa na podporu obraciate v súvislosti s požiadavkou, pošlite jej ID požiadavky: vedie priamo k záznamu o tejto požiadavke.

Spracovanie neznámych kódov

Nové chybové kódy sa môžu objaviť v ktorejkoľvek verzii API. Neznámy kód spracujte podľa stavového kódu HTTP: neznámy 4xx ako požiadavku, ktorá v tejto podobe neuspeje, neznámy 5xx ako dočasný problém.