OpenAI lists gpt-image-1 for shutdown on October 23, 2026 and recommends GPT Image 2.5 Sunburst or Flare. Here is how to move, with working code. On VELIN both cost ¥0.25 (about $0.037) per image at any resolution.
| Model | Shutdown (per OpenAI) | Recommended replacement |
|---|---|---|
gpt-image-1 | October 23, 2026 | gpt-image-2.5-sunburst or gpt-image-2.5-flare |
gpt-image-1-mini | December 1, 2026 | same |
gpt-image-1.5 | December 1, 2026 | same |
Source: OpenAI API deprecations, read 2026-10-07. Confirm on that page before you plan. After the shutdown date, calls to the old model id fail.
| Your use | Model on VELIN | Typical time | Price (1K / 2K / 4K) |
|---|---|---|---|
| Default, fast iteration | gpt-image-2.5-flare | ~45 s | ¥0.25 ≈ $0.037 |
| Maximum detail, print | gpt-image-2.5-sunburst | ~100 s | ¥0.25 ≈ $0.037 |
| Many aspect ratios | gpt-image-2 | ~60 s | ¥0.25 ≈ $0.037 |
| Want a second opinion | nano-banana-pro | ~60 s | ¥0.25 ≈ $0.037 |
One API key covers all of them, so you can A/B GPT Image 2.5 against Nano Banana Pro on your own prompts by changing one field.
GET /api/task/{id}. A dropped connection never loses an image.1024x1536, send an aspect ratio (size=2:3) and a resolution (1K/2K/4K), or size=auto.refs files (8 MB each) in the same request instead of a separate edits endpoint./outputs/<id>.png) instead of base64; download it within ~10 hours.Before (OpenAI SDK, Python):
result = client.images.generate(model="gpt-image-1", prompt=prompt, size="1024x1536")
open("out.png", "wb").write(base64.b64decode(result.data[0].b64_json))
After (VELIN, Python with requests):
import os, time, requests
BASE, H = "https://72agi.com", {"Authorization": f"Bearer {os.environ['VELIN_API_KEY']}"}
def generate(prompt, model="gpt-image-2.5-flare", size="2:3", resolution="2K"):
r = requests.post(f"{BASE}/api/generate", headers=H,
files={k: (None, v) for k, v in { # multipart form
"prompt": prompt, "model": model, "size": size, "resolution": resolution}.items()})
r.raise_for_status()
job_id = r.json()["id"]
while True:
time.sleep(4)
job = requests.get(f"{BASE}/api/task/{job_id}", headers=H).json()
if job["status"] == "succeeded":
return requests.get(BASE + job["url"], headers=H).content
if job["status"] == "failed":
raise RuntimeError(job.get("error")) # not charged
open("out.png", "wb").write(generate("a red fox in fresh snow, golden hour"))
curl:
curl -X POST https://72agi.com/api/generate \
-H "Authorization: Bearer $VELIN_API_KEY" \
-F "prompt=a red fox in fresh snow, golden hour" \
-F "model=gpt-image-2.5-flare" \
-F "size=2:3" \
-F "resolution=2K"
# -> 202 {"id": "02a38b1d1b66", "status": "queued"}
curl https://72agi.com/api/task/02a38b1d1b66 -H "Authorization: Bearer $VELIN_API_KEY"
# -> {"id": "02a38b1d1b66", "status": "processing"}
# -> {"id": "02a38b1d1b66", "status": "succeeded", "url": "/outputs/02a38b1d1b66.png", "price": 0.25}
curl -o image.png "https://72agi.com/outputs/02a38b1d1b66.png"
Node 18+:
// Node 18+ (built-in fetch). export VELIN_API_KEY=your_key
import { writeFile } from "node:fs/promises";
const BASE = "https://72agi.com";
const auth = { Authorization: `Bearer ${process.env.VELIN_API_KEY}` };
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
// 1) submit (multipart form; add form.append("refs", blob, "name.png") for up to 14 reference images)
const form = new FormData();
form.set("prompt", "a red fox in fresh snow, golden hour");
form.set("model", "gpt-image-2.5-flare");
form.set("size", "16:9");
form.set("resolution", "1K");
const submit = await fetch(`${BASE}/api/generate`, { method: "POST", headers: auth, body: form });
if (submit.status === 402) throw new Error("Not enough credits, top up first");
if (submit.status === 429) throw new Error("Rate limited, retry in a few seconds");
const { id } = await submit.json();
// 2) poll every 4 s until it finishes (typically 45-100 s)
let job;
do {
await sleep(4000);
job = await (await fetch(`${BASE}/api/task/${id}`, { headers: auth })).json();
} while (job.status === "queued" || job.status === "processing");
if (job.status !== "succeeded") throw new Error(`failed (not charged): ${job.error}`);
// 3) download (url is a site path such as /outputs/<id>.png)
const img = await fetch(BASE + job.url, { headers: auth });
await writeFile("image.png", Buffer.from(await img.arrayBuffer()));
console.log("saved image.png, price", job.price, "CNY");
grep -rn "gpt-image-1" . across code, env files, n8n/Make/Zapier workflows and config.1:1, 1024x1536 → 2:3, 1536x1024 → 3:2.OpenAI's deprecations page lists gpt-image-1 with a shutdown date of October 23, 2026. gpt-image-1-mini and gpt-image-1.5 are listed for December 1, 2026.
OpenAI recommends gpt-image-2.5-sunburst or gpt-image-2.5-flare. Both are available on VELIN at ¥0.25 (about $0.037) per image.
No. VELIN has its own small async REST API: POST /api/generate (multipart form), then poll GET /api/task/{id}. The change is usually 20-30 lines; examples are below and in the GitHub kit.
No. Credits are reserved when you submit and refunded automatically if the job fails.
Yes. Standard image models cost ¥0.25 (about $0.037) per image at 1K, 2K and 4K; the Pro+ and 2+ variants cost ¥0.35 (about $0.052).
Top up from $5 by card (Stripe, Apple Pay, Google Pay) or USDT on the billing page. Pay as you go, no subscription.
No. The minimum top-up is $5, which buys roughly 130 images or about 40 music generations.
No. VELIN is an independent API service and is not affiliated with or endorsed by OpenAI, Google or Suno.
Authorization: Bearer YOUR_KEY. Reference: API docs. Examples: GitHub kit. AI agents: agent skill file.Questions, higher rate limits or volume pricing: @ayan8866e on Telegram.
Nano Banana and Gemini are trademarks of Google. GPT Image is a trademark of OpenAI. Suno is a trademark of Suno, Inc. VELIN is an independent service and is not affiliated with or endorsed by any of these companies. Competitor prices are quoted from the linked public pages on the date shown and may change.