# Fibo 2.0 Edit API

> Trình chỉnh sửa dựa trên hướng dẫn, nhận 1 đến 4 hình ảnh, với mặt nạ tùy chọn cho chỉnh sửa vùng trên một hình ảnh

Chỉnh sửa từ một đến bốn hình ảnh được cung cấp trong `image_urls`, trong đó `instruction` tham chiếu đến chúng bằng <image_1>, <image_2> và tiếp tục như vậy. Hữu ích cho việc thay đổi nền và bố trí lại sản phẩm. `mask_url` giới hạn vùng chỉnh sửa trong các yêu cầu với một hình ảnh. `aspect_ratio` cung cấp 16 giá trị được liệt kê, và có thể truyền hoặc sử dụng lại một tài liệu `vgl` có cấu trúc.

- Model id: `bria/fibo-2/edit`
- Made by: Bria AI
- Category: Image Editing
- Output: image
- Price: $0.04 / image (cheapest run $0.04 (40 API credits))
- Run: `POST https://api.doitong.com/v1/run/bria/fibo-2/edit`
- Quote: `POST https://api.doitong.com/v1/quote/bria/fibo-2/edit`
- Docs page: https://doitong.com/vi/developers/models/bria/fibo-2/edit

## Pricing

Price: **$0.04 / image**. Billed per generated image.

The full example input below costs $0.04 = 40 API credits (1 image × 40 API credits).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). `POST https://api.doitong.com/v1/quote/bria/fibo-2/edit` 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 |
|---|---|---|---|---|---|---|
| `image_urls` | `images` | array of image URL | yes |  | 1 – 4 items | Các đầu vào chỉnh sửa được đánh chỉ mục theo thứ tự gửi dưới dạng <image_1>, <image_2> và tiếp tục để sử dụng trong hướng dẫn. Cung cấp 1–4 hình ảnh dưới dạng tệp hoặc URL. |
| `instruction` |  | string \| null | no |  |  | Hướng dẫn chỉnh sửa sửa đổi 'vgl' khi được cung cấp cùng với nó. Nếu không, yêu cầu tự do sẽ được mở rộng thành tài liệu VGL và đưa vào phản hồi. |
| `aspect_ratio` |  | enum (string) \| null | no |  | `1:1`, `1:2`, `1:3`, `1:4`, `1:5`, `2:1`, `2:3`, `3:1`, `3:2`, `3:4`, `4:1`, `4:3`, `4:5`, `5:1`, `5:4`, `9:16`, `9:21`, `10:16`, `16:9`, `16:10`, `21:9` | Thiết lập tỷ lệ khung hình cho đầu ra khoảng một megapixel; một hình ảnh đầu vào duy nhất giữ nguyên tỷ lệ bất kể thiết lập này. Với nhiều đầu vào, bỏ qua thiết lập sẽ dùng tỷ lệ của hình ảnh đầu tiên. |
| `seed` |  | integer | no | `5555` | 0 – 2,147,483,647 | Seed kiểm soát tính ngẫu nhiên để tái lập kết quả, trong khoảng từ 0 đến 2147483647. |
| `mask_url` | `mask` | string (image URL) \| null | no |  |  | Mặt nạ chỉnh sửa cho các yêu cầu chứa một hình ảnh duy nhất, được cung cấp dưới dạng tệp hoặc URL có kích thước khớp với hình ảnh đó. Màu trắng đánh dấu vùng tạo lại; màu đen đánh dấu mọi phần còn lại. Kết quả dùng kích thước đầu vào và giữ nguyên pixel bên ngoài mặt nạ. |
| `vgl` |  | object {short_description, objects, background_setting, lighting, aesthetics, photographic_characteristics, style_medium, text_render, context, artistic_style, edit_instruction} \| null | no |  |  | Tài liệu VGL (Visual Generation Language) có thể tái sử dụng từ phản hồi trước đó. Cùng với 'instruction', tài liệu này đại diện cho hình ảnh đầu tiên và cung cấp cơ sở để chỉnh sửa; không có 'instruction', tài liệu chỉ định thao tác chỉnh sửa không đổi và phải chứa 'edit_instruction'. |
| `vgl.short_description` |  | string \| null | no |  |  | Mô tả ngắn về hình ảnh đầu ra dự kiến. |
| `vgl.objects` |  | array of object {description, location, relationship, relative_size, shape_and_color, texture, appearance_details, number_of_objects, pose, expression, clothing, action, gender, skin_tone_and_texture, orientation} \| null | no | `[]` |  | Chỉ định nội dung hình ảnh được tạo dưới dạng danh sách, ghi lại thuộc tính của từng đối tượng và mối quan hệ của chúng với các đối tượng khác được mô tả. |
| `vgl.objects[].description` |  | string \| null | no |  |  | Mô tả đối tượng đầu ra dự kiến. |
| `vgl.objects[].location` |  | string \| null | no |  |  | Vị trí đối tượng trong hình ảnh. |
| `vgl.objects[].relationship` |  | string | yes |  |  | Mối quan hệ của đối tượng với các đối tượng khác trong hình ảnh. |
| `vgl.objects[].relative_size` |  | string \| null | no |  |  | Kích thước của đối tượng so với hình ảnh. |
| `vgl.objects[].shape_and_color` |  | string \| null | no |  |  | Hình dạng và màu sắc của đối tượng. |
| `vgl.objects[].texture` |  | string \| null | no |  |  | Kết cấu của đối tượng. |
| `vgl.objects[].appearance_details` |  | string \| null | no |  |  | Chi tiết mô tả diện mạo của đối tượng. |
| `vgl.objects[].number_of_objects` |  | integer \| null | no |  |  | Số lượng đối tượng trong hình ảnh. |
| `vgl.objects[].pose` |  | string \| null | no |  |  | Tư thế của đối tượng được mô tả. |
| `vgl.objects[].expression` |  | string \| null | no |  |  | Biểu cảm của đối tượng được mô tả. |
| `vgl.objects[].clothing` |  | string \| null | no |  |  | Trang phục của đối tượng được mô tả. |
| `vgl.objects[].action` |  | string \| null | no |  |  | Hành động của đối tượng được mô tả. |
| `vgl.objects[].gender` |  | string \| null | no |  |  | Giới tính của đối tượng được mô tả. |
| `vgl.objects[].skin_tone_and_texture` |  | string \| null | no |  |  | Kết cấu và tông màu da của đối tượng được mô tả. |
| `vgl.objects[].orientation` |  | string \| null | no |  |  | Hướng của đối tượng được mô tả. |
| `vgl.background_setting` |  | string \| null | no |  |  | Bối cảnh nền cho hình ảnh được tạo. |
| `vgl.lighting` |  | object {conditions, direction, shadows} \| null | no |  |  | Ánh sáng cho hình ảnh được tạo. |
| `vgl.lighting.conditions` |  | string \| null | no |  |  | Điều kiện ánh sáng cho hình ảnh được tạo. |
| `vgl.lighting.direction` |  | string \| null | no |  |  | Hướng chiếu sáng cho hình ảnh được tạo. |
| `vgl.lighting.shadows` |  | string \| null | no |  |  | Bóng đổ cần thể hiện trong hình ảnh được tạo. |
| `vgl.aesthetics` |  | object {composition, color_scheme, mood_atmosphere} \| null | no |  |  | Đặc tính thẩm mỹ cho hình ảnh được tạo. |
| `vgl.aesthetics.composition` |  | string \| null | no |  |  | Bố cục cho hình ảnh được tạo. |
| `vgl.aesthetics.color_scheme` |  | string \| null | no |  |  | Bảng màu cho hình ảnh được tạo. |
| `vgl.aesthetics.mood_atmosphere` |  | string \| null | no |  |  | Tâm trạng và không khí cho hình ảnh được tạo. |
| `vgl.photographic_characteristics` |  | object {depth_of_field, focus, camera_angle, lens_focal_length} \| null | no |  |  | Đặc tính nhiếp ảnh cho hình ảnh được tạo. |
| `vgl.photographic_characteristics.depth_of_field` |  | string \| null | no |  |  | Độ sâu trường ảnh cho hình ảnh được tạo. |
| `vgl.photographic_characteristics.focus` |  | string \| null | no |  |  | Lấy nét cho hình ảnh được tạo. |
| `vgl.photographic_characteristics.camera_angle` |  | string \| null | no |  |  | Góc máy ảnh cho hình ảnh được tạo. |
| `vgl.photographic_characteristics.lens_focal_length` |  | string \| null | no |  |  | Thiết lập ống kính cho hình ảnh được tạo, biểu thị bằng tiêu cự. |
| `vgl.style_medium` |  | string \| null | no |  |  | Chất liệu phong cách cho hình ảnh được tạo. |
| `vgl.text_render` |  | array of object {text, location, size, color, font, appearance_details} \| null | no | `[]` |  | Danh sách mục văn bản cần đưa vào hình ảnh. |
| `vgl.text_render[].text` |  | string | yes |  |  | Văn bản cần kết xuất, đồng thời được trình bày trực quan cho fibo-2 dưới dạng hình ảnh để giúp tái tạo chính xác nội dung đã cung cấp. |
| `vgl.text_render[].location` |  | string \| null | no |  |  | Vị trí văn bản trong hình ảnh. |
| `vgl.text_render[].size` |  | string \| null | no |  |  | Kích thước văn bản trong hình ảnh. |
| `vgl.text_render[].color` |  | string \| null | no |  |  | Màu dùng cho văn bản. |
| `vgl.text_render[].font` |  | string \| null | no |  |  | Kiểu phông chữ của văn bản. |
| `vgl.text_render[].appearance_details` |  | string \| null | no |  |  | Chi tiết đáng chú ý bổ sung về diện mạo của văn bản. |
| `vgl.context` |  | string \| null | no |  |  | Bối cảnh cho hình ảnh được tạo. |
| `vgl.artistic_style` |  | string \| null | no |  |  | Phong cách nghệ thuật cho hình ảnh được tạo. |
| `vgl.edit_instruction` |  | string \| null | no |  |  | Hướng dẫn mô tả cách chỉnh sửa hình ảnh. |

File parameters (`images`, `mask`) 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
{
  "images": [
    "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
  ]
}
```

A fuller example:

```json
{
  "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.com/v1/run/bria/fibo-2/edit?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "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.com/v1/requests/REQUEST_ID?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```

### JavaScript

```javascript
const API = "https://api.doitong.com/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/bria/fibo-2/edit?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "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.com/v1"
headers = {"Authorization": "Bearer " + os.environ["DOITONG_API_KEY"]}

payload = {
    "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/bria/fibo-2/edit", 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.com/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": "bria/fibo-2/edit",
      "input": {
        "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": "bria/fibo-2/edit",
  "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": 40,
    "usd": "0.04",
    "charged": 40,
    "refunded": 0
  },
  "input": {
    "image_urls": [
      "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
    ]
  },
  "output": {
    "image": {
      "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
    },
    "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
      }
    ],
    "vgl": {}
  },
  "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.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `image` | object {url, content_type, file_name, file_size, width, height} | Hình ảnh là kết quả chỉnh sửa. |
| `images` | array of object {url, content_type, file_name, file_size, width, height} | Danh sách hình ảnh khớp với định dạng do các ứng dụng FIBO khác trả về; mục duy nhất là cùng hình ảnh đó. |
| `vgl` | object | VGL dùng để chỉnh sửa, có chứa `edit_instruction`. |

## Related models

- [Fibo 2.0 Generate](https://doitong.com/developers/models/bria/fibo-2/generate.md) (`bria/fibo-2/generate`): $0.04 / 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
- [Bria](https://doitong.com/developers/models/bria/reimagine.md) (`bria/reimagine`): $0.04 / image

## Links

- HTML page: https://doitong.com/developers/models/bria/fibo-2/edit
- 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=bria/fibo-2/edit
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.com/v1/models/bria/fibo-2/edit
