Skip to main content

Error codes

Every error response has the same shape:

{
"detail": "human-readable message",
"code": "machine_readable_code",
"request_id": "req_abc123",
"extra": { /* optional context */ }
}

The HTTP status is always set; code is stable and machine-readable (use it for retry decisions and branch logic). detail is human-readable and may change.

Auth & authz

StatusCodeCause
401not_authenticatedMissing or expired token
401invalid_tokenToken signature mismatch
403not_org_memberCaller isn't in the org
403permission_deniedRole doesn't allow the action
403cross_org_accessResource belongs to a different org
403org_archivedOrg has been soft-deleted; restore from the portal first
403feature_disabledThe route is gated behind a feature flag the org hasn't enabled

Resources

StatusCodeCause
404trace_not_foundUnknown trace id
404span_not_foundUnknown span id
404agent_not_foundUnknown agent id
404judge_not_foundUnknown judge id
404dataset_not_foundUnknown dataset id
404eval_not_foundUnknown eval id
404org_not_foundUnknown org id
404member_not_foundUnknown user id
404key_not_foundUnknown API key id

Validation

StatusCodeCause
400bad_requestGeneric 400 (rare — prefer a specific code)
422decode_failedIngestion body failed to decode
422invalid_promptLLM judge rubric failed schema validation
422invalid_thresholdThreshold percent outside 0 \< p \< 100
422invalid_frameworkFramework not in the known list
422replay_failedTrace replay diverged (upstream model gone, etc.)

Limits

StatusCodeCause
413payload_too_largeBody over 5 MiB
429rate_limitedPer-tenant RPM cap hit
429judge_quota_exceededPer-org LLM-as-judge budget hit
402payment_requiredCost hard limit hit, no overage budget
429seats_limit_exceededTrying to invite past the seats cap

Server-side

StatusCodeCause
500internal_errorUnexpected exception (server log has details)
502upstream_unavailablePostgres, Qdrant, or ClickHouse unreachable
503maintenancePlanned maintenance window (Retry-After always set)
504upstream_timeoutUpstream exceeded its SLA

Retry guidance

Code classRetry?Backoff
4xx (validation)No
401, 403No (after re-auth)
404No
429YesHonor Retry-After (seconds)
5xxYesExponential, 100ms → 1.6s, max 3 tries
502, 503, 504YesSame as 5xx

The SDKs implement the retry policy by default. To turn it off:

eden.configure(api_key=..., org_id=..., max_retries=0)

Request ID correlation

Every response (success or error) carries request_id. Quote it when opening a support ticket — it lets us grep the server log instantly.

$ curl -i ... | grep -i x-request-id
X-Request-ID: req_01HXYZABCDEF