Troubleshooting
401 invalid_api_key
- Key was revoked (Workspace → Virtual keys → Audit shows the event).
- Key is from a different environment (
sk_test_vssk_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 Requests — error_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.