If requests keep returning 401 or 403, first check that you're passing the key correctly in the Authorization header as 'Bearer sk-or-...'. A common mistake is copying the key with a trailing space or missing the prefix entirely. Regenerate the key in your dashboard if it still fails — old keys sometimes get invalidated after account changes.
This usually means you've hit the context limit or the model cut off due to max_tokens being set too low. Check your request parameters: set max_tokens to a higher value or leave it unset to let the model decide. Some models on the platform also have hard caps — check the model card before sending long prompts.
Payment goes through but the balance stays at zero. Wait two to three minutes and hard-refresh the billing page. If it still hasn't updated, check your email for a payment confirmation. Stripe sometimes delays the webhook. If the charge is confirmed but credits are missing, contact support with the transaction ID — they resolve it quickly.
You're sending requests faster than your tier allows. Either add exponential backoff in your code or upgrade your account limit. OpenRouter enforces per-minute and per-day limits separately, so you can hit a daily cap even if your per-minute rate looks fine.
Hard-refresh the page with Ctrl+Shift+R to clear cached JS. If the playground keeps hanging when switching models, try a different browser — there are known issues with Safari and some Chromium builds when the model list is large.
If you set stream: true but still get the full response at once, your HTTP client might be buffering. Disable response buffering explicitly, or check if a proxy sits between you and the API — corporate firewalls often buffer chunked transfer encoding.