> This is a page from the ElevenLabs documentation. For a complete page index, fetch https://elevenlabs.io/docs/llms.txt. For the full documentation in a single file, fetch https://elevenlabs.io/docs/llms-full.txt.

# 吹き替えプロジェクトを作成

POST https://api.elevenlabs.io/v1/dubbing/project
Content-Type: multipart/form-data

アップロードしたファイル（`file`）またはソースURL（`source_url`）から吹き替えプロジェクトを作成します。

ソースの取得前であっても、プロジェクトレコードが作成されるとすぐに返されます。プロジェクトは`queued`で開始し、ソースの文字起こしが完了すると`ready`になります。必要な言語ごとに言語ターゲットを追加するか、`target_language`を渡して最初のターゲットをここでキューに追加します。

プロジェクトの作成には最低1言語分の料金がかかります。出力が作成される前に、少なくとも1言語分の吹き替え料金が請求されます。この料金は最初の言語ターゲット分の前払いです。最初に追加するターゲット、または`target_language`でキューに追加したターゲットで消費され、追加の各言語には別途料金がかかります。

長いソースでは準備に数分かかる場合があるため、ポーリングする代わりに`webhook_ids`を渡して、プロジェクトが`ready`または`failed`になった際に通知を受け取ることをおすすめします。

Reference: https://elevenlabs.io/docs/api-reference/dubbing/create-project

## Servers

- `https://api.elevenlabs.io` (Production, default)
- `https://api.us.elevenlabs.io` (Production US)
- `https://api.eu.residency.elevenlabs.io` (Production EU)
- `https://api.in.residency.elevenlabs.io` (Production India)
- `https://api.sg.residency.elevenlabs.io` (Production Singapore)

## Request

### Body (multipart/form-data)

This endpoint expects a multipart form with multiple files.

- `file` (file, optional) — 吹き替え対象のソースメディアファイル。最大3GiBのオーディオまたはビデオファイルです。これまたは`source_url`のいずれか一方を指定してください。
- `source_url` (string, optional) — サーバー側でソースメディアを取得する公開HTTP(S) URL。アップロードと同じサイズおよび形式の制限が適用されます。これまたは`file`のいずれか一方を指定してください。
- `reference` (string, optional) — プロジェクトを識別するための任意の自由形式文字列（最大500文字）です。入力どおりに保存および返却され、吹き替えには影響しません。
- `source_language` (string, optional) — ソースメディアのBCP-47言語タグです。文字起こしモデルがサポートする言語である必要があります。文字起こしは言語ごとに行われるため、リージョンまたはスクリプトのサブタグは無視されます。省略すると自動検出されます。
- `model_id` (V1DubbingProjectPostRequestBodyContentMultipartFormDataSchemaModelId, optional) — このプロジェクトのすべての対象言語の吹き替えに使用する吹き替えモデル（`dubbing_v1`または`dubbing_v2`）。デフォルトは`dubbing_v2`です。作成時に固定されます。ソースはこのモデル向けに準備されるため、後からプロジェクト単位でも個別の対象言語単位でも変更できません。
- `keyterms` (list of string, optional) — 文字起こしと翻訳で優先するキーターム（例：プロダクト名やブランド名）です。最大1,000件で、各タームは最大50文字かつ5単語までです。文字`<>{}[]\`は使用できません。タームはトリミングされ、重複が除去されます。タームごとにフィールドを1回繰り返すか、単一のJSON配列を渡してください。
- `webhook_ids` (list of string, optional) — このプロジェクトの進行に応じて通知するワークスペースWebhookのID。ポーリングの代替手段であり、推奨されます。各Webhookは、プロジェクトに対して`dubbing_project_ready`または`dubbing_project_failed`イベントを受信し、配下の各言語に対して`dubbing_language_completed`または`dubbing_language_failed`イベントを受信します。`dubbing_language_completed`には出力のダウンロードURLが含まれます。IDは最大3件で、いずれもワークスペースで事前に設定されている必要があります。作成方法と署名の検証方法については、[Webhooks](https://elevenlabs.io/docs/eleven-api/resources/webhooks)を参照してください。IDごとにフィールドを1回ずつ繰り返すか、単一のJSON配列またはカンマ区切り文字列を渡します。配信はベストエフォートで繰り返される場合があるため、イベントは冪等に処理することをおすすめします。
- `target_language` (string, optional) — 任意のショートカットです。このBCP-47言語の言語ターゲットも作成し、プロジェクトの準備が完了すると開始されるようキューに追加します。これはプロジェクトを作成してから1つの言語ターゲットを作成するのと同等です。[吹き替えモデルがサポートする言語](https://elevenlabs.io/docs/help-center/product/dubbing/which-languages-are-supported-in-dubbing)のいずれかである必要があり、地域修飾タグはサポート対象の方言のいずれかである必要があります。これは最初の言語ターゲットであるため、追加料金ではなくプロジェクトの最低料金に充当されます。IDは`language_ids`で返されます。
- `transcript` (file, optional) — エンタープライズ限定。ソースの文字起こしの代わりに使用する任意のJSON文字起こしです。`{"segments": [...]}`ドキュメント形式で、最大20,000セグメント、4MiBまでです。セグメントフィールドとその制約については、[独自の文字起こしを使用する](https://elevenlabs.io/docs/eleven-api/guides/how-to/dubbing/bring-your-own-transcript)を参照してください。文字起こしを指定する場合は、必ず`source_language`が必要です。いずれかのセグメントに`translation`がある場合は`target_language`が必要であり、すべてのセグメントにtranslationが必要です。これらの翻訳は`target_language`で作成されるターゲットの初期値となり、機械翻訳はスキップされます。

## Response

### 201

成功レスポンス。

- `project_id` (string, required) — 吹き替えプロジェクトの一意の識別子。
- `status` (enum, required) — プロジェクトのライフサイクルステータス。ソースを取得する前は`queued`、文字起こし中は`preparing`、文字起こし完了後に言語ターゲットを開始できる状態は`ready`、失敗時は`failed`です。プロジェクトが`processing`として報告されることはありません。この値は言語ターゲット用です。
  - Allowed values: `queued`, `preparing`, `processing`, `ready`, `failed`
- `revision` (integer, required) — ソーストランスクリプトが編集されるたびに増加する単調カウンター（セグメントの追加／編集／削除）。
- `created_at` (string, required) — プロジェクトが作成された日時。
- `updated_at` (string, required) — プロジェクトが最後に更新された日時。
- `reference` (string, optional, nullable) — プロジェクト作成時に`reference`として指定した任意形式の文字列。指定していない場合はnullです。
- `source_language` (string, optional, nullable) — ソースメディアのBCP-47言語タグ（自動検出された場合はnull）。
- `model_id` (string, optional, nullable) — このプロジェクトのすべての対象言語の吹き替えに使用する吹き替えモデル。作成時に固定され、言語ごとに選択することはできません。
- `media` (DubbingSourceMediaInfo, optional, nullable) — ソースメディアのメタデータです。ソースの取得とデコードが完了すると設定されます（作成直後かつプロジェクトが`ready`になる前）。それまではnullです。
- `language_ids` (list of string, optional, default: []) — このプロジェクト配下の対象言語の識別子。単一プロジェクトの取得時、および`target_language`によって対象言語が作成される作成時に設定されます。一覧レスポンスでは常に空です。代わりにプロジェクトの対象言語を一覧表示してください。
- `webhook_ids` (list of string, optional, default: []) — このプロジェクトとその言語が`ready`、`completed`、または`failed`に達したときに通知されるワークスペースWebhookのID。
- `error` (DubbingError, optional, nullable) — プロジェクトが失敗した理由。`status`が`failed`の場合を除きnullです。障害レポートの導入前に失敗した一部のプロジェクトでもnullになります。
- `warnings` (list of VoicesNotPermittedWarning, optional) — ソースの準備中に発生した非致命的な状態。ない場合は空です。最新の準備内容を反映します。特定の言語の吹き替え中に発生した状態は、代わりにその言語で報告されます。

## Errors

### 422 Unprocessable Entity Error

検証エラー

- `detail` (list of ValidationError, optional)

## Types

### DubbingSourceMediaInfo

プロジェクトのソースメディアに関するメタデータ。

- `filename` (string, optional, nullable) — アップロードされたソースメディアの元のファイル名（URLソースの場合はnull）。
- `duration_s` (double, optional, nullable) — ソースメディアの長さ（秒）。
- `has_video` (boolean, optional, nullable) — ソースメディアにビデオストリームが含まれるかどうか。
- `mime_type` (string, optional, nullable) — アップロードされたソースメディアのMIMEタイプ（URLソースの場合はnull）。

### DubbingError

- `message_type` ("error", required)
- `error` (string, required)

### VoicesNotPermittedWarning

- `type` ("voices_not_permitted", required) — この警告を識別します。これを分岐条件として、他のフィールドを読み取ります。
- `speaker_ids` (list of string, required) — ボイスクローンが許可されなかった話者です。吹き替えでは各話者に代替音声を使用しています。その他の話者には影響しません。
- `message` (string, required) — 表示用の、人間が読める警告の説明です。文言はいつでも変更される可能性があるため、代わりに`type`で分岐することをおすすめします。

### ValidationError

- `loc` (list of ValidationErrorLocItems, required)
- `msg` (string, required)
- `type` (string, required)

### ValidationErrorLocItems

## Examples

**Request**

```json
{
  "file": "<file: <file1>>",
  "reference": "Q3 marketing video",
  "source_language": "en",
  "source_url": "https://example.com/promo.mp4",
  "transcript": "<file: <file1>>"
}
```

**Response**

```json
{
  "project_id": "proj_1601kwkyxp0hfzvtmyxwqxx6mcy3",
  "status": "queued",
  "revision": 0,
  "created_at": "2026-07-03T10:15:30Z",
  "updated_at": "2026-07-03T10:15:30Z",
  "reference": "Q3 marketing video",
  "source_language": "en",
  "model_id": "dubbing_v2",
  "language_ids": [],
  "webhook_ids": [],
  "warnings": []
}
```

**SDK Code**

```python
import requests

url = "https://api.elevenlabs.io/v1/dubbing/project"

files = {
    "file": "open('<file1>', 'rb')",
    "transcript": "open('<file1>', 'rb')"
}
payload = {
    "keyterms": ,
    "model_id": ,
    "reference": "Q3 marketing video",
    "source_language": "en",
    "source_url": "https://example.com/promo.mp4",
    "target_language": ,
    "webhook_ids": 
}

response = requests.post(url, data=payload, files=files)

print(response.json())
```

```javascript
const url = 'https://api.elevenlabs.io/v1/dubbing/project';
const form = new FormData();
form.append('file', '<file1>');
form.append('keyterms', '');
form.append('model_id', '');
form.append('reference', 'Q3 marketing video');
form.append('source_language', 'en');
form.append('source_url', 'https://example.com/promo.mp4');
form.append('target_language', '');
form.append('transcript', '<file1>');
form.append('webhook_ids', '');

const options = {method: 'POST'};

options.body = form;

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.elevenlabs.io/v1/dubbing/project"

	payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"<file1>\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"keyterms\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model_id\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"reference\"\r\n\r\nQ3 marketing video\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_language\"\r\n\r\nen\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_url\"\r\n\r\nhttps://example.com/promo.mp4\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"target_language\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"transcript\"; filename=\"<file1>\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_ids\"\r\n\r\n\r\n-----011000010111000001101001--\r\n")

	req, _ := http.NewRequest("POST", url, payload)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.elevenlabs.io/v1/dubbing/project")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"<file1>\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"keyterms\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model_id\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"reference\"\r\n\r\nQ3 marketing video\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_language\"\r\n\r\nen\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_url\"\r\n\r\nhttps://example.com/promo.mp4\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"target_language\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"transcript\"; filename=\"<file1>\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_ids\"\r\n\r\n\r\n-----011000010111000001101001--\r\n"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.elevenlabs.io/v1/dubbing/project")
  .body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"<file1>\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"keyterms\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model_id\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"reference\"\r\n\r\nQ3 marketing video\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_language\"\r\n\r\nen\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_url\"\r\n\r\nhttps://example.com/promo.mp4\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"target_language\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"transcript\"; filename=\"<file1>\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_ids\"\r\n\r\n\r\n-----011000010111000001101001--\r\n")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.elevenlabs.io/v1/dubbing/project', [
  'multipart' => [
    [
        'name' => 'file',
        'filename' => '<file1>',
        'contents' => null
    ],
    [
        'name' => 'reference',
        'contents' => 'Q3 marketing video'
    ],
    [
        'name' => 'source_language',
        'contents' => 'en'
    ],
    [
        'name' => 'source_url',
        'contents' => 'https://example.com/promo.mp4'
    ],
    [
        'name' => 'transcript',
        'filename' => '<file1>',
        'contents' => null
    ]
  ]
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.elevenlabs.io/v1/dubbing/project");
var request = new RestRequest(Method.POST);
request.AddParameter("undefined", "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"<file1>\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"keyterms\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model_id\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"reference\"\r\n\r\nQ3 marketing video\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_language\"\r\n\r\nen\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_url\"\r\n\r\nhttps://example.com/promo.mp4\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"target_language\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"transcript\"; filename=\"<file1>\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_ids\"\r\n\r\n\r\n-----011000010111000001101001--\r\n", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation
let parameters = [
  [
    "name": "file",
    "fileName": "<file1>"
  ],
  [
    "name": "keyterms",
    "value": 
  ],
  [
    "name": "model_id",
    "value": 
  ],
  [
    "name": "reference",
    "value": "Q3 marketing video"
  ],
  [
    "name": "source_language",
    "value": "en"
  ],
  [
    "name": "source_url",
    "value": "https://example.com/promo.mp4"
  ],
  [
    "name": "target_language",
    "value": 
  ],
  [
    "name": "transcript",
    "fileName": "<file1>"
  ],
  [
    "name": "webhook_ids",
    "value": 
  ]
]

let boundary = "---011000010111000001101001"

var body = ""
var error: NSError? = nil
for param in parameters {
  let paramName = param["name"]!
  body += "--\(boundary)\r\n"
  body += "Content-Disposition:form-data; name=\"\(paramName)\""
  if let filename = param["fileName"] {
    let contentType = param["content-type"]!
    let fileContent = String(contentsOfFile: filename, encoding: String.Encoding.utf8)
    if (error != nil) {
      print(error as Any)
    }
    body += "; filename=\"\(filename)\"\r\n"
    body += "Content-Type: \(contentType)\r\n\r\n"
    body += fileContent
  } else if let paramValue = param["value"] {
    body += "\r\n\r\n\(paramValue)"
  }
}

let request = NSMutableURLRequest(url: NSURL(string: "https://api.elevenlabs.io/v1/dubbing/project")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```