Troubleshooting

401 invalid_api_key

  • Key was revoked (Workspace → Virtual keys → Audit shows the event).
  • Key is from a different environment (sk_test_ vs sk_live_).
  • Wrong header (must be Authorization: Bearer …).

400 model_not_allowed

The workspace allowlist is on and the requested model isn't in it. Either add the model under Routing → Allowed models or call a model that's already allowed.

400 unknown_model

The slug isn't in the catalog. Check spelling. List allowed models via the dashboard.

402 no_vendor_key

No vault key configured for the vendor that owns this model. Workspace → Routing → Vault keys → add one.

402 subscription_inactive

Workspace's odnoga subscription is canceled or unpaid. Workspace → Pay odnoga.

402 budget_exhausted

Active window hit 100%. Wait for x-ratelimit-reset or raise the cap.

429 rate_limited

Vendor returned 429 and all fallback keys are cool-down. Back off using x-ratelimit-reset.

502 upstream_error

Vendor returned an error. Open the row in Requestserror_message carries the vendor's reason. Most common:

  • Anthropic credit balance is too low → top up vault key.
  • OpenAI model_not_found → the slug is stale; refresh catalog or pick a current one.

504 timeout

Vendor didn't respond in time. Retry with backoff. If a specific model is consistently slow, switch or add a fallback policy.

Headers look fine, analytics are empty

You're not setting x-airouter-end-user. Add it and traffic re-populates Top end users from the next call onward.

Streaming hangs after the first chunk

A proxy in front of your code is buffering. For Nginx: proxy_buffering off. For Vercel: stream with the correct response type.

Costs say $0 on every row

Every row is status = error — there were no tokens to bill. Look at error_code; once the call succeeds, cost populates.

Still stuck?

Grab the x-airouter-request-id from the failing call and share it with support. That row contains everything we need.