App öffnen
Moonborn — Developers

Errors

Error-Envelope-Form, voller Error-Code-Katalog, Retry-Semantik und Rate-Limit-spezifisches Handling.

Jede Moonborn-Error-Response teilt dasselbe Envelope:

{
  "error": {
    "code": "rate_limited",
    "message": "Per-minute API rate limit exceeded.",
    "details": { "retryAfter": 12 }
  }
}

code ist ein stabiler, maschinenlesbarer String. message ist human-readable (sicher, in Logs zu zeigen; zeige es ohne Übersetzung nicht End-Usern). details trägt code-spezifische Felder, wenn relevant.

HTTP-Status-Code-Mapping

StatusWann
400malformed Request (Parse-Error, fehlendes Pflichtfeld)
401fehlender oder ungültiger Bearer-Token
403authentifiziert aber unauthorized (Scope oder Rolle unzureichend)
404Resource nicht gefunden
409Conflict — typischerweise Idempotency-Key-Collision, Drift-Block oder Persona-State-Machine-Refusal
422Validation-Error (Form gültig, Semantik nicht)
429Rate-Limited
500unerwarteter Server-Error
502/503/504Upstream-LLM-Provider-Problem; retry

Error-Code-Katalog

CodeStatusBedeutung
unauthorized401Bearer-Token fehlt oder abgelaufen
forbidden403Token gültig, unzureichender Scope/Rolle
not_found404Resource existiert nicht oder ist Caller nicht sichtbar
validation_failed422Request-Body-Form gültig, aber Wertebereich / Enum / Pflichtfeld-Mismatch
idempotency_conflict409Selber Idempotency-Key, anderer Payload
state_conflict409Resource-State-Machine verweigerte den Übergang (z. B. eine bereits gelöschte Persona archivieren)
drift_blocked409Drift-Detection action=block trippte auf dieser Antwort
audit_blocked409Audit-Verdict unter Schwelle; Persona im flagged-State zurückgegeben
moderation_blocked422Output failte Moderation; Antwort verweigert
rate_limited429Per-Tier-Rate-Cap getroffen; details.retryAfter (Sekunden) trägt den Cooldown
quota_exceeded429Monatsquota getroffen (z. B. Generation-Quota)
provider_error502Upstream-LLM-Provider-Failure; retry mit Backoff
provider_timeout504Upstream-LLM-Provider Timeout
internal_error500Unhandled Exception; bei uns geloggt

Retry-Semantik

Die SDKs auto-retryen diese Codes mit Exponential Backoff:

  • provider_error (5xx)
  • provider_timeout (504)
  • rate_limited (429) — ehrt Retry-After-Header

Diese Codes werden nie auto-retry'd:

  • validation_failed — fix den Request zuerst
  • idempotency_conflict — ändere den Key
  • drift_blocked / audit_blocked / moderation_blocked — Caller- Entscheidung

Idempotency-Key

Jeder Write-Request akzeptiert einen Idempotency-Key-Header. Replays innerhalb von 24 Stunden geben die Original-Response zurück. SDKs auto-generieren den Key per Default; überschreibe per-Call, wenn du einen deterministischen Business-Key hast (Idempotency-Key: order-12345).

Rate-Limit-Header

Jede Response (Erfolg oder Error) trägt:

X-RateLimit-Limit: 3000
X-RateLimit-Remaining: 2987
X-RateLimit-Reset: 1747498200

Nutze X-RateLimit-Remaining für Backpressure in deinem Client. Siehe Rate limits für Per-Tier-Caps.

Ehrlicher Scope

Wir tracken die Codes oben; wir bringen keine internen Exception- Typen, Stack-Traces oder Upstream-Provider-Error-Codes an die Oberfläche. Wenn du einen provider_error debuggst, trägt der Audit- Log (GET /v1/audit/events) das Upstream-Error-Envelope unter details.