# Image2Pixel API

> Chuyển ảnh thành pixel art rõ nét với giới hạn bảng màu, phát hiện tỷ lệ và nền trong suốt tùy chọn

Chuyển ảnh đầu vào thành pixel art và trả về ảnh đã xử lý cùng phiên bản đã thu nhỏ dưới dạng tệp PNG. Có thể giới hạn bảng màu bằng `max_colors` (1 đến 256), cung cấp `fixed_palette` gồm các màu hex hoặc buộc `scale` từ 1 đến 64. Có nhiều phương pháp thu nhỏ, tùy chọn làm sạch và chế độ xóa nền. Phản hồi cũng báo cáo số màu, bảng màu và tỷ lệ pixel được phát hiện.

- Model id: `image2pixel`
- Made by: Utility
- Category: Image Editing
- Output: image
- Charged by usage (up to $0.153 per run, typical $0.002; the rest of the hold is refunded): $0.00017 / second of processing time (cheapest run $0.002 (2 API credits))
- Run: `POST https://api.doitong.com/v1/run/image2pixel`
- Quote: `POST https://api.doitong.com/v1/quote/image2pixel`
- Docs page: https://doitong.com/vi/developers/models/image2pixel

## Pricing

Price: **$0.00017 / second of processing time**. Charged by actual usage at $0.00017 / second of processing time: up to $0.153 per run (the quote gives the maximum for your input), the rest is refunded automatically after the run. A typical run costs $0.002.

The full example input below holds up to $0.153 = 153 API credits (up to 900 s of processing time × $0.00017) when it starts; a typical run costs $0.002 (2 API credits).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). This model is charged by usage: `POST https://api.doitong.com/v1/quote/image2pixel` with the same JSON body returns the most the run can cost for that input (`credits`, debited when the run starts); after the run you pay the usage the model reports and the rest is refunded automatically. An input whose maximum would exceed the per-run limit is refused with 422. 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_url` | `image` | string (image URL) | yes |  |  | URL hình ảnh nguồn để chuyển đổi thành pixel art được cải thiện. |
| `max_colors` |  | integer \| null | no | `32` | 1 – 256 | Giới hạn số màu của bảng màu đầu ra; None cho phép số màu không giới hạn. |
| `auto_color_detect` |  | boolean | no | `false` |  | Bật lựa chọn tự động số màu tối ưu. |
| `fixed_palette` |  | array of string \| null | no |  |  | Bảng màu định sẵn tùy chọn được chỉ định bằng chuỗi hex, chẳng hạn như ['#000000', '#ffffff']. |
| `detect_method` |  | enum (string) | no | `auto` | `auto`, `runs`, `edge` | Phương thức dùng để phát hiện tỷ lệ. |
| `scale` |  | integer \| null | no |  | 1 – 64 | Tỷ lệ pixel cần áp dụng; None bật tính năng phát hiện tự động. |
| `downscale_method` |  | enum (string) | no | `dominant` | `dominant`, `median`, `mode`, `mean`, `content-adaptive` | Phương thức dùng để thu nhỏ thành pixel art. |
| `trim_borders` |  | boolean | no | `false` |  | Kiểm soát việc cắt viền hình ảnh. |
| `transparent_background` |  | boolean | no | `false` |  | Xóa nền bằng độ trong suốt: sau khi hiệu chỉnh hình ảnh hoàn tất, các vùng màu được kết nối và chạm vào mép hình ảnh sẽ trở nên trong suốt. |
| `cleanup_morph` |  | boolean | no | `false` |  | Xóa nhiễu bằng các phép toán hình thái học. |
| `cleanup_jaggy` |  | boolean | no | `false` |  | Làm sạch các cạnh răng cưa bằng cách xóa các pixel chéo cô lập. |
| `snap_grid` |  | boolean | no | `true` |  | Căn đầu ra theo lưới pixel. |
| `alpha_threshold` |  | integer | no | `128` | 0 – 255 | Ngưỡng nhị phân hóa alpha, từ 0 đến 255. |
| `dominant_color_threshold` |  | number | no | `0.05` | 0 – 1 | Ngưỡng màu trội, từ 0.0 đến 1.0. |
| `background_tolerance` |  | integer | no | `0` | 0 – 255 | Dung sai cho nền, từ 0 đến 255. |
| `background_mode` |  | enum (string) | no | `corners` | `edges`, `corners`, `midpoints` | Các vị trí bắt đầu để tô màu loang khi xóa nền. |

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

A fuller example:

```json
{
  "image_url": "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/image2pixel?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "image_url": "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/image2pixel?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "image_url": "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_url": "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/image2pixel", 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": "image2pixel",
      "input": {
        "image_url": "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": "image2pixel",
  "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": 153,
    "usd": "0.153",
    "charged": 153,
    "refunded": 0
  },
  "input": {
    "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
  },
  "output": {
    "pixel_scale": 21,
    "palette": [
      "string"
    ],
    "num_colors": 10,
    "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
      }
    ]
  },
  "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 |
|---|---|---|
| `pixel_scale` | integer | Tỷ lệ pixel được phát hiện trong đầu vào. |
| `palette` | array of string | Bảng màu của nội dung đã xử lý. |
| `num_colors` | integer | Số màu của nội dung đã xử lý. |
| `images` | array of object {url, content_type, file_name, file_size, width, height} | Pixel art và hình ảnh đã thay đổi tỷ lệ, đều ở định dạng PNG. |

## Related models

- [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
- [Age Modify](https://doitong.com/developers/models/image-apps-v2/age-modify.md) (`image-apps-v2/age-modify`): $0.04 / image
- [Cartoonify](https://doitong.com/developers/models/cartoonify.md) (`cartoonify`): $0.10 / image

## Links

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