Recraft V4 on Sume returns WebP only: convert to PNG with Pillow
Recraft V4 on Sume lists webp as its only output format at $0.05 per image. Download the file and convert to PNG or JPEG with Pillow in six lines.

Answer
Sume's Recraft V4 row (recraft/recraft-v4) lists webp as its only output_format value and costs $0.05 per image, so a request for png or jpeg is outside what the model advertises. Download the WebP from the Sume-hosted data[].url and convert it with Pillow if your destination needs PNG or JPEG.
The row is text-to-image only: input_references is 0 to 0. It lists 13 aspect ratios and n up to 4.
Convert
Pillow reads WebP when it is built with WebP support, which the standard wheels are. This script fetches a result URL and writes a PNG.
import io, sys
import requests
from PIL import Image
url = sys.argv[1] # data[0].url from the Sume response
raw = requests.get(url, timeout=60)
raw.raise_for_status()
img = Image.open(io.BytesIO(raw.content))
print(img.format, img.size, img.mode)
img.convert("RGB").save("out.jpg", quality=92)
img.save("out.png")| Field | Value |
|---|---|
| Model id | recraft/recraft-v4 |
| Price per image | $0.05 |
| Output format | webp only |
| References | 0, text-to-image only |
| Aspect ratios | 13, from 1:2 to 21:9 and 9:21 |
| n | 1 to 4 |
Notes
- Convert to RGB before saving a JPEG, since JPEG has no alpha channel.
- Lossless conversion keeps the WebP quality; it cannot add detail. Do not upscale by saving to PNG.
- Ideogram 4.5 and Soul show an empty format list because the provider picks the format. Check the extension of the returned URL, not the request.
- If you need a PNG straight from the API, use a row that lists png, such as Seedream, Flux or Nano Banana.
Sume bills a completed generation in full, and the conversion happens on your side at no charge. See the Sume Image API docs.
Before a large run
Prices and descriptors change when the catalog changes, so confirm them before you spend. Call GET /v1/images/models/{id}/endpoints for the row you plan to use and read its pricing line and supported_parameters; both come back in one response.
Then run a pilot of three to five images and read usage.cost on each response. Multiply by your planned count for a forecast you can trust. Completed generations are billed in full and failed or cancelled ones are not, so a pilot that errors costs nothing.
For big batches, use mode: "async" or mode: "webhook" with a public HTTPS webhook_url, so no request waits on the 30-second sync limit. Poll GET /v1/jobs/{id}/status and fetch GET /v1/jobs/{id}/result when the job completes.
Sources
Related posts
More in Developers
- Redeliver a missed speech-to-text webhook without rerunning the job
Your receiver was down when a Sume STT job finished. Redeliver the terminal webhook with one call instead of paying to transcribe again.
- Reels safe-zone boxes in Python: a pure function for any frame size
Meta's Reels percentages are relative, so one pure Python function gives the safe box for any frame size. It runs offline and feeds a caption anchor.
- Reference image preflight checklist before a Seedance 2.5 job
Most reference-to-video failures are input problems. A checklist and a curl preflight for URLs, count and mix before you pay for a Seedance 2.5 job on Sume.
- Removed OpenAI video ids: the exact list and a script to find them
OpenAI removed the Videos API and five sora-2 model ids on 2026-09-24. The exact ids from its deprecations page, and a Python script that finds them in a repo.
Written by Sume