Venice Image Editing
Four endpoints, all operating on existing images:
| Endpoint |
Purpose |
POST /image/edit |
Transform one image with a text prompt. |
POST /image/multi-edit |
Composite / layer several images with a single prompt. Also has a multipart/form-data variant. |
POST /image/upscale |
Upscale 2× or 4×. |
POST /image/background-remove |
Produce a transparent cutout. |
For text-to-image generation, see venice-image-generate.
Shared rules
- Input image accepts base64 string, file upload (multipart for
/image/multi-edit), or HTTPS URL (for edit + multi-edit + background-remove).
- File size < 25 MB. Image dimensions must be between 65,536 (256×256 equivalent) and 33,177,600 pixels (~5,761×5,761). Upscale caps at 16,777,216 pixels after scaling.
- HTTPS URLs must be publicly reachable from Venice's network.
- All four endpoints return the image as binary, never JSON. There is no
return_binary field on edit / multi-edit / upscale / background-remove (that flag only exists on /image/generate). /image/edit and /image/multi-edit return image/png, image/jpeg, or image/webp depending on output_format; /image/upscale and /image/background-remove always return image/png.
/image/edit
Edit one image with a short, descriptive prompt.
curl https://api.venice.ai/api/v1/image/edit \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "firered-image-edit",
"prompt": "Change the color of the sky to a sunrise",
"image": "iVBORw0KGgoAAAANSUhEUg...",
"aspect_ratio": "16:9",
"safe_mode": true
}'
| Field |
Notes |
model |
Default firered-image-edit. See GET /models?type=inpaint for edit-capable models. modelId is accepted for backwards compatibility but deprecated on /image/edit — prefer model. |
prompt |
Required, ≤ 32 768 chars (usually 1500 is plenty). Short & specific works best. |
image |
Required. Base64 string, file upload, or https:// URL. |
aspect_ratio |
Optional: auto, 1:1, 3:2, 16:9, 21:9, 9:16, 2:3, 3:4, 4:5. Supported values vary per model — check constraints on GET /models. |
resolution |
Optional tier, e.g. "1K", "2K", "4K". Defaults to "1K". Supported values vary per model. |
output_format |
Optional jpeg | png | webp. When omitted, inferred from resolution: PNG for 1K, JPEG for 2K/4K. |
enhance_prompt |
Optional bool, default false. Rewrites your prompt against the input image before editing. Costs extra credits and adds up to ~30 s. The rewritten prompt comes back URL-encoded in the x-venice-enhanced-prompt response header. |
disable_prompt_optimization_thinking |
Optional bool. Skips the model's prompt-optimization thinking step for speed. Only honored by models with supportsOptimizePromptThinking; ignored elsewhere. |
safe_mode |
Default true; blurs adult content. |
Good prompts: "remove the tree", "add sunglasses to the cat", "make the sky a vivid orange sunrise".
Edit-capable model IDs change often. Read them from GET /models?type=inpaint
rather than pinning a literal, and note that older IDs like qwen-edit have
been retired in favor of qwen-image-2-edit and friends.
/image/multi-edit
Combine several images into one with a prompt. The first image is the base; the rest are layers / masks / references. The minimum is 1 image and the maximum is model-specific — read capabilities.maxInputImages from GET /models.
Field name: /image/multi-edit takes modelId, not model. This is the only image endpoint that uses modelId as the primary field name.
JSON (base64 or URLs)
{
"modelId": "firered-image-edit",
"prompt": "Place the person from image 2 onto the beach in image 1",
"images": [
"https://example.com/beach.jpg",
"data:image/png;base64,iVBOR..."
],
"safe_mode": true
}
Multipart (file upload)
POST /image/multi-edit
Content-Type: multipart/form-data
--boundary
Content-Disposition: form-data; name="modelId"
firered-image-edit
--boundary
Content-Disposition: form-data; name="prompt"
Place the person from image 2 onto the beach in image 1
--boundary
Content-Disposition: form-data; name="images"; filename="base.jpg"
Content-Type: image/jpeg
<bytes>
--boundary
Content-Disposition: form-data; name="images"; filename="subject.png"
Content-Type: image/png
<bytes>
--boundary--
| Field |
Notes |
modelId |
Required field name (multi-edit does not accept model). Default firered-image-edit. |
prompt |
Required, ≤ 32 768 chars. |
images |
Required. Minimum 1; maximum is model-specific (capabilities.maxInputImages). JSON variant accepts base64 or HTTPS URLs; multipart variant accepts raw file parts. |
aspect_ratio |
Optional; inferred from the first image when set to auto or omitted. |
resolution |
Optional tier, e.g. "1K", "2K", "4K". Defaults to "1K". |
output_format |
Optional jpeg | png | webp. Inferred from resolution when omitted. |
quality |
Optional low | medium | high for models that support it (e.g. GPT Image 2). Higher values can raise the charge. |
enhance_prompt |
Optional bool, default false. Same behavior and x-venice-enhanced-prompt header as /image/edit. |
disable_prompt_optimization_thinking |
Optional bool. |
safe_mode |
Default true. |
/image/upscale
Upscale 2× or 4×. This endpoint has three fields.
Breaking change: /image/upscale no longer accepts enhance,
enhanceCreativity, enhancePrompt, or replication, and no longer accepts
scale: 1. The enhancer knobs were replaced by a single creativity field
with a much narrower range. If you are sending the old fields, drop them.
curl https://api.venice.ai/api/v1/image/upscale \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image": "iVBORw0KGgo...",
"scale": 4,
"creativity": 0.01
}'
| Field |
Type |
Default |
Notes |
image |
base64, file upload |
— |
Required. Must be ≥ 65 536 px² to start, < 25 MB, and ≤ 16 777 216 px after scaling. |
scale |
number, 2 or 4 |
2 |
Must be either 2 or 4. 4 on large images is dynamically reduced to stay within the 16 MP output cap. |
creativity |
number, 0–0.02 |
0.01 |
How much detail and texture the upscaler adds. Higher adds more; lower stays closer to the source. Values outside the range are clamped, so 0.5 behaves as 0.02, not as "half creative". Nullable. |
Also available as multipart/form-data. Response is the upscaled image as
binary image/png.
/image/background-remove
Produce a transparent PNG cutout.
# With base64
curl https://api.venice.ai/api/v1/image/background-remove \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"image": "iVBOR..."}'
# With a URL
curl https://api.venice.ai/api/v1/image/background-remove \
-H "Authorization: Bearer $VENICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"image_url": "https://example.com/photo.jpg"}'
Send either image (base64 / file) or image_url. Response is image/png with alpha channel.
Error behavior (all four endpoints)
| Code |
Cause |
400 |
Bad params — image dims out of range, file too large, unknown model, unsupported aspect ratio for the model, content-policy refusal. |
401 |
Auth failed. (Pro-gating on these paths surfaces as 400 / 402 depending on condition.) |
402 |
Insufficient balance. Bearer: plain { "error": "Insufficient balance" }. x402: PAYMENT_REQUIRED body + PAYMENT-REQUIRED header. |
415 |
Wrong Content-Type (e.g. JSON sent to a multipart endpoint, or vice versa). |
429 |
Rate limited. |
500 / 503 |
Inference / capacity issue — retry with jitter. |
(413 and 422 are not documented for these image paths in the OpenAPI spec — a 413 from the platform may still appear if you exceed ingress limits, but treat 400 / 415 as the primary failure surface.)
Gotchas
/image/multi-edit images[] explicitly accepts data:image/...;base64,... URLs or plain base64. For /image/edit and /image/upscale, send base64 as a plain string unless the docs say otherwise — if your client adds a data: prefix and you get a 400, strip it.
- For multipart
/image/multi-edit, the field name is images and you send multiple parts with the same field name — order matters (base first).
- Field-name asymmetry:
/image/edit prefers model (modelId is a deprecated alias). /image/multi-edit accepts only modelId. Get the name right per endpoint — sending the wrong one is a 400.
/image/upscale with scale=4 on a large input is silently clamped to stay under 16 MP.
creativity on /image/upscale is not the old enhanceCreativity under a new name. Its usable range is 0 to 0.02, so port enhanceCreativity: 0.5 as creativity: 0.02 (the maximum), not as 0.5.
enhance_prompt on edit / multi-edit bills extra credits whenever a rewrite is produced. Leave it off for latency-sensitive or cost-sensitive calls.
safe_mode: true can blur otherwise valid inputs if the source image trips content classifiers; switch to false (and handle the legal/ToS consequences yourself) when you control the input.
/image/background-remove takes either image or image_url, not both.
1---2name: venice-image-edit3description: Transform existing images with Venice. Covers POST /image/edit (prompt-driven single-image edit), /image/multi-edit (compose multiple images), /image/upscale (2x or 4x upscale), and /image/background-remove. Accepts base64, file upload, or HTTPS URL.4---56# Venice Image Editing78Four endpoints, all operating on existing images:910| Endpoint | Purpose |11|---|---|12| `POST /image/edit` | Transform one image with a text prompt. |13| `POST /image/multi-edit` | Composite / layer several images with a single prompt. Also has a `multipart/form-data` variant. |14| `POST /image/upscale` | Upscale 2× or 4×. |15| `POST /image/background-remove` | Produce a transparent cutout. |1617For text-to-image generation, see [`venice-image-generate`](../venice-image-generate/SKILL.md).1819## Shared rules2021- Input image accepts **base64 string**, **file upload** (multipart for `/image/multi-edit`), or **HTTPS URL** (for edit + multi-edit + background-remove).22- File size < **25 MB**. Image dimensions must be between **65,536** (256×256 equivalent) and **33,177,600** pixels (~5,761×5,761). Upscale caps at **16,777,216** pixels after scaling.23- HTTPS URLs must be publicly reachable from Venice's network.24- All four endpoints return the image as **binary**, never JSON. There is no `return_binary` field on edit / multi-edit / upscale / background-remove (that flag only exists on `/image/generate`). `/image/edit` and `/image/multi-edit` return `image/png`, `image/jpeg`, or `image/webp` depending on `output_format`; `/image/upscale` and `/image/background-remove` always return `image/png`.2526## `/image/edit`2728Edit one image with a short, descriptive prompt.2930```bash31curl https://api.venice.ai/api/v1/image/edit \32 -H "Authorization: Bearer $VENICE_API_KEY" \33 -H "Content-Type: application/json" \34 -d '{35 "model": "firered-image-edit",36 "prompt": "Change the color of the sky to a sunrise",37 "image": "iVBORw0KGgoAAAANSUhEUg...",38 "aspect_ratio": "16:9",39 "safe_mode": true40 }'41```4243| Field | Notes |44|---|---|45| `model` | Default `firered-image-edit`. See `GET /models?type=inpaint` for edit-capable models. `modelId` is accepted for backwards compatibility but deprecated on `/image/edit` — prefer `model`. |46| `prompt` | Required, ≤ 32 768 chars (usually 1500 is plenty). Short & specific works best. |47| `image` | Required. Base64 string, file upload, or `https://` URL. |48| `aspect_ratio` | Optional: `auto`, `1:1`, `3:2`, `16:9`, `21:9`, `9:16`, `2:3`, `3:4`, `4:5`. Supported values vary per model — check `constraints` on `GET /models`. |49| `resolution` | Optional tier, e.g. `"1K"`, `"2K"`, `"4K"`. Defaults to `"1K"`. Supported values vary per model. |50| `output_format` | Optional `jpeg` \| `png` \| `webp`. When omitted, inferred from `resolution`: PNG for 1K, JPEG for 2K/4K. |51| `enhance_prompt` | Optional bool, default `false`. Rewrites your prompt against the input image before editing. Costs extra credits and adds up to ~30 s. The rewritten prompt comes back URL-encoded in the `x-venice-enhanced-prompt` response header. |52| `disable_prompt_optimization_thinking` | Optional bool. Skips the model's prompt-optimization thinking step for speed. Only honored by models with `supportsOptimizePromptThinking`; ignored elsewhere. |53| `safe_mode` | Default `true`; blurs adult content. |5455Good prompts: *"remove the tree"*, *"add sunglasses to the cat"*, *"make the sky a vivid orange sunrise"*.5657Edit-capable model IDs change often. Read them from `GET /models?type=inpaint`58rather than pinning a literal, and note that older IDs like `qwen-edit` have59been retired in favor of `qwen-image-2-edit` and friends.6061## `/image/multi-edit`6263Combine several images into one with a prompt. The **first image is the base**; the rest are layers / masks / references. The minimum is 1 image and the maximum is model-specific — read `capabilities.maxInputImages` from `GET /models`.6465> **Field name:** `/image/multi-edit` takes **`modelId`**, not `model`. This is the only image endpoint that uses `modelId` as the primary field name.6667### JSON (base64 or URLs)6869```json70{71 "modelId": "firered-image-edit",72 "prompt": "Place the person from image 2 onto the beach in image 1",73 "images": [74 "https://example.com/beach.jpg",75 "data:image/png;base64,iVBOR..."76 ],77 "safe_mode": true78}79```8081### Multipart (file upload)8283```84POST /image/multi-edit85Content-Type: multipart/form-data8687--boundary88Content-Disposition: form-data; name="modelId"8990firered-image-edit91--boundary92Content-Disposition: form-data; name="prompt"9394Place the person from image 2 onto the beach in image 195--boundary96Content-Disposition: form-data; name="images"; filename="base.jpg"97Content-Type: image/jpeg9899<bytes>100--boundary101Content-Disposition: form-data; name="images"; filename="subject.png"102Content-Type: image/png103104<bytes>105--boundary--106```107108| Field | Notes |109|---|---|110| `modelId` | **Required field name** (multi-edit does not accept `model`). Default `firered-image-edit`. |111| `prompt` | Required, ≤ 32 768 chars. |112| `images` | Required. Minimum 1; maximum is model-specific (`capabilities.maxInputImages`). JSON variant accepts base64 or HTTPS URLs; multipart variant accepts raw file parts. |113| `aspect_ratio` | Optional; inferred from the **first** image when set to `auto` or omitted. |114| `resolution` | Optional tier, e.g. `"1K"`, `"2K"`, `"4K"`. Defaults to `"1K"`. |115| `output_format` | Optional `jpeg` \| `png` \| `webp`. Inferred from `resolution` when omitted. |116| `quality` | Optional `low` \| `medium` \| `high` for models that support it (e.g. GPT Image 2). Higher values can raise the charge. |117| `enhance_prompt` | Optional bool, default `false`. Same behavior and `x-venice-enhanced-prompt` header as `/image/edit`. |118| `disable_prompt_optimization_thinking` | Optional bool. |119| `safe_mode` | Default `true`. |120121## `/image/upscale`122123Upscale 2× or 4×. This endpoint has **three fields**.124125> **Breaking change:** `/image/upscale` no longer accepts `enhance`,126> `enhanceCreativity`, `enhancePrompt`, or `replication`, and no longer accepts127> `scale: 1`. The enhancer knobs were replaced by a single `creativity` field128> with a much narrower range. If you are sending the old fields, drop them.129130```bash131curl https://api.venice.ai/api/v1/image/upscale \132 -H "Authorization: Bearer $VENICE_API_KEY" \133 -H "Content-Type: application/json" \134 -d '{135 "image": "iVBORw0KGgo...",136 "scale": 4,137 "creativity": 0.01138 }'139```140141| Field | Type | Default | Notes |142|---|---|---|---|143| `image` | base64, file upload | — | Required. Must be ≥ 65 536 px² to start, < 25 MB, and ≤ 16 777 216 px after scaling. |144| `scale` | number, 2 or 4 | 2 | Must be either `2` or `4`. `4` on large images is dynamically reduced to stay within the 16 MP output cap. |145| `creativity` | number, 0–0.02 | 0.01 | How much detail and texture the upscaler adds. Higher adds more; lower stays closer to the source. Values outside the range are clamped, so `0.5` behaves as `0.02`, not as "half creative". Nullable. |146147Also available as `multipart/form-data`. Response is the upscaled image as148binary `image/png`.149150## `/image/background-remove`151152Produce a transparent PNG cutout.153154```bash155# With base64156curl https://api.venice.ai/api/v1/image/background-remove \157 -H "Authorization: Bearer $VENICE_API_KEY" \158 -H "Content-Type: application/json" \159 -d '{"image": "iVBOR..."}'160161# With a URL162curl https://api.venice.ai/api/v1/image/background-remove \163 -H "Authorization: Bearer $VENICE_API_KEY" \164 -H "Content-Type: application/json" \165 -d '{"image_url": "https://example.com/photo.jpg"}'166```167168Send **either** `image` (base64 / file) **or** `image_url`. Response is `image/png` with alpha channel.169170## Error behavior (all four endpoints)171172| Code | Cause |173|---|---|174| `400` | Bad params — image dims out of range, file too large, unknown model, unsupported aspect ratio for the model, content-policy refusal. |175| `401` | Auth failed. (Pro-gating on these paths surfaces as `400` / `402` depending on condition.) |176| `402` | Insufficient balance. Bearer: plain `{ "error": "Insufficient balance" }`. x402: `PAYMENT_REQUIRED` body + `PAYMENT-REQUIRED` header. |177| `415` | Wrong `Content-Type` (e.g. JSON sent to a multipart endpoint, or vice versa). |178| `429` | Rate limited. |179| `500` / `503` | Inference / capacity issue — retry with jitter. |180181(`413` and `422` are **not** documented for these image paths in the OpenAPI spec — a `413` from the platform may still appear if you exceed ingress limits, but treat `400` / `415` as the primary failure surface.)182183## Gotchas184185- `/image/multi-edit` `images[]` explicitly accepts `data:image/...;base64,...` URLs or plain base64. For `/image/edit` and `/image/upscale`, send base64 as a plain string unless the docs say otherwise — if your client adds a `data:` prefix and you get a `400`, strip it.186- For multipart `/image/multi-edit`, the field name is `images` and you send **multiple parts with the same field name** — order matters (base first).187- Field-name asymmetry: `/image/edit` prefers **`model`** (`modelId` is a deprecated alias). `/image/multi-edit` accepts **only `modelId`**. Get the name right per endpoint — sending the wrong one is a `400`.188- `/image/upscale` with `scale=4` on a large input is silently clamped to stay under 16 MP.189- `creativity` on `/image/upscale` is **not** the old `enhanceCreativity` under a new name. Its usable range is 0 to 0.02, so port `enhanceCreativity: 0.5` as `creativity: 0.02` (the maximum), not as `0.5`.190- `enhance_prompt` on edit / multi-edit bills extra credits whenever a rewrite is produced. Leave it off for latency-sensitive or cost-sensitive calls.191- `safe_mode: true` can blur otherwise valid inputs if the source image trips content classifiers; switch to `false` (and handle the legal/ToS consequences yourself) when you control the input.192- `/image/background-remove` takes **either** `image` **or** `image_url`, not both.