Skip to main content
All /v1/* errors use this envelope:
OpenAI / Gemini SDK routes return vendor-shaped errors. Native REST (/v1/run, /v1/account, etc.) uses the table below.

Error code catalog

Codes below match the live Public API (ApiErrorCode in apisale-service).

Examples

Concurrency (429):
Missing scope (403):

Run failures (HTTP 200)

Failed runs return status: "failed" with:
error.type uses the same machine-readable strings as error.code in HTTP errors.

Billing outcomes

apisale pre-holds the estimated amount when an accepted run starts. The final charge is created only when the run reaches succeeded / completed. Use the Run history in Console to see the final status and charged amount for each request. A pricing preview is an estimate; the completed run is the source of truth for the final amount.

Concurrency tiers

Parallel runs per organization (by lifetime paid): Enterprise overrides are set by apisale admins (concurrency_override).

Response headers

X-RateLimit-* appears only when an admin has set a per-key HTTP cap.

Client recommendations

  1. Branch on error.code, not HTTP status alone (429 = concurrency or optional rate cap)
  2. Poll GET /v1/account before burst traffic
  3. On insufficient_balance (402), pause billing workflows
  4. On content_policy_violation (451), do not blind-retry
  5. Exponential backoff on service_unavailable and concurrency_limit_exceeded