AI image upscaler API: upscale an image up to 4x with Sume
POST /v1/image-upscale-1.0/upscale takes a public HTTPS image URL and an upscale_factor from 1 to 4 (default 2), and returns a PNG, JPG, or WebP.

To upscale an image with the Sume API, send a public HTTPS image_url to POST /v1/image-upscale-1.0/upscale, with an optional upscale_factor from 1 to 4 (default 2) and an optional output_format of png, jpg, or webp (default png). Sume Image Upscale 1.0 (sume/image-upscale-1.0) runs it as a job and returns a Sume-hosted image.
Image Upscale 1.0 is specified in the OpenAPI document behind the Sume API reference. Jobs, artifacts, and billing follow the API reference and Core concepts docs pages. All were read on 2026-09-26.
How do I upscale an image with the API?
image_url is the only required field. The schema has no model field, because Sume selects the model, and it accepts no fields beyond those in the table. The same body also works at POST /v1/models/sume/image-upscale-1.0/runs.
| Field | Accepts | Default |
|---|---|---|
image_url | Public HTTPS image URL (required) | None |
upscale_factor | A number from 1 to 4 | 2 |
output_format | png, jpg, or webp | png |
mode | async, sync, subscribe, or webhook | async |
wait_timeout_seconds | 0–30 seconds of blocking wait for sync or subscribe | Not stated |
webhook_url | Public HTTPS callback URL, up to 2,048 characters | None |
metadata | Your own object, stored with the job request | None |
curl -X POST https://api.sume.com/v1/image-upscale-1.0/upscale \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: upscale-hero-001" \
-d '{
"image_url": "https://example.com/images/hero.png",
"upscale_factor": 4,
"output_format": "webp",
"mode": "async"
}'Which upscale factor and output format should I choose?
The factor sets how much larger the output is than the input. upscale_factor is typed as a number, not an integer, with a floor of 1 and a ceiling of 4. Leave it out and Sume uses 2.
output_format sets the file type of the result. It is png unless you ask for jpg or webp. Each result artifact reports its content_type, and can also report width and height, so your code can confirm what came back.
How do I get the upscaled image?
Every mode returns the job id in the first response. With the default async, poll the job with GET /v1/jobs/:id/status, then read GET /v1/jobs/:id/result, which returns the completed payload with its public artifact URLs.
syncorsubscribeblocks for at mostwait_timeout_seconds(max 30). If the job is still running, the response is a 2xx with the current state and polling URLs. Keep polling; do not submit a second paid job.webhookreturns at once and stores a callback for terminal delivery only:job.completed,job.failed, orjob.canceled. Sendingwebhook_urlwithout amodeselectswebhook.- The upscaled file is a Sume-hosted artifact under
media.sume.com. Treat its URL path as opaque. - If a request times out on your side, keep the job id and recover through the jobs API. For polling patterns, see how to poll a job's status.
How much does an image upscale cost?
API pricing lists Image upscale at $0.20 per image, plus a 5.5% agent fee by default. The rate card describes it as one image upscale, reserved at about 16 megapixels of generative output, with no separate rates by factor or format.
Sume reserves the estimate when you submit, captures it on success, and refunds a job that fails or is canceled before capture. The submit response quotes the estimate as usage.billable_amount_usd. If the balance cannot cover it, the submit returns 402 and no job starts.
What does Image Upscale 1.0 not do?
It enlarges one image you already have. Generating images is a separate endpoint, covered in Image generation API with reference images. Other limits:
- One image per job:
image_urlis a single URL. upscale_factorstops at 4, andoutput_formathas only three values.- No model choice. Model ids are not accepted in the request.
- Inputs must be fetchable public HTTPS URLs. Localhost, private-network, non-HTTPS, and non-image responses are rejected before generation submission.
- No progress callbacks. A webhook fires only when the job ends.
Sources
Related posts
Written by Sume