Mine sisu juurde
Sursa Developers

Vead

Sursa näitab HTTP olekukoodiga, kas päring õnnestus, ja püsiva veakoodiga, miks see ei õnnestunud. Igal veavastusel on sama kuju:

{
  "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"
  }
}
VäliTähendus
error.codePüsiv kood kujul <area>.<reason>. Tehke oma koodis otsused selle järgi.
error.messageLoetav ingliskeelne selgitus. Selle sõnastus võib igal ajal muutuda; ärge seda parsige.
error.detailsStruktureeritud faktid vea kohta, näiteks parameeter, limiit või see, millal uuesti proovida. Selle väljad sõltuvad koodist.
error.request_idSelle päringu ID, sama mis vastuse päises X-Request-Id.
error.doc_urlSelle koodi leht selles portaalis.
detailVea varasem kuju, mis on alles olemasolevate integratsioonide jaoks. Uues koodis lugege välja error.

Igal koodil on oma leht jaotises Veakoodid: seal on koodi HTTP-olek, välja details väljad ja lõpp-punktid, mis selle tagastavad. API teatmikus loetleb iga lõpp-punkti leht koodid, mida see lõpp-punkt võib tagastada.

HTTP-olekud

OlekTähendus
200, 201, 202, 204Päring õnnestus. 202 tähendab, et päring võeti vastu ja selle töötlemine veel käib.
400Päring on vigane: vale parameeter, kursor, väli metadata või päis Idempotency-Key. Parandage päring.
401Kehtivat võtit ei ole. Vt Autentimine.
402Organisatsiooni paketi limiit on täis, näiteks kaartide arv või salvestusruum.
403Võti kehtib, kuid sellel ei ole lubatud seda teha: puudub roll, ulatus või paketi funktsioon.
404Objekti ei ole olemas või võtmel ei ole lubatud seda näha.
409Päring on vastuolus praeguse olekuga: korduv external_id, avatud sünkroonimine või veel pooleli olev päring, millel on sama Idempotency-Key.
410Objekti kehtivus on lõppenud, näiteks üleslaadimisel 24 tunni möödudes, või tee on kasutusest kõrvaldatud.
413Keha või fail on liiga suur.
415Failitüüpi ei toetata või faili sisu ei vasta selle nimele.
422Päring on õigesti vormistatud, kuid kehtetu: puudub väli või väärtus on lubatud vahemikust väljas.
429Päringuid on liiga palju või kvoot on ära kasutatud. Vt Sageduspiirangud ja kvoodid.
500, 502, 503, 504Probleem on Sursa poolel. Proovige hiljem uuesti.

Valideerimisvead

Kui vastus on 422 koodiga validation.failed, loetleb detail kõik väljad, mis valideerimist ei läbinud, ja iga välja asukoha:

{
  "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…"}
}

Milliseid vigu tasub uuesti proovida

VigaKas proovida uuesti?
Võrguviga või ajalõpp, vastust ei tulnudJah, sama päisega Idempotency-Key.
429Jah, kui päises Retry-After antud sekundid on möödunud.
500, 502, 503, 504Jah, eksponentsiaalse ooteajaga: 1 s, 2 s, 4 s… kuni minutini, juhusliku hajutusega.
409 api.idempotency_in_progressJah, kui päises Retry-After antud aeg on möödunud: esimene selle võtmega päring on veel pooleli.
Mis tahes muu 4xxEi. Sama päring ebaõnnestub uuesti; parandage see kõigepealt.

Korrake päringuid POST ja PATCH ainult päisega Idempotency-Key, et korduskatse pärast kaotsi läinud vastust ei saaks luua teist objekti. Päringuid GET, PUT ja DELETE võib turvaliselt korrata muutmata kujul.

// 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." }),
  }),
);

Probleemist teatamine

Igal vastusel, nii edukal kui ka vigasel, on päis X-Request-Id ja igal veal on sama väärtus väljal error.request_id. Logige see koos oma kirjega päringu kohta. Kui pöördute päringu asjus toe poole, saatke selle päringu ID: see viib otse selle päringu kirjeni.

Tundmatute koodide käsitlemine

Uued veakoodid võivad ilmuda API mis tahes versioonis. Käsitlege tundmatut koodi selle HTTP-oleku järgi: tundmatu olek 4xx tähendab päringut, mis sellisel kujul ei õnnestu, ja tundmatu olek 5xx ajutist probleemi.