Media tools

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.

4 min readSume
All posts

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.

Image Upscale 1.0 request fields, from the Sume API reference, read 2026-09-26.
FieldAcceptsDefault
image_urlPublic HTTPS image URL (required)None
upscale_factorA number from 1 to 42
output_formatpng, jpg, or webppng
modeasync, sync, subscribe, or webhookasync
wait_timeout_seconds0–30 seconds of blocking wait for sync or subscribeNot stated
webhook_urlPublic HTTPS callback URL, up to 2,048 charactersNone
metadataYour own object, stored with the job requestNone
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.

  • sync or subscribe blocks for at most wait_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.
  • webhook returns at once and stores a callback for terminal delivery only: job.completed, job.failed, or job.canceled. Sending webhook_url without a mode selects webhook.
  • 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_url is a single URL.
  • upscale_factor stops at 4, and output_format has 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