# Elevenlabs API

> Chuyển danh sách các cặp văn bản và voice ID thành track âm thanh hội thoại nhiều người nói

Tạo hội thoại đọc thành tiếng từ `inputs`, danh sách bắt buộc trong đó mỗi mục ghép văn bản với voice ID. Có thể tinh chỉnh hành vi giọng nói bằng `stability` (0 đến 1) và `use_speaker_boost`. Có thể bắt buộc ngôn ngữ bằng `language_code` và áp dụng tối đa 3 bộ từ điển phát âm. `seed` được chấp nhận để tái tạo kết quả và được trả về cùng âm thanh.

- Model id: `elevenlabs/text-to-dialogue/eleven-v3`
- Made by: ElevenLabs
- Category: Text to Speech
- Output: audio
- Estimated price per run: $0.10 / run (cheapest run $0.10 (100 API credits))
- Run: `POST https://api.doitong.ru/v1/run/elevenlabs/text-to-dialogue/eleven-v3`
- Quote: `POST https://api.doitong.ru/v1/quote/elevenlabs/text-to-dialogue/eleven-v3`
- Docs page: https://doitong.com/vi/developers/models/elevenlabs/text-to-dialogue/eleven-v3

## Pricing

Price: **$0.10 / run**. Estimated from the typical cost of one run. The quote is exactly what the run charges.

The full example input below costs $0.10 = 100 API credits (1 request × 100 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.ru/v1/quote/elevenlabs/text-to-dialogue/eleven-v3` 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

| Parameter | Canonical name | Type | Required | Default | Allowed values / range | Description |
|---|---|---|---|---|---|---|
| `inputs` |  | array of object {text, voice} | yes |  |  | Các mục hội thoại cần tổng hợp thành giọng nói, mỗi mục ghép văn bản với một ID giọng nói. |
| `inputs[].text` |  | string | yes |  |  | Văn bản chứa hội thoại. |
| `inputs[].voice` |  | string | yes |  |  | Tên hoặc ID giọng nói được chọn để tạo sinh. |
| `stability` |  | number \| null | no |  | 0 – 1 | Độ ổn định và biến thiên của giọng nói giữa các lần tạo sinh, chỉ nhận 0.0, 0.5 hoặc 1.0; các đầu vào ngoài tập này được làm tròn đến giá trị được chấp nhận gần nhất. Giá trị cao hơn có thể hạn chế cảm xúc và khiến giọng nghe đơn điệu, còn giá trị thấp hơn mở rộng phạm vi cảm xúc của giọng nói. |
| `use_speaker_boost` |  | boolean \| null | no |  |  | Tăng cường độ tương đồng với người nói, làm tăng độ trễ do tải tính toán tăng nhẹ. Bật tùy chọn này khiến giọng nói giống người nói gốc hơn. |
| `pronunciation_dictionary_locators` |  | array of object {pronunciation_dictionary_id, version_id} | no | `[]` |  | Cung cấp tối đa 3 bộ định vị từ điển phát âm theo thứ tự chúng sẽ tác động đến văn bản. Mỗi bộ định vị xác định một từ điển bằng id và version_id. |
| `pronunciation_dictionary_locators[].pronunciation_dictionary_id` |  | string \| null | no |  |  | Mã định danh của từ điển phát âm. |
| `pronunciation_dictionary_locators[].version_id` |  | string \| null | no |  |  | Chọn phiên bản cụ thể của từ điển phát âm bằng ID hoặc để trống để dùng phiên bản mới nhất. |
| `seed` |  | integer \| null | no |  |  | Seed kiểm soát tính ngẫu nhiên để tái lập kết quả. |
| `language_code` |  | string \| null | no |  |  | Chỉ định ngôn ngữ mô hình bắt buộc bằng mã ISO 639-1; yêu cầu sẽ thất bại với lỗi nếu mô hình không hỗ trợ mã đó. |

## Example input

Required parameters only:

```json
{
  "inputs": [
    {
      "text": "[applause] Thank you all for coming tonight! Today we have a very special guest with us.",
      "voice": "Aria"
    },
    {
      "text": "[gulps] ... [strong canadian accent] [excited] Hello everyone! Thank you all for having me tonight on this special day.",
      "voice": "Charlotte"
    }
  ]
}
```

A fuller example:

```json
{
  "inputs": [
    {
      "text": "[applause] Thank you all for coming tonight! Today we have a very special guest with us.",
      "voice": "Aria"
    },
    {
      "text": "[gulps] ... [strong canadian accent] [excited] Hello everyone! Thank you all for having me tonight on this special day.",
      "voice": "Charlotte"
    }
  ]
}
```

## 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/elevenlabs/text-to-dialogue/eleven-v3?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "inputs": [
      {
        "text": "[applause] Thank you all for coming tonight! Today we have a very special guest with us.",
        "voice": "Aria"
      },
      {
        "text": "[gulps] ... [strong canadian accent] [excited] Hello everyone! Thank you all for having me tonight on this special day.",
        "voice": "Charlotte"
      }
    ]
  }'

# 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/elevenlabs/text-to-dialogue/eleven-v3?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "inputs": [
      {
        "text": "[applause] Thank you all for coming tonight! Today we have a very special guest with us.",
        "voice": "Aria"
      },
      {
        "text": "[gulps] ... [strong canadian accent] [excited] Hello everyone! Thank you all for having me tonight on this special day.",
        "voice": "Charlotte"
      }
    ]
  }),
});
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 = {
    "inputs": [
        {
            "text": "[applause] Thank you all for coming tonight! Today we have a very special guest with us.",
            "voice": "Aria",
        },
        {
            "text": "[gulps] ... [strong canadian accent] [excited] Hello everyone! Thank you all for having me tonight on this special day.",
            "voice": "Charlotte",
        },
    ],
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/elevenlabs/text-to-dialogue/eleven-v3", 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": "elevenlabs/text-to-dialogue/eleven-v3",
      "input": {
        "inputs": [
          {
            "text": "[applause] Thank you all for coming tonight! Today we have a very special guest with us.",
            "voice": "Aria"
          },
          {
            "text": "[gulps] ... [strong canadian accent] [excited] Hello everyone! Thank you all for having me tonight on this special day.",
            "voice": "Charlotte"
          }
        ]
      },
      "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": "elevenlabs/text-to-dialogue/eleven-v3",
  "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": 100,
    "usd": "0.10",
    "charged": 100,
    "refunded": 0
  },
  "input": {
    "inputs": [
      {
        "text": "[applause] Thank you all for coming tonight! Today we have a very special guest with us.",
        "voice": "Aria"
      },
      {
        "text": "[gulps] ... [strong canadian accent] [excited] Hello everyone! Thank you all for having me tonight on this special day.",
        "voice": "Charlotte"
      }
    ]
  },
  "output": {
    "audio": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp3",
      "content_type": "audio/mpeg",
      "file_name": "0-output.mp3",
      "file_size": 1843200
    },
    "seed": 42
  },
  "outputs": [
    {
      "type": "audio",
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp3",
      "content_type": "audio/mpeg",
      "file_size": 1843200,
      "duration": 12,
      "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 |
|---|---|---|
| `audio` | object {url, content_type, file_name, file_size} | Tệp âm thanh do quá trình tạo sinh tạo ra. |
| `seed` | integer | Seed kiểm soát tính ngẫu nhiên để tái lập kết quả. |

## Related models

- [Eleven v4 Text to Speech](https://doitong.com/developers/models/elevenlabs/tts/eleven-v4.md) (`elevenlabs/tts/eleven-v4`): $0.08 / 1000 characters
- [MiniMax Speech 2.8 HD](https://doitong.com/developers/models/minimax/speech-2.8-hd.md) (`minimax/speech-2.8-hd`): $0.10 / 1000 characters
- [Eleven v4 Turbo](https://doitong.com/developers/models/elevenlabs/tts/eleven-v4-turbo.md) (`elevenlabs/tts/eleven-v4-turbo`): $0.04 / 1000 characters
- [Elevenlabs Tts Eleven V3](https://doitong.com/developers/models/elevenlabs/tts/eleven-v3.md) (`elevenlabs/tts/eleven-v3`): $0.10 / 1000 characters
- [ElevenLabs TTS Multilingual v2](https://doitong.com/developers/models/elevenlabs/tts/multilingual-v2.md) (`elevenlabs/tts/multilingual-v2`): $0.10 / 1000 characters
- [ElevenLabs TTS Turbo v2.5](https://doitong.com/developers/models/elevenlabs/tts/turbo-v2.5.md) (`elevenlabs/tts/turbo-v2.5`): $0.05 / 1000 characters
- [Async Text to Speech Pro V1.0](https://doitong.com/developers/models/async/tts-pro/v1.0.md) (`async/tts-pro/v1.0`): $0.01 / 1000 characters
- [Bytedance Seed Speech Text to Speech](https://doitong.com/developers/models/bytedance/seed-speech/tts/v2.md) (`bytedance/seed-speech/tts/v2`): $0.03 / 1000 characters

## Links

- HTML page: https://doitong.com/developers/models/elevenlabs/text-to-dialogue/eleven-v3
- 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=elevenlabs/text-to-dialogue/eleven-v3
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.ru/v1/models/elevenlabs/text-to-dialogue/eleven-v3
