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.

4 min readSume
All posts

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_failed or generation_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_preparation or avatar_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.

Precedence in the job-error remap, packages/api-jobs/src/public-job.ts (source read 2026-10-10)
What the failure looks likepublic_reasonnext_action
The provider could not download an input URLinput_media_unreachablefix_input
Not retryable, content-policy wording in the provider textcontent_policy_rejectedfix_input
Not retryable, failed at one of the image-input stagesimage_content_rejectedfix_input
Retryable, failed at an image-input stage, no HTTP statustemporary_generation_errorretry_later
Not retryable, any other stage, provider answered 4xxgeneration_rejectedinspect_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

All Developers posts

Written by Sume