curl --request POST \
--url https://api.bitstudio.ai/images/{id}/edit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "Use a warm off-white studio background. Keep the person and suit unchanged.",
"model": "nano-banana-2",
"resolution": "standard",
"num_images": 1
}
'import requests
url = "https://api.bitstudio.ai/images/{id}/edit"
payload = {
"prompt": "Use a warm off-white studio background. Keep the person and suit unchanged.",
"model": "nano-banana-2",
"resolution": "standard",
"num_images": 1
}
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({
prompt: 'Use a warm off-white studio background. Keep the person and suit unchanged.',
model: 'nano-banana-2',
resolution: 'standard',
num_images: 1
})
};
fetch('https://api.bitstudio.ai/images/{id}/edit', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bitstudio.ai/images/{id}/edit",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'prompt' => 'Use a warm off-white studio background. Keep the person and suit unchanged.',
'model' => 'nano-banana-2',
'resolution' => 'standard',
'num_images' => 1
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.bitstudio.ai/images/{id}/edit"
payload := strings.NewReader("{\n \"prompt\": \"Use a warm off-white studio background. Keep the person and suit unchanged.\",\n \"model\": \"nano-banana-2\",\n \"resolution\": \"standard\",\n \"num_images\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.bitstudio.ai/images/{id}/edit")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"Use a warm off-white studio background. Keep the person and suit unchanged.\",\n \"model\": \"nano-banana-2\",\n \"resolution\": \"standard\",\n \"num_images\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bitstudio.ai/images/{id}/edit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prompt\": \"Use a warm off-white studio background. Keep the person and suit unchanged.\",\n \"model\": \"nano-banana-2\",\n \"resolution\": \"standard\",\n \"num_images\": 1\n}"
response = http.request(request)
puts response.read_body{
"id": "11111111-1111-4111-8111-111111111111",
"status": "completed",
"path": "https://media.bitstudio.ai/public/homepage/2026-09/bitstudio-shirt-reference-front-v1-77caf2ea41d661e4.webp",
"width_px": 900,
"height_px": 1125,
"is_generated": false,
"created_timestamp": "2026-09-06T12:00:00Z",
"versions": [
{
"id": "22222222-2222-4222-8222-222222222222",
"image_id": "11111111-1111-4111-8111-111111111111",
"source_image_id": "33333333-3333-4333-8333-333333333333",
"version_type": "edited",
"status": "pending",
"path": ""
}
]
}{
"error": "<string>",
"code": "<string>",
"message": "<string>",
"cta": true,
"next_action": "<string>",
"current_plan": "<string>",
"user_message": "<string>",
"extra_context": "<string>"
}Edit an image
Returns the parent image with a new version. The original may already be completed. Track the new version id and poll its source_image_id for the operation’s result.
curl --request POST \
--url https://api.bitstudio.ai/images/{id}/edit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "Use a warm off-white studio background. Keep the person and suit unchanged.",
"model": "nano-banana-2",
"resolution": "standard",
"num_images": 1
}
'import requests
url = "https://api.bitstudio.ai/images/{id}/edit"
payload = {
"prompt": "Use a warm off-white studio background. Keep the person and suit unchanged.",
"model": "nano-banana-2",
"resolution": "standard",
"num_images": 1
}
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({
prompt: 'Use a warm off-white studio background. Keep the person and suit unchanged.',
model: 'nano-banana-2',
resolution: 'standard',
num_images: 1
})
};
fetch('https://api.bitstudio.ai/images/{id}/edit', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.bitstudio.ai/images/{id}/edit",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'prompt' => 'Use a warm off-white studio background. Keep the person and suit unchanged.',
'model' => 'nano-banana-2',
'resolution' => 'standard',
'num_images' => 1
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.bitstudio.ai/images/{id}/edit"
payload := strings.NewReader("{\n \"prompt\": \"Use a warm off-white studio background. Keep the person and suit unchanged.\",\n \"model\": \"nano-banana-2\",\n \"resolution\": \"standard\",\n \"num_images\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.bitstudio.ai/images/{id}/edit")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"Use a warm off-white studio background. Keep the person and suit unchanged.\",\n \"model\": \"nano-banana-2\",\n \"resolution\": \"standard\",\n \"num_images\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bitstudio.ai/images/{id}/edit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prompt\": \"Use a warm off-white studio background. Keep the person and suit unchanged.\",\n \"model\": \"nano-banana-2\",\n \"resolution\": \"standard\",\n \"num_images\": 1\n}"
response = http.request(request)
puts response.read_body{
"id": "11111111-1111-4111-8111-111111111111",
"status": "completed",
"path": "https://media.bitstudio.ai/public/homepage/2026-09/bitstudio-shirt-reference-front-v1-77caf2ea41d661e4.webp",
"width_px": 900,
"height_px": 1125,
"is_generated": false,
"created_timestamp": "2026-09-06T12:00:00Z",
"versions": [
{
"id": "22222222-2222-4222-8222-222222222222",
"image_id": "11111111-1111-4111-8111-111111111111",
"source_image_id": "33333333-3333-4333-8333-333333333333",
"version_type": "edited",
"status": "pending",
"path": ""
}
]
}{
"error": "<string>",
"code": "<string>",
"message": "<string>",
"cta": true,
"next_action": "<string>",
"current_plan": "<string>",
"user_message": "<string>",
"extra_context": "<string>"
}Authorizations
Create an API key in Studio → account menu → API Keys. Keep it on your server.
Path Parameters
Image or asset ID from a previous response. Resource ID.
Body
Describe the requested change.
1Output quality. Send explicitly. Pixel dimensions depend on the image model.
standard, high "standard"
Optional version of this image to use as the source. Omit to use the original image.
Image model used for the edit.
"nano-banana-2"
Number of outputs. Defaults to 1. Account limits still apply.
1 <= x <= 11
Optional target ratio, especially for extend.
Kind of edit. Feature and model availability vary.
edit, pose-change, face-swap, extend Optional image reference. Do not combine with reference_asset_id.
Optional reusable asset reference. Do not combine with reference_image_id.
Multiple image references for text edits.
3Resource ID.
Multiple asset references for text edits.
3Resource ID.
Optional processing speed; accepted values depend on the operation and model.
Response
Returns the parent image with a new version. The original may already be completed. Track the new version id and poll its source_image_id for the operation’s result.
Resource ID.
Job state. Only completed has a finished result.
pending, generating, completed, failed, policy_blocked, nsfw_filtered Result URL. Can be null while the job is pending.
Whether the upload is a reusable asset reference.
Operation that created this job.
Human-readable failure detail.
Machine-readable failure category, when available.
input_rejected, provider_unavailable, queue_timeout, policy_blocked Linked reusable assets.
Resource ID.
Related versions. May be omitted or empty. Never infer a new version is completed from the parent status.
Show child attributes
Show child attributes