Sume job failed: image_content_rejected, what to change
image_content_rejected marks a non-retryable failure at an image-input stage such as first_frame. Sume sets next_action to fix_input: swap the picture.

public_reason: image_content_rejected on a failed Sume job means the job failed, was not retryable, and failed at a stage that works on an input image: a first frame, an avatar base, an idle still or input preparation. next_action is fix_input, so change the picture instead of retrying the same one.
The label comes from the job-error remap in packages/api-jobs. It is assigned from where the job failed, not from an analysis of the pixels, so it tells you which input to change but not why the provider disliked it.
When Sume assigns the label
Four conditions must all hold, and several other labels are checked first.
- The stored error code is
provider_execution_failedorgeneration_failed. - The error is not retryable.
- The internal workflow stage is one of
base_avatar,avatar_base,idle_still,first_frame,provider_input_ingest,input_preparationoravatar_creation. - No earlier rule matched: not a negative-prompt rejection, not a content-policy refusal, and not an input URL the provider could not download.
How it ranks against the other reasons
The same failed job can match more than one rule, and the remap takes them in a fixed order.
A bad link therefore never says image_content_rejected; it says input_media_unreachable, and the fix is covered in the unreachable input guide.
| What the failure looks like | public_reason | next_action |
|---|---|---|
| The provider could not download an input URL | input_media_unreachable | fix_input |
| Not retryable, content-policy wording in the provider text | content_policy_rejected | fix_input |
| Not retryable, failed at one of the image-input stages | image_content_rejected | fix_input |
| Retryable, failed at an image-input stage, no HTTP status | temporary_generation_error | retry_later |
| Not retryable, any other stage, provider answered 4xx | generation_rejected | inspect_events |
What the label does not tell you
The message is the provider's own sentence after masking and a 300-character cap, or "Generation failed." when nothing usable remains. Read details.provider_error_message first, because it is the only place the reason can appear.
Some image problems never get this far. The avatar photo preflight in the API checks the picture before it creates a job and answers 400 directly: image_not_fetchable, unsupported_image_type (PNG, JPEG, WebP or GIF only), invalid_image (cannot be decoded, shorter than 64 pixels on a side, or an aspect ratio above 6) or 413 image_too_large. If you see one of those, you are looking at preflight, not at this label.
A fix order that finds the cause fast
Treat the picture as the suspect and change one thing at a time. The input rules are on the Media inputs page.
- Open the image URL in a private browser window. It must load without a login and must be a public HTTPS link.
- Re-export the picture as a plain PNG or JPEG and host that copy.
- Run the same prompt with a different picture. If that job succeeds, the first picture is the cause.
- Run the same picture with a different prompt only after that, to rule out the prompt.
Check the job before you resubmit
Read the error object once, and branch on public_reason.
A resubmit with the same picture is a new paid attempt that fails the same way, so only resubmit after the input changed.
import json, os, urllib.request
def get(path):
req = urllib.request.Request(
"https://api.sume.com" + path,
headers={"Authorization": "Bearer " + os.environ["SUME_API_KEY"]},
)
with urllib.request.urlopen(req) as res:
return json.load(res)
job = get("/v1/jobs/" + os.environ["SUME_JOB_ID"])["data"]["job"]
error = job.get("error") or {}
for key in ("code", "message", "public_reason", "next_action", "retryable"):
print(key, "=", error.get(key))
print("details =", error.get("details"))Sources
Related posts
More in Developers
- Sume command line tool on Linux arm64: Graviton, Docker on a Mac
The Sume command line tool ships Linux arm64 and x64 binaries plus macOS arm64 and x64. Windows is x64 only. Pick the right asset for Graviton or Docker.
- The agent field in Sume MCP results: next_step and poll_after
Sume's hosted MCP adds an agent object to tool results with next_step, poll_after_seconds, adjustments and recovery. What each field means and when it is null.
- Upgraded your Sume plan but ratelimit-limit is still the old number?
A plan change can take up to 60 seconds to reach the per-key rate limit, because the tier is cached. Why ratelimit-limit lags, and what changes at once.
- Which MCP server lets Claude Code or Cursor generate video and images?
MCP servers that let Claude Code and Cursor make video and images: Sume, fal, Replicate, Runway, Higgsfield. Endpoints, sign-in, billing, setup.
Written by Sume