OpenRouter 402 with credits left vs Sume 402 on reserve
OpenRouter can return 402 with a positive balance when the in-flight budget is full. Sume's 402 means the estimate could not be reserved. Telling them apart.

Yes, OpenRouter can return 402 while your balance is positive. Its docs say each paid request's token cost is estimated up front and held against an in-flight spending budget, and a request that does not fit is rejected with 402 before it reaches a provider. Read error.metadata.limit_source to see which limit you hit. Sume's 402 is a different check: it fires when the estimated cost cannot be reserved from the workspace balance.
How does OpenRouter's in-flight budget work?
Per the OpenRouter limits page read 2026-10-01, the estimate is the input tokens plus the completion tokens allowed by max_tokens, capped per request. The total held at once is a fraction of your credit balance, up to a fixed ceiling. The estimate is replaced by actual cost for a short settlement window, then released.
| limit_source | Meaning in the docs |
|---|---|
openrouter_in_flight_budget | Running and recent requests fill the budget; wait for Retry-After |
openrouter_key_limit | The API key's credit limit is exhausted |
openrouter_credits | Balance cannot cover the request, or one request is too expensive for the budget |
What does Sume's 402 mean?
402 insufficient_credits means Sume cannot reserve the estimated generation cost from the workspace balance. Per Generation admission, the submit fails before provider work starts. The fix there is to upgrade the plan, wait for included Gen$, or submit a cheaper request.
How do I tell the two apart in a client?
Branch on structured fields, not on the word "credits". For OpenRouter use limit_source and honor Retry-After for the in-flight case; its docs say not to branch on the hint text. For Sume, read the error code insufficient_credits. Before submitting, GET /v1/balance returns the USD-denominated available balance, and GET /v1/usage lists reservations, captures and refunds.
Why does a reserve exist at all?
Provider-backed generation can reserve estimated USD-denominated usage, capture actual cost on success, and refund on failure or cancellation before capture. Both systems hold money against an estimate; they differ in what the hold is measured against. For the sibling case on a different vendor, see HeyGen's insufficient-credit 402 vs Sume's code.
Sources
Related posts
More in Developers
- OpenRouter audio/speech returns bytes; Sume TTS returns a job
OpenRouter's /audio/speech streams raw audio bytes. Sume's TTS Router returns a job id and a media URL, so a byte-stream client needs a poll step.
- OpenRouter base64 input_audio vs Sume STT 1.0 audio_url
OpenRouter transcription takes base64 audio inside the JSON body. Sume STT 1.0 takes an audio_url instead, so you host the file and send a link.
- OpenRouter Batch API vs Sume async jobs: which for video?
OpenRouter's Batch API is for text and embeddings with a 24 hour window. For video files, Sume returns a job id per request: async, sync, or webhook mode.
- OpenRouter batch custom_id vs one Sume Idempotency-Key per job
OpenRouter's Batch API needs a custom_id unique within each batch. Sume has no batch envelope for these submits: give each job its own Idempotency-Key.
Written by Sume