If a request failed, errored, or came back empty but you still see a charge, here's how OpenRouter's billing handles it and how to confirm what you actually paid.
Zero Completion Insurance
OpenRouter automatically waives the cost of a request when the model returns no usable output. It's on for every account and every model, and there's nothing to enable.
A request is waived (shows $0 on your Activity page) when either of these is true:
- The response has an error finish reason (or an error on the output), regardless of how many tokens were processed.
- The response has zero completion tokens and a blank, null, or "none" finish reason.
This holds even when the upstream provider charged us for processing your prompt. You still pay $0.
When you are still charged
The waiver only covers requests that produced no usable output. You'll still be billed in these cases:
- The model produced output. Any completion tokens, an audio response, or a generated image counts as valid output, so the request is billed normally even if the text looks short or unhelpful to you.
- Reasoning tokens. For reasoning models, the thinking tokens are billable (usually at the output rate) even when they aren't shown in the response.
- Separate plugin charges. Web search, file/PDF parsing, and the BYOK platform fee are billed on their own and aren't covered by the waiver, even if the inference step itself was waived.
Content moderation rejections happen before your request reaches a provider, so they're never charged in the first place.
How to check a specific request
Open your Activity page and click into the request. Waived requests show $0. If there's a non-zero cost, the breakdown shows where it came from — completion tokens, reasoning tokens, or a separate line for web search or file processing.
You can also pull the exact record with GET /api/v1/generation?id=... using the request's generation ID.
Charged for an empty or errored response anyway?
If a request returned an error or zero completion tokens and still shows a charge on Activity (and it isn't a separate plugin fee), that's not expected — contact support with the generation ID and we'll take a look.