Ideogram 4 tops out at 2048 px: upscale to 4K with Sume

Ideogram 4 outputs run 256 to 2048 px per the Hugging Face card. To go bigger, send the file to Sume's image upscale endpoint: public URL, factor, poll.

5 min readSume
All posts

Generate at the largest size the card allows, host the PNG at a public HTTPS URL, and send it to POST /v1/image-upscale-1.0/upscale with upscale_factor 2. The Ideogram 4 card (read 2026-10-03) lists resolutions from 256 to 2048 pixels in multiples of 16, so a 2048-wide image doubled gives 4096.

Sume's endpoint takes a public URL, so the step between your local output and the call is hosting the file.

What does the card allow?

The card gives a range, not a menu of sizes.

  • Resolution from 256 to 2048 pixels, in multiples of 16.
  • Aspect ratios up to 6:1.
  • Run with --height and --width on run_inference.py.

What does Sume's upscale endpoint take?

Per the OpenAPI, image_url is required and must be public HTTPS; upscale_factor runs 1 to 4 with a default of 2; output_format is png, jpg or webp; and mode is async, sync or webhook. It returns the standard submit envelope, so you poll the status_url and then fetch the result_url. Sume's media input rules reject localhost, private and signed URLs.

How do you run it?

This script submits in async mode, polls status_url, then reads the artifacts from result_url. It assumes the job envelope nests under data:

import os, time, requests

H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
body = {
    "image_url": os.environ["IMAGE_URL"],
    "upscale_factor": 2,
    "output_format": "png",
    "mode": "async",
}
r = requests.post("https://api.sume.com/v1/image-upscale-1.0/upscale", headers=H, json=body, timeout=60)
r.raise_for_status()
d = r.json()["data"]
while True:
    s = requests.get(d["status_url"], headers=H, timeout=30).json()["data"]
    if s["terminal"]:
        break
    time.sleep(3)
if s["sume_status"] != "completed":
    raise SystemExit(s["sume_status"])
res = requests.get(d["result_url"], headers=H, timeout=30).json()["data"]["result"]
print([a["url"] for a in res["artifacts"]])

When is the upscale not the right step?

An upscaler adds pixels, not information. Fine text or a logo drawn at 2048 stays as detailed as it was. If the small text is the point, regenerate that part rather than enlarge it.

From local output to a larger file, read 2026-10-03
StepWhereNote
Generate at the widest sizeLocal, up to 2048 per the cardMultiples of 16 only
Host the PNGYour public HTTPS storageNo signed URL, no localhost
UpscalePOST /v1/image-upscale-1.0/upscaleupscale_factor 1 to 4
Collectresult_url artifactsRead artifacts[].url

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume