LIVE · AUDIT-KEDJA · EU-VÄRD
SYSTEM · 99,99 % DRIFTSTID
v 1.0 ↗ TILLVERKAT I EU

Fel + hastighetsgränser

Ett felkonvolut för varje endpoint. Standard HTTP-statuskoder + en strukturerad code-sträng för programmatisk matchning. Rate-limit-headers på varje svar så att du kan hålla ett jämnt tempo innan du träffar en 429.

Felkonvolut

{
  "detail": "Human-readable summary.",
  "code": "billing.subscription_past_due",
  "field_errors": {
    "scheduled_for": ["Must be a future ISO 8601 timestamp."]
  }
}
  • detail — alltid närvarande, säker att visa för människor (den är översatt där språket är tillgängligt).
  • code — närvarande för särskiljbara feltillstånd. Stabil mellan API-versioner; matcha på denna för retry-logik.
  • field_errors — närvarande endast vid 400-valideringsfel. Map av fältnamn → lista med meddelanden.

Matris över statuskoder

StatusKlassOmförsök?Vanliga orsaker
400ValideringNejObligatoriskt fält saknas, felaktigt format, brott mot affärsregel
401AutentiseringNejSaknad / felaktig / återkallad credential
402FaktureringNejPrenumeration förfallen, gräns för gratisplan nådd
403BehörighetNejCredentialen saknar scope, eller resursen ligger i en annan org
404Hittades inteNejResursen finns inte, eller är inte synlig för din credential
409KonfliktIblandFelmatchad återanvändning av Idempotency-Key, brott mot tillståndsmaskin
422ObehandlingsbarNejSemantiskt ogiltig kombination av giltiga fält
429HastighetsbegränsadJa, med backoffPer-credential- eller per-org-strypning nådd
500ServerfelJa, med backoffOväntat — öppna ett ärende om det kvarstår
502 / 503 / 504ÖvergåendeJa, med backoffUppström / deploy / belastning

Noterbara felkoder

KodStatusVad det betyder
billing.subscription_past_due402Orgens Stripe-prenumeration är förfallen. Hänvisa admin till /admin/billing.
billing.free_plan_minutes_exhausted402Free-/Pilot-nivån har använt sina 5 inspektioner.
billing.signature_pack_exhausted402Signaturpaketets credits är förbrukade; betala per signatur eller köp ett nytt paket.
permission_denied403Credentialen saknar scopet. Se field_errors.required_scope.
idempotency.key_mismatch409Samma nyckel, annan body. Använd en ny nyckel.
session.already_ended409Anrop av end på en icke-öppen session (vanligtvis ofarligt — end är idempotent, detta är för edge-fallen).
kyb.not_verified403QES-signatur begärd på en org som inte har klarat KYB.
rate_limited429Per-credential- (60 rpm) eller per-org- (600 rpm) strypning nådd.

Rate-limit-headers

Varje svar — lyckat eller fel — bär med sig strypningstillståndet:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 47
X-RateLimit-Reset: 1716461235
  • X-RateLimit-Limit — taket som gäller för detta anrop.
  • X-RateLimit-Remaining — hur många anrop som återstår i det aktuella fönstret.
  • X-RateLimit-Reset — Unix-tidsstämpel då Remaining nollställs.

Vid en 429 sätts även Retry-After (i sekunder) enligt RFC 6585.

Strypnings-scopes

ScopeGränsFönster
Per credential601 minut
Per org (över alla credentials)6001 minut

Burst-bar under minutens första sekund. Träffa taket och ytterligare anrop inom fönstret ger 429.

Retry-strategi

Exponentiell backoff med jitter för 429 / 5xx; gör inte omförsök på 4xx (utöver 408, 425, 429):

async function withRetry<T>(fn: () => Promise<T>, max = 5): Promise<T> {
  let lastErr: unknown;
  for (let i = 0; i < max; i++) {
    try {
      return await fn();
    } catch (err: any) {
      const status = err?.status;
      if (status >= 400 && status < 500 && ![408, 425, 429].includes(status)) {
        throw err; // not retryable
      }
      const base = status === 429 ? (err.retryAfterMs ?? 1000) : 250 * 2 ** i;
      const jitter = Math.random() * base * 0.2;
      await new Promise((r) => setTimeout(r, base + jitter));
      lastErr = err;
    }
  }
  throw lastErr;
}

SDK:erna implementerar detta internt vid 429 + 5xx; om du hellre vill hantera omförsök själv, sätt retries: 0 i SDK-alternativen.

Felkorrelation

Varje svar bär med sig en X-Request-Id-header (UUID). Ange den i alla supportärenden — vi kan dra fram hela request-spåret enbart från det id:t.

Vad händer härnäst