Skip to main content
POST
/
v1
/
images
/
edits
Image editing: edit or fuse reference images with instructions
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.

The interactive Playground on the right supports direct local file upload. Enter your API Key in the Authorization field (format: Bearer sk-xxx), select images, fill in prompt and model, then click send.
Scope: This page is for editing or fusing one or more reference images. Requests use multipart/form-data. For pure text-to-image generation, use the Text-to-Image endpoint.
🖥️ Browser Playground limitation (default b64_json mode)This endpoint defaults to response_format: "b64_json", so the response carries a multi-MB base64 string and the browser Playground may show 请求时发生错误: unable to complete requestthe 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.
📎 Multi-image order mattersThe 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 image3
Recommended ≤ 10MB per image, formats png / jpg / webp. Overly large images may hit gateway limits.
🎯 Shape-preserving edits: This endpoint’s output aspect ratio follows whichever reference image the prompt names as the edit targetnot necessarily the first one in multi-image scenarios.For example, with the prompt “modify image2, change image2’s outfit and hat to match image1”, if image2 is 1:1, the output is 1:1 (even if image1 is a landscape 16:9).Useful for outfit swaps, adding accessories, retouching, and other shape-preserving edits. The 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"])
Multi-image fusion:
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"
Multi-image fusion:
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

FieldTypeRequiredDescription
modeltextYesFixed: gpt-image-2-all
prompttextYesNatural-language edit/fusion instruction
imagefileYesReference image; can be repeated
sizetextNoField 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_formattextNob64_json (default) or url
Multi-turn iteration: Feed the previous output image back as 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
  }
}
The b64_json field already contains the data:image/png;base64, prefix and can be used directly. Do not manually prepend the prefix.

Authorizations

Authorization
string
header
required

API Key from the API易 Console

Body

multipart/form-data
model
enum<string>
default:gpt-image-2-all
required

Model name, fixed to gpt-image-2-all

Available options:
gpt-image-2-all
prompt
string
required

Edit/fusion instruction. For multi-image fusion, reference upload order as image1/image2/image3

Example:

"Put the person from image1 into the scene of image2, using the art style of image3"

image
file[]
required

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
enum<string>
default:b64_json

Response format. b64_json returns a base64 string already prefixed with a data URL header (default); url returns an R2 CDN link

Available options:
b64_json,
url

Response

Image successfully generated. Defaults to base64 in data[0].b64_jsonurl 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).

data
object[]

Result array (this model returns 1 image per call)

created
integer

Unix timestamp (seconds)

usage
object

Token usage statistics