DALL-E 2 was removed May 12: four variations from one edit call

OpenAI removed dall-e-2 on May 12, 2026. Replace it with one Sume edit call that returns up to four new takes of a photo, with estimated cost at each quality.

5 min readSume
All posts

OpenAI's deprecations page lists dall-e-2 as removed on May 12, 2026, so any script that still names it fails. To get several new takes of one photo today, send the photo as an input reference to a GPT Image model with n set to 4. On Sume, GPT Image 2.5 allows at most 4 images per call, so that is the largest batch in one request.

What OpenAI says about dall-e-2

The deprecations page, read on 2026-10-07, shows dall-e-2 and dall-e-3 announced on November 14, 2025 and removed on May 12, 2026. For both, OpenAI names gpt-image-2, gpt-image-1 or gpt-image-1-mini as the replacement. That is 179 days from announcement to removal, counted from November 14 to May 12.

Of those three suggested replacements, gpt-image-1 is itself removed on October 23, 2026 and gpt-image-1-mini on December 1, 2026. If you are rebuilding a variations feature now, start from gpt-image-2 or the 2.5 pair instead.

The dates matter for planning: three of the four rows above fall within a single year, so a replacement picked from an older tutorial can be gone before the tutorial is updated.

Removal dates on OpenAI's deprecations page (read 2026-10-07)
ModelAnnouncedRemoved
dall-e-2November 14, 2025May 12, 2026
dall-e-3November 14, 2025May 12, 2026
gpt-image-1April 22, 2026October 23, 2026
gpt-image-1-miniJune 2, 2026December 1, 2026

One edit call with n set to 4

On Sume the same route handles text-to-image and edits. Add a public HTTPS image URL under input_references, set aspect_ratio to auto so each result keeps the shape of the source, and set n. The prompt tells the model what to vary, since a model that edits does not know you want variations unless you say so.

Edits are JSON. A multipart upload, which is how some older clients send files, returns 415, so pass a URL instead of file bytes.

Two behaviours differ from a bare variations call. First, the response is a Sume-hosted, signed URL for each image, not base64 data, so your code downloads the files if it needs bytes. Second, a call that runs longer than 30 seconds returns 202 with a job envelope; the script above prints the status so you can see which case you hit.

import json, os, urllib.request

key = os.environ.get("SUME_API_KEY")
if not key:
    raise SystemExit("SUME_API_KEY is not set")

body = json.dumps({
    "model": "openai/gpt-image-2.5",
    "prompt": "Four new takes of this product shot: same item, different lighting and backdrop.",
    "n": 4,
    "quality": "low",
    "aspect_ratio": "auto",
    "input_references": [
        {"type": "image_url", "image_url": {"url": "https://example.com/photo.jpg"}}
    ],
}).encode()

req = urllib.request.Request(
    "https://api.sume.com/v1/images",
    data=body,
    headers={"Authorization": f"Bearer {key}", "Content-Type": "application/json"},
)
with urllib.request.urlopen(req) as res:
    data = json.load(res)
    print(res.status)
    for item in data.get("data", []):
        print(item["url"])

What four takes cost

Sume bills the provider list price times 1.25 before cent rounding, and the amount is multiplied by n. Using my estimate of a text-only 1024x1024 image ($0.007375 at low before rounding), four images come to about 4 x $0.007375 = $0.0295 at low, 4 x $0.0165 = $0.066 at medium and 4 x $0.065875 = $0.2635 at high. A reference image adds input tokens that I did not price, so treat these as lower bounds and read usage.cost.

Asking for five returns a 400 error, because the model ceiling is 4. For eight takes, send two requests.

Choosing what to vary

Variation quality comes from the prompt. Name one thing to change per call, such as lighting, background or camera angle, and keep the rest fixed. Run low first, pick the direction you like, then re-run that prompt at high for the final.

Keep the originals. If a customer picks variation three, you want the prompt and the reference URL that produced it, so store them with the result URL and the usage.cost value from the response.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume