GPT Image moderation_blocked vs Sume content_policy_rejected
OpenAI returns moderation_blocked with moderation_details. On Sume, policy refusals are grouped under content_policy_rejected. What to read and when to retry.

When OpenAI blocks a GPT Image request it returns error.code = "moderation_blocked", sometimes with error.moderation_details. Do not retry unchanged: edit the prompt or input images. On Sume, the matching refusal is grouped under the public reason content_policy_rejected, and the same advice applies.
The OpenAI side is from its image generation guide; Sume's from Image generation and the OpenAPI schema, read 2026-10-01.
What does OpenAI's error contain?
The guide shows error.type of image_generation_user_error, error.code of moderation_blocked, and an optional moderation_details object with a moderation_stage and coarse categories such as harassment. The stage is input when the prompt or request inputs were blocked, output when a generated image was, and unknown as a rare fallback. OpenAI says this gives coarse debugging context without internal classifier labels or scores, and recommends a generic end-user message.
What does Sume return?
Sume's OpenAPI describes a public_reason field as machine-friendly and groupable, with examples generation_rejected, image_content_rejected and content_policy_rejected. The job error carries content_policy_rejected when a provider rejection is classified as a content-policy refusal. I found no Sume field that mirrors moderation_stage or categories, so do not expect the input-versus-output split.
How do the two compare?
| Question | OpenAI direct | Sume |
|---|---|---|
| Stable discriminator | error.code = moderation_blocked | public_reason = content_policy_rejected |
| Stage and categories | Optional moderation_details | Not documented |
| Retry unchanged | No; change prompt or inputs | No; fix the input (next_action is a schema enum) |
| Billing on failure | See OpenAI pricing | Failed or cancelled generations are not billed |
What should my code do?
Branch on the public reason, not on message text. Show the user a generic message, log the request id and reason for support, and ask for a changed prompt or image before resubmitting. Sume's image docs state that failed generations are not billed, so a refused request does not leave a charge. The moderation setting itself is covered in GPT Image 2.5 moderation on Sume.
Sources
Related posts
More in Developers
- GPT Image revised_prompt: what a Sume images response returns
OpenAI returns revised_prompt on the image generation call. A Sume POST /v1/images response has data[].url and usage, with no revised prompt field.
- GPT Image user error: don't retry unchanged; Sume failures unbilled
OpenAI says not to auto-retry image_generation_user_error without changing the prompt or inputs. On Sume, retry 429 with backoff; failed images are not billed.
- gpt-transcribe expected languages vs Sume STT language_code
OpenAI's gpt-transcribe accepts multiple expected input languages. Sume STT takes one optional language_code hint or auto-detect. What to send for mixed audio.
- Grok Imagine base64 response_format vs a Sume hosted URL
xAI lets you request base64 instead of a temporary URL. Sume returns Sume-hosted, signed URLs in data[].url, not inline base64, for x-ai/grok-image.
Written by Sume