Billable request: generate an image with gpt-image-2-web
curl --request POST \
--url https://api.yingtu.ai/v1/images/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "gpt-image-2-web",
"prompt": "A blue ceramic teapot on a pale table, soft studio light, no text."
}
'import requests
url = "https://api.yingtu.ai/v1/images/generations"
payload = {
"model": "gpt-image-2-web",
"prompt": "A blue ceramic teapot on a pale table, soft studio light, no text."
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'gpt-image-2-web',
prompt: 'A blue ceramic teapot on a pale table, soft studio light, no text.'
})
};
fetch('https://api.yingtu.ai/v1/images/generations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"created": 1788307200,
"data": [
{
"b64_json": "iVBORw0KGgo="
}
],
"usage": {
"input_tokens": 24,
"output_tokens": 1756,
"total_tokens": 1780,
"input_tokens_details": {
"text_tokens": 24,
"image_tokens": 0
},
"output_tokens_details": {
"text_tokens": 0,
"image_tokens": 1756
}
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "insufficient_user_quota"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "insufficient_user_quota"
}
}{
"error": {
"message": "Insufficient balance for this request",
"type": "new_api_error",
"param": "",
"code": "insufficient_user_quota"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "insufficient_user_quota"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "insufficient_user_quota"
}
}GPT Image 2 Web
GPT Image 2 Web API examples
Copy gpt-image-2-web examples for text-to-image, idempotent asynchronous work, one or multiple reference images, polling, and Base64 output.
POST
/
v1
/
images
/
generations
Billable request: generate an image with gpt-image-2-web
curl --request POST \
--url https://api.yingtu.ai/v1/images/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "gpt-image-2-web",
"prompt": "A blue ceramic teapot on a pale table, soft studio light, no text."
}
'import requests
url = "https://api.yingtu.ai/v1/images/generations"
payload = {
"model": "gpt-image-2-web",
"prompt": "A blue ceramic teapot on a pale table, soft studio light, no text."
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'gpt-image-2-web',
prompt: 'A blue ceramic teapot on a pale table, soft studio light, no text.'
})
};
fetch('https://api.yingtu.ai/v1/images/generations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"created": 1788307200,
"data": [
{
"b64_json": "iVBORw0KGgo="
}
],
"usage": {
"input_tokens": 24,
"output_tokens": 1756,
"total_tokens": 1780,
"input_tokens_details": {
"text_tokens": 24,
"image_tokens": 0
},
"output_tokens_details": {
"text_tokens": 0,
"image_tokens": 1756
}
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "insufficient_user_quota"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "insufficient_user_quota"
}
}{
"error": {
"message": "Insufficient balance for this request",
"type": "new_api_error",
"param": "",
"code": "insufficient_user_quota"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "insufficient_user_quota"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "insufficient_user_quota"
}
}Generate an image synchronously
curl 'https://api.yingtu.ai/v1/images/generations' \
-H 'Authorization: Bearer YOUR_YINGTU_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"model": "gpt-image-2-web",
"prompt": "A compact reading lamp on a pale desk, editorial product photo, no text",
"size": "1024x1024",
"quality": "high",
"n": 1
}' > response.json
jq -er '.data[0].b64_json' response.json | base64 --decode > lamp.png
quality is forwarded; the selected upstream determines its effect.
Submit and poll an asynchronous generation
const headers = {
Authorization: `Bearer ${process.env.YINGTU_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
};
const submitted = await fetch(
"https://api.yingtu.ai/v1/images/tasks",
{
method: "POST",
headers,
body: JSON.stringify({
model: "gpt-image-2-web",
action: "generate",
prompt: "A glass greenhouse in a snowy forest at dusk, no text",
size: "2048x2048",
n: 1,
}),
},
);
if (submitted.status !== 202) throw new Error(`Submit failed: ${submitted.status}`);
const { task_id } = await submitted.json();
const deadline = Date.now() + 5 * 60_000;
let image;
while (Date.now() < deadline) {
const response = await fetch(
`https://api.yingtu.ai/v1/tasks/${task_id}`,
{ headers: { Authorization: headers.Authorization } },
);
if (!response.ok) throw new Error(`Poll failed: ${response.status}`);
const task = await response.json();
if (task.status === "completed") {
image = task.result?.data?.[0]?.b64_json;
if (!image) throw new Error("Completed task did not include image data");
break;
}
if (["failed", "expired"].includes(task.status)) throw new Error(task.error?.message || task.status);
await new Promise((resolve) => setTimeout(resolve, 3000));
}
if (!image) throw new Error("Task deadline exceeded");
Edit one source image
import base64
import os
from pathlib import Path
import requests
with Path("product.png").open("rb") as source:
response = requests.post(
"https://api.yingtu.ai/v1/images/edits",
headers={"Authorization": f"Bearer {os.environ['YINGTU_API_KEY']}"},
data={
"model": "gpt-image-2-web",
"prompt": "Keep the product and replace the background with pale blue",
"size": "1024x1024",
"n": "1",
},
files={"image": ("product.png", source, "image/png")},
timeout=180,
)
response.raise_for_status()
body = response.json()
items = body.get("data") or []
encoded = items[0].get("b64_json") if items else None
if not encoded:
raise RuntimeError("Response did not include image data")
Path("edited.png").write_bytes(base64.b64decode(encoded))
Queue a multi-image edit with JSON
import fs from "node:fs";
const product = fs.readFileSync("product.png").toString("base64");
const setting = fs.readFileSync("setting.jpg").toString("base64");
const submitted = await fetch("https://api.yingtu.ai/v1/images/tasks", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.YINGTU_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
model: "gpt-image-2-web",
action: "edit",
prompt: "Keep the product and replace the background with pale blue",
input_images: [
{ mime_type: "image/png", data: product },
{ mime_type: "image/jpeg", data: setting },
],
size: "1024x1024",
quality: "high",
n: 1,
}),
});
if (submitted.status !== 202) throw new Error(`Submit failed: ${submitted.status}`);
const { task_id } = await submitted.json();
console.log(task_id);
Test this model online
The embedded operation fixesgpt-image-2-web and exposes the three documented sizes plus forwarded quality values.
Try it sends a real USD 0.03 request at the current price. Use a development key and do not share generated cURL that contains it.
Authorizations
YingTu API key.
Body
application/json
Available options:
gpt-image-2-web Example:
"gpt-image-2-web"
Minimum string length:
1Example:
"A blue ceramic teapot on a pale table, no text"
Current public presets. Set size explicitly for predictable dimensions; the 4K landscape value is 3840x2160.
Available options:
1024x1024, 2048x2048, 3840x2160 Example:
"1024x1024"
Forwarded for both GPT Image routes. The selected upstream determines how the requested value affects the result.
Available options:
low, medium, high, auto Example:
"low"
The documented subset returns one image.
Available options:
1 Response
Complete GPT Image response
Unix timestamp in seconds.
Required array length:
1 elementShow child attributes
Show child attributes
Output size when returned by the selected GPT Image route.
Quality value reported by the selected GPT Image route.
Show child attributes
Show child attributes
Last modified on September 3, 2026