> ## Documentation Index
> Fetch the complete documentation index at: https://api-docs.voicecheap.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 翻訳済み動画に動的字幕を追加

> 完了した翻訳済み動画またはリップシンク済み動画に、選択した動的字幕テンプレートを追加します。通常のプラン利用枠とメディアクレジットが適用されます。projects_get をポーリングしてください。

完了した翻訳済み動画またはリップシンク済み動画に、選択した動的字幕テンプレートを追加します。通常のプラン利用枠とメディアクレジットが適用されます。projects\_get をポーリングしてください。

```http theme={null}
POST https://api.voicecheap.ai/v1/actions/subtitles_dynamic_create
```

## 認証と権限

<ParamField header="x-api-key" type="string" required>
  このヘッダーに VoiceCheap API キーを指定してください。同じ API キーを Authorization: Bearer で送信することもできます。OAuth アクセストークンは MCP
  でのみ使用でき、この REST エンドポイントでは使用できません。
</ParamField>

必要な権限: `subtitles:write`.

有効な有料サブスクリプションが必要です。権限によってチーム内のロール、リソースの所有権、メディアクレジット、プランの制限が変わることはありません。

## パラメーター

<ParamField body="projectId" type="string" required>
  テキスト値。

  最小文字数: 1. 最大文字数: 200. パターン: `^[^/\\]+$`.
</ParamField>

<ParamField body="workId" type="string" required>
  テキスト値。

  最小文字数: 1. 最大文字数: 200. パターン: `^[^/\\]+$`.
</ParamField>

<ParamField body="translatedVersionId" type="string" required>
  テキスト値。

  最小文字数: 1. 最大文字数: 200. パターン: `^[^/\\]+$`.
</ParamField>

<ParamField body="templateName" type="string" required>
  テキスト値。

  許容値: "Sara", "Daniel", "Dan 2", "Hormozi 4", "Dan", "Devin", "Tayo", "Ella", "Tracy", "Luke", "Hormozi 1", "Hormozi 2", "Hormozi 3", "Hormozi 5", "Leon", "Ali", "Beast", "Maya", "Karl", "Iman", "Umi", "David", "Noah", "Gstaad", "Malta", "Nema", "Seth", "William".
</ParamField>

<ParamField body="videoSource" type="string">
  テキスト値。

  許容値: "translated", "lip-synced". デフォルト値: "translated".
</ParamField>

<ParamField body="magicZooms" type="boolean">
  真偽値。

  デフォルト値: false.
</ParamField>

<ParamField body="magicBrolls" type="boolean">
  真偽値。

  デフォルト値: false.
</ParamField>

<ParamField body="magicBrollsPercentage" type="number">
  数値。

  最小値: 0. 最大値: 100. デフォルト値: 0.
</ParamField>

<ParamField body="removeSilencePace" type="string">
  テキスト値。

  許容値: "natural", "fast", "extra-fast".
</ParamField>

<ParamField body="removeBadTakes" type="boolean">
  真偽値。
</ParamField>

<ParamField body="requestId" type="string">
  トランスポート境界では任意です。省略すると、検証前にサーバーが識別子を補完します。レスポンスを受信できなかった場合に安全に復旧できるよう、固定の UUID v4 を指定してください。

  形式: "uuid". パターン: `^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$`.
</ParamField>

<Accordion title="完全な入力スキーマ">
  以下の JSON Schema は、ディスカバリーで公開される正確なフィールド名、ネストされた型、デフォルト値、範囲、許容値を保持しています。フィールド間の追加ルールは操作の注意事項に記載されています。

  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "projectId": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200,
        "pattern": "^[^/\\\\]+$"
      },
      "workId": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200,
        "pattern": "^[^/\\\\]+$"
      },
      "translatedVersionId": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200,
        "pattern": "^[^/\\\\]+$"
      },
      "templateName": {
        "type": "string",
        "enum": [
          "Sara",
          "Daniel",
          "Dan 2",
          "Hormozi 4",
          "Dan",
          "Devin",
          "Tayo",
          "Ella",
          "Tracy",
          "Luke",
          "Hormozi 1",
          "Hormozi 2",
          "Hormozi 3",
          "Hormozi 5",
          "Leon",
          "Ali",
          "Beast",
          "Maya",
          "Karl",
          "Iman",
          "Umi",
          "David",
          "Noah",
          "Gstaad",
          "Malta",
          "Nema",
          "Seth",
          "William"
        ]
      },
      "videoSource": {
        "default": "translated",
        "type": "string",
        "enum": ["translated", "lip-synced"]
      },
      "magicZooms": {
        "default": false,
        "type": "boolean"
      },
      "magicBrolls": {
        "default": false,
        "type": "boolean"
      },
      "magicBrollsPercentage": {
        "default": 0,
        "type": "number",
        "minimum": 0,
        "maximum": 100
      },
      "removeSilencePace": {
        "type": "string",
        "enum": ["natural", "fast", "extra-fast"]
      },
      "removeBadTakes": {
        "type": "boolean"
      },
      "requestId": {
        "type": "string",
        "format": "uuid",
        "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$",
        "description": "UUID v4 for this action. Reuse the same ID with identical arguments on retries."
      }
    },
    "required": ["projectId", "workId", "translatedVersionId", "templateName"],
    "additionalProperties": false
  }
  ```
</Accordion>

## 冪等性

変更操作ごとに、requestId または Idempotency-Key HTTP ヘッダーに UUID v4 を指定してください。ネットワーク障害後の再試行では、同じ識別子と同一の引数を使用します。両方を指定する場合は一致させる必要があります。保存済みリクエストを再取得しても、操作は再実行されず、月間呼び出し回数も追加で消費されません。失敗または中断したリクエストは自動的には再開されません。

すべての変更操作は、再試行時に同じリクエストがまだ実行中であれば、通常の初回実行が同期処理であっても HTTP 202 を返す場合があります。実行が完了していても resultStored が false の場合、再試行では元の結果ではなく、保存済みリクエストの状態を HTTP 200 で返します。出力は対応するドメインの履歴、結果、またはダウンロードアクションで取得してください。

## リクエスト例

例に記載されたリソース識別子とメディアキーを、ご自身のアカウントで返された値に置き換えてください。同じ変更操作を再試行する場合は、リクエスト識別子を変更しないでください。

<RequestExample>
  ```bash cURL theme={null}
  curl --request POST 'https://api.voicecheap.ai/v1/actions/subtitles_dynamic_create' \
    --header "x-api-key: $VOICECHEAP_API_KEY" \
    --header 'Content-Type: application/json' \
    --data '{"projectId":"project_launch_2026","workId":"5f8423d1-e4c0-4f80-9e3f-eed959389e24","translatedVersionId":"0fa684f3-4997-4d7a-9424-16d1f9ac849c","templateName":"Sara","videoSource":"translated","magicZooms":false,"magicBrolls":false,"magicBrollsPercentage":0,"requestId":"41321bda-e243-4b6f-96a4-622cd047c991"}'
  ```

  ```javascript JavaScript theme={null}
  const input = {
    projectId: 'project_launch_2026',
    workId: '5f8423d1-e4c0-4f80-9e3f-eed959389e24',
    translatedVersionId: '0fa684f3-4997-4d7a-9424-16d1f9ac849c',
    templateName: 'Sara',
    videoSource: 'translated',
    magicZooms: false,
    magicBrolls: false,
    magicBrollsPercentage: 0,
    requestId: '41321bda-e243-4b6f-96a4-622cd047c991',
  };
  const response = await fetch('https://api.voicecheap.ai/v1/actions/subtitles_dynamic_create', {
    method: 'POST',
    headers: {
      'x-api-key': process.env.VOICECHEAP_API_KEY,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(input),
  });
  const body = await response.json();
  if (!response.ok) throw new Error(body.code + ': ' + body.message);
  console.log(body);
  ```

  ```python Python theme={null}
  import os
  import requests

  response = requests.post(
      "https://api.voicecheap.ai/v1/actions/subtitles_dynamic_create",
      headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
      json={"projectId": "project_launch_2026", "workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24", "translatedVersionId": "0fa684f3-4997-4d7a-9424-16d1f9ac849c", "templateName": "Sara", "videoSource": "translated", "magicZooms": False, "magicBrolls": False, "magicBrollsPercentage": 0, "requestId": "41321bda-e243-4b6f-96a4-622cd047c991"},
      timeout=120,
  )
  body = response.json()
  if not response.ok:
      raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
  print(body)
  ```
</RequestExample>

## レスポンス

この操作は実行中に HTTP 202 を返します。requestId を保存し、その識別子と元の操作名を指定して action\_request\_get をポーリングしてください。ポーリングの状態は running、completed、failed、interrupted です。完了した結果が別のメディアジョブを示す場合は、その操作に対応するステータスまたは出力取得アクションで処理を続けてください。

ダイナミック字幕を受け付け、選択したプロジェクト、ワーク、バージョンの識別子と処理状態を返します。

<ResponseExample>
  ```json HTTP 202 theme={null}
  {
    "data": {
      "requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
      "status": "running",
      "pollAction": "action_request_get",
      "pollAfterSeconds": 5
    },
    "requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
  }
  ```

  ```json HTTP 200 theme={null}
  {
    "data": {
      "projectId": "project_launch_2026",
      "workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24",
      "translatedVersionId": "0fa684f3-4997-4d7a-9424-16d1f9ac849c",
      "status": "processing"
    },
    "requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
  }
  ```

  ```json HTTP 202 replay_running theme={null}
  {
    "data": {
      "requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
      "operation": "subtitles_dynamic_create",
      "createdAt": 1792144800000,
      "updatedAt": 1792144820000,
      "status": "running",
      "pollAfterSeconds": 5
    },
    "requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
  }
  ```

  ```json HTTP 200 replay_completed_without_result theme={null}
  {
    "data": {
      "requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
      "operation": "subtitles_dynamic_create",
      "createdAt": 1792144800000,
      "updatedAt": 1792144820000,
      "status": "completed",
      "resultStored": false,
      "message": "The action completed. Retrieve its output from the corresponding history or resource action."
    },
    "requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
  }
  ```
</ResponseExample>

## 結果フィールド

| フィールド | 説明 |
| - | - |
| `data.projectId` | 親プロジェクトの識別子。 |
| `data.workId` | アクセスが許可された言語ワークの識別子。 |
| `data.translatedVersionId` | 選択された完了済み翻訳バージョン。 |
| `data.status` | 後続リクエストの受け入れ後は processing。出力の完了は別途ポーリングする必要があります。 |

## リクエストの復旧とポーリング

接続が切断された後も同じ識別子を使用してください。resultStored が false の場合は、対応する履歴、結果、またはダウンロードアクションで出力を取得します。進捗を確認するためだけに、別の生成を開始しないでください。

```bash theme={null}
curl --request POST 'https://api.voicecheap.ai/v1/actions/action_request_get' \
  --header "x-api-key: $VOICECHEAP_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{"requestId":"41321bda-e243-4b6f-96a4-622cd047c991","operation":"subtitles_dynamic_create"}'
```

```json HTTP 200 theme={null}
{
  "data": {
    "requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
    "operation": "subtitles_dynamic_create",
    "status": "completed",
    "createdAt": 1792144800000,
    "updatedAt": 1792144820000,
    "resultStored": true,
    "result": {
      "projectId": "project_launch_2026",
      "workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24",
      "translatedVersionId": "0fa684f3-4997-4d7a-9424-16d1f9ac849c",
      "status": "processing"
    }
  }
}
```

## 操作の注意事項

* templateName は対応するテンプレート名です。videoSource のデフォルトは translated で、lip-synced は保存済みの最新の完了したリップシンク動画を選択します。呼び出し側のメディアURLは使用できません。
* 選択したバージョンは完了済みで、選択した動画を利用できる必要があります。MP4とMOVに対応し、保存済みのプロジェクトの長さは最大2時間、保存済みバイトサイズは最大 2 GiB です。
* magicZooms と magicBrolls のデフォルトは false、magicBrollsPercentage は0です。任意の removeSilencePace は natural、fast、extra-fast を受け付けます。removeBadTakes は真偽値です。
* 言語は、アクセスが許可された言語ワークから取得します。通常のプラン利用枠とメディアクレジットの確認が適用されます。各翻訳でダイナミック字幕を再実行できるのは1回のみです。
* このアクションは完了まで時間がかかります。まず action\_request\_get をポーリングしてハンドラーの完了を待ち、次に projects\_get.translations\[].dynamicSubtitles で inProgress、videoUrl、errorMessage を確認してください。projects\_status はこの動的字幕の状態を公開しません。

## 使用量

正常に実行された呼び出しごとに、月間 API/MCP 呼び出し回数を 1 回消費します。メディアクレジットと、その操作固有の生成枠も適用されます。

## エラー

| HTTP ステータス | コード | 意味または対処方法 |
| - | - | - |
| 400 | `BAD_REQUEST` | バージョンまたは選択した動画が ready 状態ではない、形式やサイズが非対応、または利用可能なメディアクレジットが不足しています。 |
| 400 | `CREDENTIAL_IN_QUERY` | access\_token または api\_key クエリパラメーターに認証情報が指定されています。認証情報はヘッダーで送信してください。 |
| 400 | `IDEMPOTENCY_CONFLICT` | Idempotency-Key ヘッダーとリクエストボディの requestId は一致させる必要があります。 |
| 400 | `INVALID_REQUEST_ID` | UUID v4 の requestId または Idempotency-Key を指定してください。 |
| 400 | `VALIDATION_ERROR` | スキーマに従って入力を修正してください。無効な値や整合性のない値は実行前に拒否されます。 |
| 401 | `API_KEY_EXPIRED` | API キーの有効期限が切れています。 |
| 401 | `INVALID_API_KEY` | 有効期限内の有効な API キーを指定してください。 |
| 401 | `INVALID_CREDENTIAL` | Authorization ヘッダーの形式が不正、または x-api-key と競合しています。 |
| 401 | `MISSING_CREDENTIAL` | 利用可能なヘッダー認証情報が指定されていないか、4096文字を超えています。 |
| 401 | `UNAUTHORIZED` | 生成がすでに進行中、再実行 1 回の上限に到達、またはプランの利用枠を使い切っています。 |
| 401 | `USER_NOT_FOUND` | 認証情報に対応するアカウントはすでに存在しません。 |
| 403 | `ACCOUNT_UNAVAILABLE` | 操作を実行するアカウントまたは請求対象アカウントが利用できないか、削除中です。 |
| 403 | `AMBIGUOUS_TEAM_API_KEY` | 認証情報のユーザーが複数のチームに属しているため、課金コンテキストが曖昧です。 |
| 403 | `FORBIDDEN` | 認証済み実行者は、このプロジェクトにアクセスできません。 |
| 403 | `INSUFFICIENT_SCOPE` | 必要な権限をすべて付与するか、別の認証情報を使用してください。 |
| 403 | `INTEGRATION_PLAN_UNSUPPORTED` | アカウントの連携上限を確認できませんでした。 |
| 403 | `SUBSCRIPTION_REQUIRED` | 有効な有料サブスクリプションを使用してください。 |
| 403 | `TEAM_OWNER_NOT_FOUND` | 実効的なチームオーナーのアカウントが見つかりませんでした。 |
| 404 | `PROJECT_NOT_FOUND` | アクセス可能なアカウントにこのプロジェクトは存在しません。 |
| 404 | `TRANSLATION_NOT_FOUND` | workId は、このプロジェクトに属する言語別ワークを指していません。 |
| 404 | `TRANSLATION_VERSION_NOT_FOUND` | translatedVersionId は、選択した言語別ワークに属していません。 |
| 409 | `CONCURRENT_ACTION_LIMIT_REACHED` | このアカウントでは、すでに 10 件の連携アクションが実行中です。新しいアクションを開始する前に、既存のリクエストをポーリングしてください。 |
| 409 | `CONFLICT` | 生成を受け付ける前に、選択した動画が変更されました。 |
| 409 | `IDEMPOTENCY_CONFLICT` | 識別子を再利用する場合は、同じ操作と引数でのみ使用してください。 |
| 429 | `INTEGRATION_MONTHLY_LIMIT_REACHED` | 月次リセットを待つか、プランを変更してください。 |
| 429 | `INTEGRATION_RATE_LIMIT_REACHED` | Retry-After がある場合は指定時間を待ち、バックオフを使用してください。 |
| 500 | `INTERNAL_ERROR` | 変更操作を再試行するか判断する前に、保存済みリクエストの状態とリソースの履歴を確認してください。 |
| 503 | `ACTION_RESULT_UNAVAILABLE` | アクションは実行されましたが、結果を保存できませんでした。新しい生成を開始する前に、保存済みリクエストの状態とリソース履歴を確認してください。 |
| 503 | `SERVER_RESTARTING` | サーバーが再起動中です。少し待ってから再試行し、変更操作では同じリクエスト識別子を使用してください。 |

```json theme={null}
{
  "code": "INSUFFICIENT_SCOPE",
  "message": "This credential does not permit the requested action.",
  "status": 403,
  "details": {
    "requiredScopes": ["subtitles:write"]
  }
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.