# FLUX.3 Klein Image Editing API

> محرر FLUX.3 Klein بما يصل إلى 10 مراجع، مع وضع اختياري للعناصر باستخدام مربعات الإحاطة

يحرّر الصور أو يركّبها من موجّه ومن 1 إلى 10 مراجع في `image_urls`، ويمكن للموجّه الإشارة إليها حسب ترتيبها، مثل الصورة الأولى. يمكن لما يصل إلى 32 من `bounding_boxes` الإبقاء على الكائنات أو نقلها أو تغيير حجمها أو إزالتها أو إضافتها، مع تسميتها في الموجّه حسب التصنيف. يكون توسيع الموجّه مفعّلًا افتراضيًا. ويُرجع من 1 إلى 4 صور بتنسيق jpeg أو png أو 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/ar/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 |  |  | اكتب وصفاً كاملاً يصف الصورة المطلوبة بعد التحرير، مع تحديد المراجع حسب ترتيبها، مثل الصورة الأولى أو الثانية. |
| `enable_prompt_expansion` |  | boolean | no | `true` |  | توسيع الموجّه إلى وصف تفصيلي قبل التوليد، ويُفعّل عند true. في التحرير، يستند الوصف إلى الصور المرجعية. |
| `seed` |  | integer \| null | no |  |  | بذرة لصور قابلة لإعادة الإنتاج: ينتج الموجّه والبذرة المتطابقان الصورة نفسها عند عدم تغيير إصدار النموذج. |
| `num_images` | `num_outputs` | integer | no | `1` | 1 – 4 | عدد الصور المطلوب توليده. |
| `enable_safety_checker` |  | boolean | no | `true` |  | تنشيط مدقق السلامة؛ تُمكّن true الفحص. |
| `output_format` |  | enum (string) | no | `png` | `jpeg`, `png`, `webp` | تنسيق ملف الصورة الناتجة. |
| `image_urls` | `images` | array of image URL | yes |  | 1 – 10 items | الصور المرجعية المستخدمة للتحرير أو التركيب، بحد أقصى 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` | تكون أبعاد المخرج افتراضياً أبعاد المرجع الأول، مع حد أقصى 1 ميغابكسل للمراجع المتعددة أو تحجيم إلى 4 ميغابكسل كحد أقصى للمرجع المنفرد. يجب أن يتراوح كل بُعد صريح بين 256 و4096 بكسل. |
| `bounding_boxes` |  | array of object {label, description, box, source_image_index, source_box, target_box} \| null | no |  | ≤ 32 items | تخطيط اختياري للعناصر للاحتفاظ بعناصر المراجع أو نقلها أو تغيير حجمها أو إزالتها، أو وضع عناصر جديدة. تبدأ الإحداثيات عند (0, 0) في الزاوية العلوية اليسرى لكل صورة؛ وأشر إلى المربعات باستخدام تسميات في الموجّه، مثل `<dragon>`. |
| `bounding_boxes[].label` |  | string \| null | no |  | ≤ 64 characters | تسمية مختصرة للعنصر في المربع، مثل `dragon`؛ والقيمة الافتراضية هي `obj_<n>`. أدرج `<dragon>` في الموجّه لربط كلماته بالمربع؛ وتُضاف المربعات غير المذكورة في الموجّه إلى المشهد. |
| `bounding_boxes[].description` |  | string | yes |  | ≤ 500 characters | العنصر المطلوب تصييره داخل المربع، بما في ذلك مظهره. |
| `bounding_boxes[].box` |  | object {x_min, y_min, x_max, y_max} \| null | no |  |  | موضع إخراج العنصر، ويستبدل `source_box`/`target_box` ويستخدم سلوك الموضع نفسه مثل تحويل النص إلى صورة. |
| `bounding_boxes[].box.x_min` |  | number | yes |  | 0 – 1 | الحد الأيسر معبراً عنه نسبةً إلى عرض الصورة، من 0 إلى 1. |
| `bounding_boxes[].box.y_min` |  | number | yes |  | 0 – 1 | الحد العلوي معبراً عنه نسبةً إلى ارتفاع الصورة، من 0 إلى 1. |
| `bounding_boxes[].box.x_max` |  | number | yes |  | 0 – 1 | الحد الأيمن معبراً عنه نسبةً إلى عرض الصورة، من 0 إلى 1. |
| `bounding_boxes[].box.y_max` |  | number | yes |  | 0 – 1 | الحد السفلي معبراً عنه نسبةً إلى ارتفاع الصورة، من 0 إلى 1. |
| `bounding_boxes[].source_image_index` |  | integer \| null | no |  | ≥ 0 | اختيار مصدر العنصر: احذفه لعنصر جديد، أو حدد مرجعاً موجوداً بفهرسه في `image_urls`، بدءاً من 0. |
| `bounding_boxes[].source_box` |  | object {x_min, y_min, x_max, y_max} \| null | no |  |  | موضع العنصر داخل الصورة المرجعية؛ يجب أيضاً تقديم `source_image_index`. |
| `bounding_boxes[].source_box.x_min` |  | number | yes |  | 0 – 1 | الحد الأيسر معبراً عنه نسبةً إلى عرض الصورة، من 0 إلى 1. |
| `bounding_boxes[].source_box.y_min` |  | number | yes |  | 0 – 1 | الحد العلوي معبراً عنه نسبةً إلى ارتفاع الصورة، من 0 إلى 1. |
| `bounding_boxes[].source_box.x_max` |  | number | yes |  | 0 – 1 | الحد الأيمن معبراً عنه نسبةً إلى عرض الصورة، من 0 إلى 1. |
| `bounding_boxes[].source_box.y_max` |  | number | yes |  | 0 – 1 | الحد السفلي معبراً عنه نسبةً إلى ارتفاع الصورة، من 0 إلى 1. |
| `bounding_boxes[].target_box` |  | object {x_min, y_min, x_max, y_max} \| null | no |  |  | مربع موضع إخراج العنصر: يتطلب النقل أو تغيير الحجم كلا المربعين، بينما تتطلب إزالة عنصر مرجعي ترك هذا المربع دون ضبط. |
| `bounding_boxes[].target_box.x_min` |  | number | yes |  | 0 – 1 | الحد الأيسر معبراً عنه نسبةً إلى عرض الصورة، من 0 إلى 1. |
| `bounding_boxes[].target_box.y_min` |  | number | yes |  | 0 – 1 | الحد العلوي معبراً عنه نسبةً إلى ارتفاع الصورة، من 0 إلى 1. |
| `bounding_boxes[].target_box.x_max` |  | number | yes |  | 0 – 1 | الحد الأيمن معبراً عنه نسبةً إلى عرض الصورة، من 0 إلى 1. |
| `bounding_boxes[].target_box.y_max` |  | number | yes |  | 0 – 1 | الحد السفلي معبراً عنه نسبةً إلى ارتفاع الصورة، من 0 إلى 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} | الصور الناتجة عن النموذج. |
| `timings` | object | معلومات توقيت عملية التوليد. |
| `seed` | integer | بذرة توليد الصورة الأولى. |
| `has_nsfw_concepts` | array of boolean | يشير إلى ما إذا كانت مفاهيم NSFW تظهر في الصور المُولّدة. |
| `prompt` | string | الموجّه المستخدم أثناء توليد الصورة. |

## 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
