curl --request POST \
--url https://api.apiyi.com/v1/images/edits \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form model=gpt-image-2-all \
--form 'prompt=Put the person from image1 into the scene of image2, using the art style of image3' \
--form 'image=<string>' \
--form image.items='@example-file'{
"data": [
{
"b64_json": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."
}
],
"created": 1778037127,
"usage": {
"input_tokens": 98,
"output_tokens": 1185,
"total_tokens": 1283
}
}Image Editing API Reference
gpt-image-2-all image editing API reference and interactive playground — upload reference images + instructions for single-image editing or multi-image fusion
curl --request POST \
--url https://api.apiyi.com/v1/images/edits \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form model=gpt-image-2-all \
--form 'prompt=Put the person from image1 into the scene of image2, using the art style of image3' \
--form 'image=<string>' \
--form image.items='@example-file'{
"data": [
{
"b64_json": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."
}
],
"created": 1778037127,
"usage": {
"input_tokens": 98,
"output_tokens": 1185,
"total_tokens": 1283
}
}Documentation Index
Fetch the complete documentation index at: https://docs.apiyi.com/llms.txt
Use this file to discover all available pages before exploring further.
Bearer sk-xxx), select images, fill in prompt and model, then click send.multipart/form-data. For pure text-to-image generation, use the Text-to-Image endpoint.response_format: "b64_json", so the response carries a multi-MB base64 string and the browser Playground may show 请求时发生错误: unable to complete request — the request actually succeeded; the browser just can’t render such a long base64 string.Recommended workflow:- Just want to view the image in the Playground? Pass
"response_format": "url"explicitly — the response is a single R2 link and renders fine. - Want base64 or uploading large reference images? Copy the code sample below and run it locally — the code handles upload and decoding automatically.
image field can be repeated to upload multiple reference images. The order determines how “image1/image2/image3” in the prompt are resolved. We recommend referring to them explicitly, e.g.:Put the person from image1 into the scene of image2, using the art style of image3Recommended ≤ 10MB per image, formats
png / jpg / webp. Overly large images may hit gateway limits.size field has no effect on this model (sending any value is silently ignored — for strict size locking, use gpt-image-2-vip). If the prompt doesn’t pick a target, the model decides on its own.Code Examples
Python
Single-image edit:import requests
API_KEY = "sk-your-api-key"
with open("photo.png", "rb") as f:
response = requests.post(
"https://api.apiyi.com/v1/images/edits",
headers={"Authorization": f"Bearer {API_KEY}"},
data={
"model": "gpt-image-2-all",
"prompt": "Change the background to a seaside sunset",
"response_format": "url"
},
files=[
("image", ("photo.png", f, "image/png"))
],
timeout=300 # conservative — absorbs tail latency + image upload/download time
).json()
print(response["data"][0]["url"])
import requests
with open("ref1.png", "rb") as f1, \
open("ref2.png", "rb") as f2, \
open("ref3.png", "rb") as f3:
response = requests.post(
"https://api.apiyi.com/v1/images/edits",
headers={"Authorization": "Bearer sk-your-api-key"},
data={
"model": "gpt-image-2-all",
"prompt": "Put the person from image1 into the scene of image2, using the art style of image3",
"response_format": "b64_json"
},
files=[
("image", ("ref1.png", f1, "image/png")),
("image", ("ref2.png", f2, "image/png")),
("image", ("ref3.png", f3, "image/png"))
],
timeout=300 # conservative — absorbs tail latency + image upload/download time
).json()
# b64_json already includes the "data:image/png;base64," prefix
data_url = response["data"][0]["b64_json"]
cURL
Single-image edit:curl -X POST "https://api.apiyi.com/v1/images/edits" \
-H "Authorization: Bearer sk-your-api-key" \
-F "model=gpt-image-2-all" \
-F "prompt=Change the background to a seaside sunset" \
-F "response_format=url" \
-F "image=@./photo.png"
curl -X POST "https://api.apiyi.com/v1/images/edits" \
-H "Authorization: Bearer sk-your-api-key" \
-F "model=gpt-image-2-all" \
-F "prompt=Put the person from image1 into the scene of image2, using the art style of image3" \
-F "response_format=b64_json" \
-F "image=@./ref1.png" \
-F "image=@./ref2.png" \
-F "image=@./ref3.png"
Node.js (native fetch + FormData)
import fs from 'node:fs';
const form = new FormData();
form.append('model', 'gpt-image-2-all');
form.append('prompt', 'Change the background to outer space');
form.append('response_format', 'url');
form.append(
'image',
new Blob([fs.readFileSync('./photo.png')]),
'photo.png'
);
const resp = await fetch('https://api.apiyi.com/v1/images/edits', {
method: 'POST',
headers: { 'Authorization': 'Bearer sk-your-api-key' },
body: form
});
const data = await resp.json();
console.log(data.data[0].url);
Browser JavaScript (File objects)
// <input type="file" id="fileInput" multiple>
const files = document.getElementById('fileInput').files;
const form = new FormData();
form.append('model', 'gpt-image-2-all');
form.append('prompt', 'Fuse these images into one poster');
form.append('response_format', 'url');
for (const f of files) form.append('image', f);
const resp = await fetch('https://api.apiyi.com/v1/images/edits', {
method: 'POST',
headers: { 'Authorization': 'Bearer sk-your-api-key' },
body: form
});
const { data } = await resp.json();
document.getElementById('result').src = data[0].url;
Parameters Quick Reference
| Field | Type | Required | Description |
|---|---|---|---|
model | text | Yes | Fixed: gpt-image-2-all |
prompt | text | Yes | Natural-language edit/fusion instruction |
image | file | Yes | Reference image; can be repeated |
size | text | No | Field has no effect; sending any value is silently ignored. Output aspect ratio follows whichever reference image the prompt names as the edit target (not necessarily the first one in multi-image scenarios). For strict size locking, use gpt-image-2-vip |
response_format | text | No | b64_json (default) or url |
image input with new instructions to iteratively refine the result.Response Format
Same as the text-to-image endpoint:data[0] returns either url or b64_json — never both (depends on response_format). This endpoint defaults to b64_json.
b64_json mode (default):
{
"data": [
{
"b64_json": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."
}
],
"created": 1778037127,
"usage": {
"input_tokens": 98,
"output_tokens": 1185,
"total_tokens": 1283
}
}
url mode (requires explicit "response_format": "url"):
{
"data": [
{
"url": "https://r2cdn.copilotbase.com/r2cdn2/0e82148a-bec0-4b42-bbca-117c6b42581b.png"
}
],
"created": 1778037331,
"usage": {
"input_tokens": 30,
"output_tokens": 2074,
"total_tokens": 2104
}
}
b64_json field already contains the data:image/png;base64, prefix and can be used directly. Do not manually prepend the prefix.Authorizations
API Key from the API易 Console
Body
Model name, fixed to gpt-image-2-all
gpt-image-2-all Edit/fusion instruction. For multi-image fusion, reference upload order as image1/image2/image3
"Put the person from image1 into the scene of image2, using the art style of image3"
Reference images. For a single image, send the field once; for multiple images, repeat the same image field (e.g., -F image=@a.png -F image=@b.png) — upload order maps to image1 / image2 / ... in the prompt. Recommended ≤ 10MB each, formats png / jpg / webp.
Response format. b64_json returns a base64 string already prefixed with a data URL header (default); url returns an R2 CDN link
b64_json, url Response
Image successfully generated. Defaults to base64 in data[0].b64_json — url is not returned in the same response.
Image editing response. data[0] returns either url or b64_json, never both (depends on response_format; this endpoint defaults to b64_json).
Was this page helpful?