Sume MCP generation_admission_rejected: read the preview first
generation_admission_rejected means the admission preview would not accept the request. Read the preview, then change the request or wait before retrying.

A Sume paid MCP call fails with generation_admission_rejected when the generation admission preview says it would not accept the request. The error carries the whole preview, so read it, change the request or wait, and only then retry; do not strip your spend cap to get past it.
Where it is thrown
Paid creates on the hosted MCP price the request with the admission preview before they submit. If the preview does not report that it would accept the request, the call stops with this code and returns the preview object. The same check guards the fixed-price path and the avatar preview-to-video step, so you can meet it from several tools. Nothing has been submitted when it fires.
| Code | Cause | Right response |
|---|---|---|
| generation_admission_rejected | preview would not accept the request | read the preview, change the request |
| max_spend_exceeded | estimate above max_spend_usd | raise the cap deliberately or shrink the job |
| missing_usage_estimate | no integer micros estimate | stop; fix the request |
| insufficient_credits (HTTP 402) | balance too low | add credits; do not loop |
| queue_full (HTTP 429) | queue at capacity | wait, then retry |
What to read in the preview
Do not parse prose. Keep the preview as data and show the agent the fields it needs: whether it would be accepted, the usage estimate, and any adjustments. Generation concurrency and queue capacity depend on the plan, so a rejection under load is often a capacity message and not a problem with your payload. The preflight post shows how to read balance first.
Handler
A small router keeps the refusals apart.
def route(err: dict) -> str:
code = err.get('code')
if code == 'generation_admission_rejected':
return 'inspect preview, change request: ' + str(err.get('preview'))
if code == 'max_spend_exceeded':
return 'ask user to raise cap or shrink job'
if code == 'missing_usage_estimate':
return 'stop; do not retry without a cap'
return 'unhandled: ' + str(code)
print(route({'code': 'generation_admission_rejected', 'preview': {'would_accept': False}}))Limits
The preview is advisory about price and acceptance at that moment. A call that passes can still fail later for provider reasons, and those arrive as a failed job, not as this code.
Three refusals that look alike
A rejected preview, an estimate above your cap and a missing estimate are three different refusals with three different codes. Mixing them up leads an agent to drop the cap, which is the one thing that turns a refusal into an unbounded spend. Keep the codes separate in your handler and give each its own next action.
Checklist before you ship
- Log the whole preview object from the error, not only the message.
- Do not remove max_spend_usd to get past the rejection.
- Check the balance and the concurrency headroom before resending.
- Change the request, or wait, before the next attempt.
Sources
Related posts
More in Developers
- Sume job_failed_terminal: retryable true means reuse the same key
On job_failed_terminal never resubmit the identical payload. If error.retryable is true, re-issue the create with the same idempotency_key; else fix the input.
- max_spend_usd on Sume MCP: floors to micros, missing estimate fails
max_spend_usd takes 0 to 10,000, floors to micros, and runs on the preview before dry_run returns. No usable estimate means missing_usage_estimate, not a pass.
- Sume MCP OAuth metadata: curl the well-known URLs before you connect
Before a client fails at sign-in, curl Sume's protected-resource and authorization-server metadata on mcp.sume.com and check the resource audience matches.
- Avatar preview failed on Sume MCP: stop_and_ask, do not generate video
When an avatar video preview fails or is canceled, Sume MCP returns recovery code stop_and_ask: do not call generate_video, report the reason, offer a rewrite.
Written by Sume