This page documents every error code returned by the three Arbitex services — Platform (gateway + admin API), Cloud (portal API), and Outpost (proxy + admin API). Each entry includes the error code, HTTP status, which service produces it, what triggers it, and how to resolve it.
The gateway and outpost proxy use a nested error object matching the OpenAI error format:
{
"error": {
"message": "Rate limit exceeded. Retry after 2026-03-08T14:33:00Z.",
"type": "rate_limit_error",
"code": "quota_exceeded"
}
}
The type field classifies the error category. The code field (when present) provides a machine-readable identifier. Some errors include additional fields like rule_id.
The Cloud service uses a flat envelope with a status-derived error code:
{
"error": "forbidden",
"detail": "API key has been revoked"
}
The error field maps directly from the HTTP status code. The detail field provides a human-readable description.
The Platform and Outpost admin APIs use the standard FastAPI format:
{
"detail": "Invalid credentials"
}
Some Platform middleware endpoints add extra fields:
{
"detail": "MFA verification required to access this resource",
Verify the key exists in Settings > API Keys. Check for leading/trailing whitespace. Ensure the arb_live_ or arb_test_ prefix is present.
authentication_error
401
Authorization header missing or invalid. JWT validation failed (expired, bad signature, unknown kid).
For API key auth: include Authorization: Bearer <key> or X-API-Key: <key>. For JWT auth: ensure the token is not expired and the JWKS endpoint is reachable.
authentication_error
403
JWT missing required scope for the requested resource.
Check that the JWT contains the required scopes. Review the OAuth client’s configured scopes in Settings > OAuth Clients.
Policy Engine terminal action is BLOCK. The rule_id field identifies which rule matched.
This is not retriable — the same request will be blocked until the policy changes. Review the matched rule in Admin > Policy Engine. Check user group membership and model access rules.
dlp_violation
403
DLP pipeline detected sensitive content and the action is BLOCK or CANCEL. Applies to both input and output scanning.
Review the DLP rules that triggered the block. If the content was a false positive, adjust the DLP rule’s sensitivity or add an exception. Check X-DLP-Action header for the specific action taken.
Inspect X-RateLimit-Reset header for window reset time. Implement exponential backoff. Contact your admin to adjust rate limits if consistently hitting caps.
rate_limit_error
429
Outpost-local rate limit exceeded.
Check Retry-After header. The outpost enforces its own rate limits independently of the platform. Adjust outpost rate limit configuration in RATE_LIMIT_* environment variables.
budget_exceeded
429
Monthly dollar cap or request cap exceeded on the outpost. X-Budget-Status: exceeded header is set.
Budget limits are configured per-outpost. Review budget settings in the outpost admin panel or adjust BUDGET_* environment variables. Limits reset at the configured period boundary.
All providers in the routing/fallback chain failed (5xx, connection error, or timeout from upstream).
Retry with exponential backoff. Check provider health at GET /api/providers/health. Review your fallback chain configuration. If persistent, the upstream provider may be experiencing an outage.
providers_disabled
503
Every provider for the requested model is disabled by local admin override on the outpost.
Check outpost overrides in the admin panel. Re-enable at least one provider for the model.
override_error
503
A routing override references a provider name not present in the policy bundle.
Remove or correct the override in the outpost admin panel. Ensure the provider name matches exactly (case-sensitive).
model_not_found / invalid_request_error
400/404
The requested provider/model-id is not recognized, not available for your organization, or not in the policy bundle.
Verify the model ID format (provider/model-id). Check available models at GET /v1/models or in the model catalog.
The outpost emergency kill switch is active. All requests are rejected.
The local admin has activated the kill switch. Contact your outpost administrator to restore service via POST /admin/api/override/kill-switch with active: false.
service_unavailable
503
The outpost has not yet loaded a policy bundle from the platform.
Wait for the outpost to complete its initial sync. Check outpost logs for policy bundle sync errors. Verify the PLATFORM_MANAGEMENT_URL is correct and reachable.
internal_error
500
Proxy router not initialized or unexpected internal error.
This indicates an outpost startup issue. Check outpost logs. Restart the outpost if the error persists.
Check the request body against the API specification. Ensure all required fields are present and correctly typed.
unauthorized
401
Missing or invalid authentication. No Bearer JWT or X-API-Key header provided, or the token is expired/invalid.
Include a valid Portal JWT (Authorization: Bearer <token>) or API key (X-API-Key: <key>). If the JWT expired, re-authenticate through the portal login flow.
forbidden
403
Access denied. Common causes: API key revoked, API key expired, JWT org_id mismatch (IDOR prevention), insufficient role, missing scopes.
Check that the API key is active and not expired. Verify the JWT’s org_id matches the URL’s {org_id} parameter. Ensure the authenticated user has the required role (e.g., org_admin for write operations).
not_found
404
Resource not found. The org, outpost, notification, job, or other referenced resource does not exist or belongs to a different org.
Verify the resource ID. Check that the org is active (not cancelled). Ensure the org_id in the URL matches the authenticated context.
conflict
409
Conflict — typically a duplicate resource creation (e.g., registering an outpost with a name that already exists).
Use a different identifier or check if the resource already exists before creating.
validation_error
422
Request body failed schema validation (Pydantic). The detail field contains specific field-level error messages.
Review the validation errors in detail. Fix the request body to match the expected schema.
rate_limit_exceeded
429
Org-level rate limit exceeded (per-plan). Response includes limit, reset_at, and message fields.
Implement exponential backoff. Check the reset_at timestamp in the response. Rate limits are per-plan — contact sales to increase limits.
internal_error
500
Unhandled server error.
Retry once. If persistent, this is a server-side bug — contact support with the request ID.