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.

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
--heightand--widthonrun_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.
| Step | Where | Note |
|---|---|---|
| Generate at the widest size | Local, up to 2048 per the card | Multiples of 16 only |
| Host the PNG | Your public HTTPS storage | No signed URL, no localhost |
| Upscale | POST /v1/image-upscale-1.0/upscale | upscale_factor 1 to 4 |
| Collect | result_url artifacts | Read artifacts[].url |
Sources
Related posts
More in Use cases
- AI info on the post or in the menu? Generated vs edited clips
Meta moved AI info for edited content into the post menu while generated content keeps the visible label. Which Sume job types fall on which side.
- Live AI avatar for streaming: pre-rendered clips instead
Streamers asking for a live AI avatar get conversation APIs. Sume cannot go live, but renders avatar intros, stingers and ad reads. Tavus greenscreen vs Sume.
- LIVE GMV Max wants 50-70 videos in queue: how to supply them
TikTok says add at least 50-70 videos in the In queue status for stable LIVE GMV Max exploration. One Sume bulk queue can cover it; here is the order of work.
- LIVE GMV Max Creative Boost: $10 minimum, 24h default, prep clips
Creative Boost in LIVE GMV Max needs allowlisting, In queue or Not delivering videos and a $10 daily minimum. How to prepare variant clips with Sume first.
Written by Sume