# FLUX.3 Klein Image Editing API

> Editor FLUX.3 Klein dengan hingga 10 referensi dan penempatan objek opsional menggunakan kotak pembatas

Mengedit atau menyusun gambar dari prompt dan 1 hingga 10 referensi dalam `image_urls`, yang dapat dirujuk prompt berdasarkan urutan, seperti gambar pertama. Hingga 32 `bounding_boxes` dapat mempertahankan, memindahkan, mengubah ukuran, menghapus, atau menambahkan objek yang dinamai dalam prompt berdasarkan label. Perluasan prompt aktif secara bawaan. Mengembalikan 1 hingga 4 gambar dalam jpeg, png, atau webp.

- Model id: `blackforestlabs/flux-3/klein/edit-image`
- Made by: Black Forest Labs
- Category: Image Editing
- Output: image
- Price per run: from $0.008 / run of output image (cheapest run $0.008 (8 API credits))
- Run: `POST https://api.doitong.ru/v1/run/blackforestlabs/flux-3/klein/edit-image`
- Quote: `POST https://api.doitong.ru/v1/quote/blackforestlabs/flux-3/klein/edit-image`
- Docs page: https://doitong.com/id/developers/models/blackforestlabs/flux-3/klein/edit-image

## Pricing

Price: **from $0.008 / run of output image** (the lowest tier; the quote prices your exact input). Price per run: the input files are measured before the run (length, resolution, frame rate). The quote measures the same files and is exactly what the run charges.

The full example input below costs $0.009 = 9 API credits (1 run × $0.009).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). `POST https://api.doitong.ru/v1/quote/blackforestlabs/flux-3/klein/edit-image` with the same JSON body returns the exact price for that input; the quote is exactly what a run charges. Invalid input is never charged and failed or canceled requests are refunded automatically.

## Input parameters

Send either the canonical name or the native field name (not both). Canonical names are the same across models.

| Parameter | Canonical name | Type | Required | Default | Allowed values / range | Description |
|---|---|---|---|---|---|---|
| `prompt` |  | string | yes |  |  | Tulis caption lengkap yang menjelaskan gambar yang diinginkan setelah editing, dengan mengidentifikasi referensi berdasarkan urutan, seperti gambar pertama atau kedua. |
| `enable_prompt_expansion` |  | boolean | no | `true` |  | Perluasan prompt menjadi caption terperinci sebelum pembuatan, diaktifkan saat true. Untuk editing, caption didasarkan pada gambar referensi. |
| `seed` |  | integer \| null | no |  |  | Seed untuk gambar yang dapat direproduksi: prompt dan seed identik menghasilkan gambar identik jika versi model tidak berubah. |
| `num_images` | `num_outputs` | integer | no | `1` | 1 – 4 | Jumlah gambar yang diminta untuk dibuat. |
| `enable_safety_checker` |  | boolean | no | `true` |  | Aktivasi pemeriksa keamanan; true mengaktifkan pemeriksaan. |
| `output_format` |  | enum (string) | no | `png` | `jpeg`, `png`, `webp` | Format file untuk gambar hasil. |
| `image_urls` | `images` | array of image URL | yes |  | 1 – 10 items | Gambar referensi yang digunakan untuk editing atau komposisi, maksimum 10. |
| `image_size` |  | object {width, height} \| enum (string) \| null | no |  | `square_hd`, `square`, `portrait_4_3`, `portrait_16_9`, `landscape_4_3`, `landscape_16_9` | Dimensi output secara bawaan mengikuti referensi pertama, dibatasi hingga 1 megapiksel untuk beberapa referensi atau diskalakan hingga maksimal 4 megapiksel untuk satu referensi. Ukuran eksplisit harus memiliki setiap sisi antara 256 dan 4096 piksel. |
| `bounding_boxes` |  | array of object {label, description, box, source_image_index, source_box, target_box} \| null | no |  | ≤ 32 items | Tata letak objek opsional untuk mempertahankan, memindahkan, mengubah ukuran, atau menghapus objek referensi, atau menempatkan objek baru. Koordinat dimulai dari (0, 0) di sudut kiri atas setiap gambar; rujuk kotak menggunakan label dalam prompt, seperti `<dragon>`. |
| `bounding_boxes[].label` |  | string \| null | no |  | ≤ 64 characters | Label objek singkat untuk kotak, seperti `dragon`; nilai bawaan adalah `obj_<n>`. Sertakan `<dragon>` dalam prompt untuk mengaitkan katanya dengan kotak; kotak yang tidak disebutkan dalam prompt ditambahkan ke adegan. |
| `bounding_boxes[].description` |  | string | yes |  | ≤ 500 characters | Objek yang dirender dalam kotak, termasuk tampilannya. |
| `bounding_boxes[].box` |  | object {x_min, y_min, x_max, y_max} \| null | no |  |  | Penempatan output untuk objek, menggantikan `source_box`/`target_box` dan menggunakan perilaku penempatan yang sama seperti text-to-image. |
| `bounding_boxes[].box.x_min` |  | number | yes |  | 0 – 1 | Batas kiri yang dinyatakan relatif terhadap lebar gambar, dari 0 hingga 1. |
| `bounding_boxes[].box.y_min` |  | number | yes |  | 0 – 1 | Batas atas yang dinyatakan relatif terhadap tinggi gambar, dari 0 hingga 1. |
| `bounding_boxes[].box.x_max` |  | number | yes |  | 0 – 1 | Batas kanan yang dinyatakan relatif terhadap lebar gambar, dari 0 hingga 1. |
| `bounding_boxes[].box.y_max` |  | number | yes |  | 0 – 1 | Batas bawah yang dinyatakan relatif terhadap tinggi gambar, dari 0 hingga 1. |
| `bounding_boxes[].source_image_index` |  | integer \| null | no |  | ≥ 0 | Pemilihan sumber objek: kosongkan untuk objek baru, atau identifikasi referensi yang ada berdasarkan indeksnya dalam `image_urls`, dihitung mulai dari 0. |
| `bounding_boxes[].source_box` |  | object {x_min, y_min, x_max, y_max} \| null | no |  |  | Lokasi objek dalam gambar referensi; `source_image_index` juga harus disediakan. |
| `bounding_boxes[].source_box.x_min` |  | number | yes |  | 0 – 1 | Batas kiri yang dinyatakan relatif terhadap lebar gambar, dari 0 hingga 1. |
| `bounding_boxes[].source_box.y_min` |  | number | yes |  | 0 – 1 | Batas atas yang dinyatakan relatif terhadap tinggi gambar, dari 0 hingga 1. |
| `bounding_boxes[].source_box.x_max` |  | number | yes |  | 0 – 1 | Batas kanan yang dinyatakan relatif terhadap lebar gambar, dari 0 hingga 1. |
| `bounding_boxes[].source_box.y_max` |  | number | yes |  | 0 – 1 | Batas bawah yang dinyatakan relatif terhadap tinggi gambar, dari 0 hingga 1. |
| `bounding_boxes[].target_box` |  | object {x_min, y_min, x_max, y_max} \| null | no |  |  | Kotak penempatan output untuk objek: pemindahan atau pengubahan ukuran memerlukan kedua kotak, sedangkan penghapusan objek referensi mengharuskan kotak ini dibiarkan kosong. |
| `bounding_boxes[].target_box.x_min` |  | number | yes |  | 0 – 1 | Batas kiri yang dinyatakan relatif terhadap lebar gambar, dari 0 hingga 1. |
| `bounding_boxes[].target_box.y_min` |  | number | yes |  | 0 – 1 | Batas atas yang dinyatakan relatif terhadap tinggi gambar, dari 0 hingga 1. |
| `bounding_boxes[].target_box.x_max` |  | number | yes |  | 0 – 1 | Batas kanan yang dinyatakan relatif terhadap lebar gambar, dari 0 hingga 1. |
| `bounding_boxes[].target_box.y_max` |  | number | yes |  | 0 – 1 | Batas bawah yang dinyatakan relatif terhadap tinggi gambar, dari 0 hingga 1. |

File parameters (`images`) take a public `https://` URL, a `data:` URI up to 10 MB, or the `file_url` of an upload from `POST /files`.

## Example input

Required parameters only:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
  "images": [
    "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
  ]
}
```

A fuller example:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
  "image_urls": [
    "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
  ]
}
```

## Run it

Set `DOITONG_API_KEY` to a key from https://doitong.com/developers/dashboard#keys. `?wait=20` returns the finished request in the same call when it is ready within 20 seconds; otherwise poll `GET /requests/{id}` (it also accepts `?wait=`), or pass `webhook_url`.

### curl

```bash
# Run the model; wait up to 20 s for the finished result in the same call
curl -X POST "https://api.doitong.ru/v1/run/blackforestlabs/flux-3/klein/edit-image?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "image_urls": [
      "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
    ]
  }'

# Still "queued" or "running"? Poll with the id from the response:
curl "https://api.doitong.ru/v1/requests/REQUEST_ID?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```

### JavaScript

```javascript
const API = "https://api.doitong.ru/v1";
const headers = {
  "Authorization": "Bearer " + process.env.DOITONG_API_KEY,
  "Content-Type": "application/json",
};

// Run the model; wait up to 20 s for the finished result in the same call
let res = await fetch(API + "/run/blackforestlabs/flux-3/klein/edit-image?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "image_urls": [
      "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
    ]
  }),
});
let request = await res.json();
if (!res.ok) throw new Error(request.error.code + ": " + request.error.message);

// Not finished yet: long-poll until it is
while (request.status === "queued" || request.status === "running") {
  res = await fetch(API + "/requests/" + request.id + "?wait=20", { headers });
  request = await res.json();
}
if (request.status !== "succeeded") throw new Error(JSON.stringify(request.error));
console.log(request.outputs.map((o) => o.url), request.cost.credits + " API credits ($" + request.cost.usd + ")");
```

### Python

```python
import os
import requests

API = "https://api.doitong.ru/v1"
headers = {"Authorization": "Bearer " + os.environ["DOITONG_API_KEY"]}

payload = {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "image_urls": [
        "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
    ],
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/blackforestlabs/flux-3/klein/edit-image", params={"wait": 20}, json=payload, headers=headers)
request = r.json()
if not r.ok:
    raise RuntimeError(request["error"]["code"] + ": " + request["error"]["message"])

# Not finished yet: long-poll until it is
while request["status"] in ("queued", "running"):
    request = requests.get(API + "/requests/" + request["id"], params={"wait": 20}, headers=headers).json()
if request["status"] != "succeeded":
    raise RuntimeError(request["error"])
print([o["url"] for o in request["outputs"]], request["cost"]["credits"], "API credits", "$" + request["cost"]["usd"])
```

### MCP

The MCP server at `https://api.doitong.ru/v1/mcp` exposes the tools `search_models`, `get_model`, `quote`, `run`, `get_request`, `cancel_request`, `list_requests`, `create_upload` and `get_account`. A `run` call for this model:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "run",
    "arguments": {
      "model_id": "blackforestlabs/flux-3/klein/edit-image",
      "input": {
        "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
        "image_urls": [
          "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
        ]
      },
      "wait_seconds": 20
    }
  }
}
```

## Response

Every call returns a request object. `status` is one of `queued`, `running`, `succeeded`, `failed`, `canceled`. `outputs` lists the generated files with URLs on our storage (kept forever, or 7 days with `?storage=temporary`; `storage` says which); `output` is the model's own result object with the same URLs.

```json
{
  "id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
  "object": "request",
  "model": "blackforestlabs/flux-3/klein/edit-image",
  "status": "succeeded",
  "created_at": "2026-10-20T12:00:00Z",
  "started_at": "2026-10-20T12:00:02Z",
  "completed_at": "2026-10-20T12:00:09Z",
  "queue_position": null,
  "cost": {
    "credits": 9,
    "usd": "0.009",
    "charged": 9,
    "refunded": 0
  },
  "input": {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "image_urls": [
      "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
    ]
  },
  "output": {
    "images": [
      {
        "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
        "content_type": "image/jpeg",
        "file_name": "0-output.jpeg",
        "file_size": 1843200,
        "width": 1024,
        "height": 768
      }
    ],
    "timings": {},
    "seed": 42,
    "has_nsfw_concepts": [
      false
    ],
    "prompt": "string"
  },
  "outputs": [
    {
      "type": "image",
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
      "content_type": "image/jpeg",
      "file_size": 1843200,
      "width": 1024,
      "height": 768,
      "stored": true
    }
  ],
  "error": null,
  "metrics": {
    "inference_seconds": 6.8
  },
  "urls": {
    "self": "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `images` | array of object {url, content_type, file_name, file_size, width, height} | Gambar yang dihasilkan oleh model. |
| `timings` | object | Informasi waktu proses pembuatan. |
| `seed` | integer | Seed pembuatan untuk gambar pertama. |
| `has_nsfw_concepts` | array of boolean | Menunjukkan apakah konsep NSFW muncul dalam gambar yang dihasilkan. |
| `prompt` | string | Prompt yang digunakan selama pembuatan gambar. |

## Related models

- [FLUX.3 Klein](https://doitong.com/developers/models/blackforestlabs/flux-3/klein/text-to-image.md) (`blackforestlabs/flux-3/klein/text-to-image`): from $0.008 / run of output image
- [FLUX.1 Kontext \[pro\]](https://doitong.com/developers/models/flux-pro/kontext.md) (`flux-pro/kontext`): $0.04 / image
- [GPT Image 2.5 Edit](https://doitong.com/developers/models/openai/gpt-image-2.5/flare/edit.md) (`openai/gpt-image-2.5/flare/edit`): from $0.12 / image
- [Nano Banana 2 Edit](https://doitong.com/developers/models/nano-banana-2/edit.md) (`nano-banana-2/edit`): from $0.06 / image
- [Nano Banana Pro Edit](https://doitong.com/developers/models/nano-banana-pro/edit.md) (`nano-banana-pro/edit`): from $0.15 / image
- [Qwen Image 3 Edit](https://doitong.com/developers/models/alibaba/qwen-image-3/edit.md) (`alibaba/qwen-image-3/edit`): from $0.04 / image
- [Seedream 5.0 Pro Edit](https://doitong.com/developers/models/bytedance/seedream/v5/pro/edit.md) (`bytedance/seedream/v5/pro/edit`): from $0.0675 / run of output image
- [FLUX 2 Edit](https://doitong.com/developers/models/flux-2/edit.md) (`flux-2/edit`): $0.012 / megapixel

## Links

- HTML page: https://doitong.com/developers/models/blackforestlabs/flux-3/klein/edit-image
- All models and guides for AI agents: https://doitong.com/developers/llms.txt
- OpenAPI 3.1 with this model's typed request body: https://doitong.com/developers/openapi.json?model=blackforestlabs/flux-3/klein/edit-image
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.ru/v1/models/blackforestlabs/flux-3/klein/edit-image
