Hopp til innholdet
Sursa Developers

Feil

Sursa bruker HTTP-statuskoder for å si om en forespørsel lyktes, og en stabil feilkode for å si hvorfor den ikke gjorde det. Alle feilsvar har samme form:

{
  "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"
  }
}
FeltBetydning
error.codeStabil kode på formen <area>.<reason>. La koden din forgrene seg etter den.
error.messageEn lesbar forklaring på engelsk. Den kan omformuleres når som helst; ikke tolk den.
error.detailsStrukturerte fakta om feilen, for eksempel parameteren, en grense eller når du kan prøve på nytt. Feltene avhenger av koden.
error.request_idID-en til denne forespørselen, den samme som i headeren X-Request-Id i svaret.
error.doc_urlSiden om denne koden i denne portalen.
detailDen tidligere formen på feilen, beholdt for eksisterende integrasjoner. Ny kode bør lese error.

Hver kode har sin egen side under Feilkoder, med HTTP-statusen, feltene i details og operasjonene som returnerer den. Siden for hver operasjon i API-referansen viser kodene som operasjonen kan returnere.

HTTP-statuser

StatusBetydning
200, 201, 202, 204Forespørselen lyktes. 202 betyr at den er tatt imot og fortsatt behandles.
400Forespørselen er feilformet: en ugyldig parameter, cursor, metadata eller Idempotency-Key. Rett forespørselen.
401Ingen gyldig nøkkel. Se Autentisering.
402En grense i organisasjonens prisplan er nådd, for eksempel antall kort eller lagringsplass.
403Nøkkelen er gyldig, men har ikke lov til å gjøre dette: En rolle, et scope eller en funksjon i prisplanen mangler.
404Objektet finnes ikke, eller nøkkelen har ikke lov til å se det.
409Forespørselen er i konflikt med den nåværende tilstanden: en duplisert external_id, en åpen synkronisering, en forespørsel med samme Idempotency-Key som fortsatt kjører.
410Objektet er utløpt, for eksempel en opplasting etter 24 timer, eller ruten er faset ut.
413Brødteksten eller filen er for stor.
415Filtypen støttes ikke, eller innholdet stemmer ikke med navnet.
422Forespørselen er riktig formet, men ugyldig: et manglende felt eller en verdi utenfor tillatt område.
429For mange forespørsler, eller en kvote er brukt opp. Se Hastighetsgrenser og kvoter.
500, 502, 503, 504Et problem hos Sursa. Prøv på nytt senere.

Valideringsfeil

For 422 med koden validation.failed viser detail alle felt som ikke besto valideringen, hvert med sin plassering:

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

Hvilke feil du bør prøve på nytt

FeilPrøve på nytt?
Nettverksfeil eller tidsavbrudd, ingen svarJa, med den samme Idempotency-Key.
429Ja, etter så mange sekunder som Retry-After angir.
500, 502, 503, 504Ja, med eksponentiell backoff: 1 s, 2 s, 4 s og så videre opptil ett minutt, med tilfeldig jitter.
409 api.idempotency_in_progressJa, etter Retry-After: Den første forespørselen med denne nøkkelen kjører fortsatt.
Alle andre 4xxNei. Den samme forespørselen vil mislykkes igjen; rett den først.

Prøv POST- og PATCH-forespørsler på nytt bare med en Idempotency-Key, slik at et nytt forsøk etter et tapt svar ikke kan opprette et objekt til. GET, PUT og DELETE er trygge å prøve på nytt som de er.

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

Melde fra om et problem

Hvert svar, vellykket eller ikke, har en X-Request-Id-header, og hver feil har den samme verdien i error.request_id. Logg den sammen med din egen registrering av forespørselen. Når du kontakter brukerstøtten om en forespørsel, sender du ID-en til forespørselen: Den fører rett til registreringen av akkurat den forespørselen.

Håndtere koder du ikke kjenner

Nye feilkoder kan dukke opp i hvilken som helst versjon av API-et. Behandle en ukjent kode etter HTTP-statusen: en ukjent 4xx som en forespørsel som ikke vil lykkes slik den er, en ukjent 5xx som et midlertidig problem.