Eridian

Errors

HTTP status codes, error objects, and retry guidance.

Eridian returns structured errors on every failed request. The body is stable across REST and SDKs. Correlate with logs using error.request_id and X-Eridian-Request-Id (they match).

Error Object

HTTP/1.1 429 Too Many Requests
Content-Type: application/json
X-Eridian-Request-Id: axm_req_8f3a2b1c
X-Eridian-RateLimit-Reset: 1718400060
{
  "error": {
    "type": "eridian.error",
    "code": "rate_limit_exceeded",
    "message": "Project prj_legal_001 exceeded 300 requests per minute.",
    "request_id": "axm_req_8f3a2b1c",
    "doc_url": "https://geteridian.com/docs/rate-limits",
    "param": null
  }
}

object is omitted on errors. SDKs throw EridianError with these fields.

Status Codes

HTTPCodeRetryMeaning
400invalid_requestNoBody failed schema validation
400missing_project_idNoproject_id missing from body and header
400template_variable_missingNoRequired template variable absent
401invalid_api_keyNoKey missing, revoked, or malformed
403insufficient_scopeNoKey lacks the required scope
403project_archivedNoProject no longer accepts inference
403residency_violationNoRequest region conflicts with pin
403dual_control_requiredNoMutation queued for second approver
403connector_disabledNoOps scan against a disabled connector
403git_host_forbiddenNoDev Git app cannot comment
404not_foundNoUnknown ID
404record_not_retainedNoZDR or retention clock expired
408routing_timeoutYesGPT and Gemini hops exceeded timeout
409idempotency_conflictNoSame Idempotency-Key, different body
409template_version_conflictNoVersion already published
409repository_not_indexedNoDev index not ready
409diff_too_largeNoDev review diff over cap
409matter_closedNoLegal write on a closed matter
409query_window_too_largeNoOps log window over cap
409segregation_of_dutiesNoRisk assignee equals reviewer
409evidence_immutableNoRisk evidence bytes cannot be patched
413document_too_largeNoRAG upload exceeds tier limit
422structured_output_failedNoSchema invalid after retries
422pii_redaction_failedMaybeRedaction engine timed out
429rate_limit_exceededYesRequest or token window exhausted
429budget_exceededNoMonthly hard stop
500internal_errorYesUnexpected gateway failure
503model_unavailableYesNo healthy GPT, Gemini, or private hop
503cache_unavailableNo retry neededRequest proceeds uncached when documented

Retry Guidance

Retry only when the table says Yes, and only with exponential backoff plus jitter.

AttemptDelay
1250ms
21s
34s
StopSurface the error to the caller

Honor Retry-After and X-Eridian-RateLimit-Reset on 429. Do not retry POST /v1/inference without an Idempotency-Key; a retry without the header can double-spend.

Python

from eridian import Eridian
from eridian.errors import EridianError, RateLimitError

client = Eridian(api_key="eridian_sk_...", max_retries=3)

try:
    client.inference.create(
        model="auto",
        project_id="prj_legal_001",
        messages=[{"role": "user", "content": "Summarize."}],
    )
except RateLimitError as exc:
    print(exc.request_id, exc.code)
except EridianError as exc:
    raise

TypeScript

import { Eridian, EridianError } from "@eridian/sdk";

const client = new Eridian({ apiKey: process.env.ERIDIAN_API_KEY!, maxRetries: 3 });

try {
  await client.inference.create({
    model: "auto",
    projectId: "prj_legal_001",
    messages: [{ role: "user", content: "Summarize." }],
  });
} catch (error) {
  if (error instanceof EridianError) {
    console.error(error.code, error.requestId);
  }
  throw error;
}

See Idempotency and Rate Limits.

Production API credentials are issued with an institution workspace. Contact sales if you need access.