
openai/ gpt-image-2/ image-to-image
Image to ImageOpenAI GPT Image 2 makes fine-grained edits to your images, from rewriting in-image text to restyling props and scenes. Combine up to 16 reference images, add a mask for targeted changes, pick low to high quality and get up to 4 results per call.
317 / 32,000
More settings (4)
Billed per token · about $0.15 per image at default settings · $0.151 reserved per request

Turn this into a winter wedding invitation: change the date line to read "DECEMBER 12, 2027 · ZERMATT", replace the eucalyptus with snowy pine sprigs and small pinecones, and make the ribbon deep burgundy velvet. Keep "Emma & Lucas", the gold script, the card design, the marble and the camera angle exactly the same.
Pricing
- Text input /M
- $5.00
- Image input /M
- $8.00
- Image output /M
- $30.00
- Cache read /M
- $2.00
About $0.15 per image at default settings (high quality, 1 image); higher quality, larger sizes and more images use more tokens.
Each request temporarily reserves $0.151; you are charged for actual usage, usually within a minute: any unused amount is released and any usage above it is charged to your balance, even if that takes it below zero; while your balance is below zero, new requests are paused until a top-up covers it.
Failed generations are not charged.
API
Submit generation requests with this model ID.
/v1/model-tasksopenai/gpt-image-2/image-to-image{
"model": "openai/gpt-image-2/image-to-image",
"input": {
"prompt": "Turn this into a winter wedding invitation: change the date line to read \"DECEMBER 12, 2027 · ZERMATT\", replace the eucalyptus with snowy pine sprigs and small pinecones, and make the ribbon deep burgundy velvet. Keep \"Emma & Lucas\", the gold script, the card design, the marble and the camera angle exactly the same.",
"background": "auto",
"image_size": "auto",
"image_urls": [
"https://pub-a7287c8d5de944d984e22a5bd3ab9bbe.r2.dev/uploads/capability-demo-4ffa20a3b8f2c3e00ceb12f6d50e9559.png"
],
"num_images": 1,
"output_format": "png",
"quality": "high"
}
}Input schema
| Parameter | Type | Requirement | Default |
|---|---|---|---|
| image_urls | array | Required | — |
| prompt | string | Required | — |
| background | string | Optional | auto |
| image_size | object | string | Optional | auto |
| mask_url | string | Optional | — |
| num_images | integer | Optional | 1 |
| output_format | string | Optional | png |
| quality | string | Optional | high |
Response
The API returns a result or a pollable asynchronous task. See the examples and Schema below for the response mode and result fields.
Code examples
Async submission returns a task ID. Poll until status is completed, then retrieve the generated content from the result. Get your API key in the console.
# Use a new directory for each new generation. Rerunning here continues this task.
set -eu
test -s model-task-id.txt || python3 -c "import uuid; print(uuid.uuid4())" > model-task-id.txt
REQUEST_ID=$(cat model-task-id.txt)
# Idempotent: resending the same bytes with the same ID never charges twice.
curl --fail-with-body --retry 3 --retry-connrefused --request POST 'https://api.musespan.com/v1/model-tasks' \
--header "Authorization: Bearer $MUSESPAN_API_KEY" \
--header "X-Request-Id: $REQUEST_ID" \
--header "Content-Type: application/json" \
--data '{"model":"openai/gpt-image-2/image-to-image","input":{"prompt":"Turn this into a winter wedding invitation: change the date line to read \"DECEMBER 12, 2027 · ZERMATT\", replace the eucalyptus with snowy pine sprigs and small pinecones, and make the ribbon deep burgundy velvet. Keep \"Emma & Lucas\", the gold script, the card design, the marble and the camera angle exactly the same.","background":"auto","image_size":"auto","image_urls":["https://pub-a7287c8d5de944d984e22a5bd3ab9bbe.r2.dev/uploads/capability-demo-4ffa20a3b8f2c3e00ceb12f6d50e9559.png"],"num_images":1,"output_format":"png","quality":"high"}}'
# Poll every 5 seconds for up to 25 minutes until status is completed or failed.
# Still queued (with queue_position) 5 minutes after submission: failed with queue_timeout, not charged.
# No result 15 minutes after acceptance (or no confirmation 15 minutes after submission): failed with generation_timeout, not charged.
# Any failure is final: generate again in a new directory (a new X-Request-Id).
# A 404 means the POST did not arrive: rerun this script to resend it with the same ID.
curl --fail-with-body 'https://api.musespan.com/v1/model-tasks/'"$REQUEST_ID"'' --header "Authorization: Bearer $MUSESPAN_API_KEY"