Recraft erase, outpaint and inpaint calls vs one edit route on Sume

Recraft has separate inpaint, outpaint and erase calls. Sume has one /v1/images route with references and mask_url (ChatGPT Image 2.5 only), plus RMBG.

4 min readSume
All posts

Recraft's docs list image to image, inpaint, outpaint and erase region as separate edits, plus background removal and replacement, vectorization at $0.01 and upscaling. Sume does not mirror that list. Its image edits go through one route, POST /v1/images, with reference images and, on ChatGPT Image 2.5 only, a mask_url. Erase and outpaint are not documented Sume operations, so for those two you describe the change in a prompt.

Operation map

Recraft's column is from its docs page (read 2026-10-05). Sume's is from the Sume Image API docs and catalog.

Edit operations, Recraft vs Sume, read 2026-10-05
OperationRecraftSume
Image to imageListedinput_references on POST /v1/images
Inpaint (mask)Listedmask_url, ChatGPT Image 2.5 only
OutpaintListedNot a documented operation
Erase regionListedNot a documented operation; prompt the removal
Background removalListedsume/rmbg-1.0, $0.0225 per image
Vectorization$0.01Not documented
UpscalingListedsume/image-upscale-1.0, $0.20 reserved per image

One route, several knobs

A Sume edit is the same call as a generation with extra fields. input_references takes up to 10 images on most catalog models and 16 on ChatGPT Image 2.5. mask_url takes a public HTTPS mask. For other models, a mask_url returns 400 unsupported_parameter; Sume never silently drops a field.

Set aspect_ratio: "auto" on an edit to match the reference. The docs say that omitting the field is not the same as auto.

import asyncio, os, httpx

async def main():
    body = {
        "model": "openai/gpt-image-2.5",
        "prompt": "Remove the person from the masked area and fill with the pavement behind.",
        "input_references": [{"type": "image_url", "image_url": {"url": "https://example.com/street.png"}}],
        "mask_url": "https://example.com/street-mask.png",
        "aspect_ratio": "auto",
    }
    headers = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
    async with httpx.AsyncClient(timeout=60) as c:
        r = await c.post("https://api.sume.com/v1/images", headers=headers, json=body)
    print(r.status_code, r.json().get("usage"))

asyncio.run(main())

When to choose which

If your pipeline calls erase and outpaint as precise tools, Recraft's separate calls match it more closely. If your edits are mostly prompt-led and you want to keep one client, one key and one billing line, the single Sume route is simpler. Test a handful of your real erase jobs on both before you commit; this post compares documented features, not output quality. For the price side of cut-outs, see Recraft background operations against Sume RMBG.

A fair test

Take twenty real erase-and-extend jobs. Run them through Recraft's calls and through the Sume route with the same prompts. Count how many outputs you would ship without touching them, and divide the total cost by that number. That cost per usable image is a better comparison than either price list.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume