Model billing facts
GET /v2/models and the model detail response include billing.charges_on_policy_rejection. This describes a policy refusal, not every failure or a price estimate.
Compare these strings explicitly:
"no" is truthy in Python and JavaScript. Treat any unrecognized value as unknown. A request refused for lack of credits reports insufficient_credits.
Reconcile charges
Provider payloads may include their own cost or usage numbers; those are not the Comfy charge.X-Comfy-Credits-Used is available only for some models and successful responses. When Router replays a result for the same Idempotency-Key, it repeats the original header with Idempotent-Replayed: true. The call is still charged once, so do not count a replayed header again. An absent header does not mean the call was free. Use workspace usage and invoices for reconciliation, and preserve the request ID when investigating a charge.
Next
- Limitations: what Router does and does not report about charges.
- Errors and retries: retry without creating a second billable call.