curl --request POST \
--url https://api.bitstudio.ai/v1/images/{id}/edit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "Replace the background with a white studio. Keep the person and clothing."
}
'import requests
url = "https://api.bitstudio.ai/v1/images/{id}/edit"
payload = { "prompt": "Replace the background with a white studio. Keep the person and clothing." }
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: 'Replace the background with a white studio. Keep the person and clothing.'
})
};
fetch('https://api.bitstudio.ai/v1/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/v1/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' => 'Replace the background with a white studio. Keep the person and clothing.'
]),
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/v1/images/{id}/edit"
payload := strings.NewReader("{\n \"prompt\": \"Replace the background with a white studio. Keep the person and clothing.\"\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/v1/images/{id}/edit")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"Replace the background with a white studio. Keep the person and clothing.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bitstudio.ai/v1/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\": \"Replace the background with a white studio. Keep the person and clothing.\"\n}"
response = http.request(request)
puts response.read_body{
"jobs": [
{
"id": "11111111-1111-4111-8111-111111111111",
"status": "pending",
"task": "edit",
"created_at": "2026-09-15T12:00:00Z",
"result": null,
"error": null,
"credits_used": 2
}
]
}{
"code": "<string>",
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"error": "<string>",
"cta": true,
"next_action": "<string>"
}Edit an image
Describe the change to make to a completed image.
curl --request POST \
--url https://api.bitstudio.ai/v1/images/{id}/edit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "Replace the background with a white studio. Keep the person and clothing."
}
'import requests
url = "https://api.bitstudio.ai/v1/images/{id}/edit"
payload = { "prompt": "Replace the background with a white studio. Keep the person and clothing." }
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: 'Replace the background with a white studio. Keep the person and clothing.'
})
};
fetch('https://api.bitstudio.ai/v1/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/v1/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' => 'Replace the background with a white studio. Keep the person and clothing.'
]),
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/v1/images/{id}/edit"
payload := strings.NewReader("{\n \"prompt\": \"Replace the background with a white studio. Keep the person and clothing.\"\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/v1/images/{id}/edit")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"Replace the background with a white studio. Keep the person and clothing.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bitstudio.ai/v1/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\": \"Replace the background with a white studio. Keep the person and clothing.\"\n}"
response = http.request(request)
puts response.read_body{
"jobs": [
{
"id": "11111111-1111-4111-8111-111111111111",
"status": "pending",
"task": "edit",
"created_at": "2026-09-15T12:00:00Z",
"result": null,
"error": null,
"credits_used": 2
}
]
}{
"code": "<string>",
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"error": "<string>",
"cta": true,
"next_action": "<string>"
}result.id in the URL. Describe the change in prompt, including the details to preserve. The default model is nano-banana-2.
Each request creates one new image. To refine it, wait for completion and use the edit’s result.id in the next request. The source remains available. Your integration does not select or manage Studio versions.
Use edit_type for edit, pose-change, face-swap, or extend; model and account restrictions still apply. For a precise region, use inpaint.
A successful request returns HTTP 202 with a jobs array. Save each id, then get the job until it finishes. Read the completed media from result.url and its reusable ID from result.id. Use an Idempotency-Key when submitting work that may be retried.Authorizations
Create an API key in Studio → account menu → API Keys. Keep it on your server.
Headers
Use a unique key for each intended creation. Retry the same method, path and JSON with the same key to replay its response for 24 hours after completion. Conflicting requests and unfinished or uncertain outcomes return 409. An uncertain receipt is never automatically rerun.
1 - 128^[!-~]+$Path Parameters
Source resource ID.
Body
Describe the requested change.
1Model for this operation. Account and plan limits apply.
Output quality; dimensions depend on the model and aspect ratio.
standard, high 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 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
Accepted; poll each job.
1Show child attributes
Show child attributes