> ## 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.

# 添加目标语言

> 向现有项目添加空的目标语言内容，不会启动付费媒体生成。

向现有项目添加空的目标语言内容，不会启动付费媒体生成。

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

## 身份验证和权限

<ParamField header="x-api-key" type="string" required>
  在此请求头中发送 VoiceCheap API 密钥。也支持通过 Authorization: Bearer 发送同一 API 密钥。OAuth 访问令牌仅适用于 MCP，此 REST 端点不接受 OAuth
  访问令牌。
</ParamField>

所需权限: `translations:write`.

需要有效的付费订阅。权限不会改变团队角色、资源归属、媒体额度或套餐限制。

## 参数

<ParamField body="projectId" type="string" required>
  文本值。

  最小长度: 1. 最大长度: 200. 匹配模式: `^[^/\\]+$`.
</ParamField>

<ParamField body="targetLanguage" type="string" required>
  文本值。

  允许的值: "afrikaans", "albanian", "amharic", "arabic", "armenian", "assamese", "azerbaijani", "basque", "belarusian", "bengali", "bosnian", "bulgarian", "catalan", "croatian", "czech", "danish", "dutch", "english", "british english", "estonian", "finnish", "french", "french canadian", "galician", "german", "greek", "gujarati", "hebrew", "hindi", "hungarian", "icelandic", "indonesian", "irish", "italian", "japanese", "kannada", "kazakh", "khmer", "korean", "lao", "latvian", "lithuanian", "macedonian", "malay", "malayalam", "mandarin", "marathi", "mongolian", "nepali", "norwegian", "persian", "polish", "portuguese", "brazilian portuguese", "pt\_brazil", "punjabi", "romanian", "russian", "serbian", "slovak", "slovenian", "spanish", "swahili", "swedish", "tagalog", "tamil", "telugu", "thai", "turkish", "ukrainian", "urdu", "vietnamese", "welsh", "yoruba", "zulu".
</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": "^[^/\\\\]+$"
      },
      "targetLanguage": {
        "type": "string",
        "enum": [
          "afrikaans",
          "albanian",
          "amharic",
          "arabic",
          "armenian",
          "assamese",
          "azerbaijani",
          "basque",
          "belarusian",
          "bengali",
          "bosnian",
          "bulgarian",
          "catalan",
          "croatian",
          "czech",
          "danish",
          "dutch",
          "english",
          "british english",
          "estonian",
          "finnish",
          "french",
          "french canadian",
          "galician",
          "german",
          "greek",
          "gujarati",
          "hebrew",
          "hindi",
          "hungarian",
          "icelandic",
          "indonesian",
          "irish",
          "italian",
          "japanese",
          "kannada",
          "kazakh",
          "khmer",
          "korean",
          "lao",
          "latvian",
          "lithuanian",
          "macedonian",
          "malay",
          "malayalam",
          "mandarin",
          "marathi",
          "mongolian",
          "nepali",
          "norwegian",
          "persian",
          "polish",
          "portuguese",
          "brazilian portuguese",
          "pt_brazil",
          "punjabi",
          "romanian",
          "russian",
          "serbian",
          "slovak",
          "slovenian",
          "spanish",
          "swahili",
          "swedish",
          "tagalog",
          "tamil",
          "telugu",
          "thai",
          "turkish",
          "ukrainian",
          "urdu",
          "vietnamese",
          "welsh",
          "yoruba",
          "zulu"
        ]
      },
      "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", "targetLanguage"],
    "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/translations_add' \
    --header "x-api-key: $VOICECHEAP_API_KEY" \
    --header 'Content-Type: application/json' \
    --data '{"projectId":"project_launch_2026","targetLanguage":"english","requestId":"41321bda-e243-4b6f-96a4-622cd047c991"}'
  ```

  ```javascript JavaScript theme={null}
  const input = {
    projectId: 'project_launch_2026',
    targetLanguage: 'english',
    requestId: '41321bda-e243-4b6f-96a4-622cd047c991',
  };
  const response = await fetch('https://api.voicecheap.ai/v1/actions/translations_add', {
    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/translations_add",
      headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
      json={"projectId": "project_launch_2026", "targetLanguage": "english", "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 200，操作结果位于 data 下。重放请求时可能改为返回已保存的请求状态。示例展示了一种支持的响应，并未包含所有可选字段。

返回新的语言内容标识；如果该目标语言已存在，则返回现有语言内容的完整字段集合。

<ResponseExample>
  ```json HTTP 200 theme={null}
  {
    "data": {
      "projectId": "project_launch_2026",
      "workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24",
      "targetLanguage": "english"
    },
    "requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
  }
  ```

  ```json HTTP 202 replay_running theme={null}
  {
    "data": {
      "requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
      "operation": "translations_add",
      "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": "translations_add",
      "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.workId` | 语言内容标识符。 |
| `data.projectId` | 父项目标识符。 |
| `data.targetLanguage` | 目标语言。 |
| `data.originalLanguage` | 源语言。 |
| `data.createdAt` | 语言内容的创建时间，已规范化为 Unix 毫秒。 |
| `data.isWorkWaitingForProofreading` | 校对状态；未显式设置时为 false。 |
| `data.pendingSegmentIndexes` | 仍待翻译的源片段索引，默认为空数组。 |
| `data.versions` | 此语言内容中的所有公开版本，按最新版本优先排列。 |
| `data.versions[].workId` | 包含此版本的语言内容标识符。 |
| `data.versions[].translatedVersionId` | 特定配音输出版本的标识符。 |
| `data.versions[].targetLanguage` | 版本的目标语言；缺失时使用其语言内容的目标语言。 |
| `data.versions[].status` | 已存储版本的状态：not-started、in-progress、completed 或 failed。 |
| `data.versions[].currentStep` | 可选的配音处理流程步骤；progress 为可选的数值进度。 |
| `data.versions[].progress` | 可选的配音进度值。 |
| `data.versions[].createdAt` | 规范化为 Unix 毫秒时间戳的创建时间；缺失时使用语言内容的创建时间。 |
| `data.versions[].completedAt` | 可选的完成时间，采用 Unix 毫秒时间戳。 |
| `data.versions[].failedAt` | 可选的失败时间，采用 Unix 毫秒时间戳。 |
| `data.versions[].timedOutAt` | 可选的超时时间，采用 Unix 毫秒时间戳。 |
| `data.versions[].translatedVideoUrl` | 已存储的翻译视频 URL；不可用时为空字符串。 |
| `data.versions[].translatedAudioUrl` | 已存储的翻译音频 URL；不可用时为空字符串。 |
| `data.versions[].error` | 版本失败时可选的 \{code,message}。 |
| `data.versions[].settings` | 公开的版本设置：voiceCloning、uploadType、keepBackgroundMusic、keepOriginalVoice、originalVoiceVolume、subtitles、smartSync、dubbingMode、voiceIsolatorOption，以及可选的 translationQualityMode、cutBecauseFreeUser、originalDurationSeconds、cutDurationSeconds、voiceCloningSettings。 |
| `data.versions[].settings.dubbingMode` | translate 或 dub-only。dub-only 版本的 SmartSync 为 false。 |
| `data.versions[].lipSync` | 可选的 \{latest,history}；每个条目包含 jobId、status、videoUrl、errorMessage、type、createdAt，以及可选的 requestedAt、retryRequestedAt、completedAt、failedAt、timedOutAt、activeSpeakerDetectionEnabled、isRetried。口型同步时间存储为 ISO 字符串。 |
| `data.versions[].dynamicSubtitles` | 可选对象，包含 used、inProgress、magicZooms、magicBrolls、magicBrollsPercentage、videoUrl、errorMessage，以及可选的 removeSilencePace、removeBadTakes、templateName、requestedAt、rerunCount。requestedAt 为 Unix 毫秒时间戳。 |
| `data.versions[].publicationAttempts` | 可选的公开发布尝试数组：id、status、origin，以及可选的 scheduledAt、processingStartedAt、publishedAt、failedAt、privacyStatus、url、videoId、errorMessage。 |
| `data.versions[].publishedVideos` | 可选数组，包含 type、videoId、privacyStatus，以及可选的 url、datePublished、origin、scheduledAt、plannedPublicationId。 |

## 此项目中已存在目标语言的语言内容。

返回现有语言内容的完整投影；不会创建额外的语言内容。

```json HTTP 200 theme={null}
{
  "data": {
    "workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24",
    "projectId": "project_launch_2026",
    "targetLanguage": "english",
    "originalLanguage": "fr",
    "createdAt": 1792152000000,
    "isWorkWaitingForProofreading": true,
    "pendingSegmentIndexes": [0, 1],
    "versions": []
  }
}
```

## 恢复并轮询此请求

即使连接丢失，也应使用同一标识符。如果 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":"translations_add"}'
```

```json HTTP 200 theme={null}
{
  "data": {
    "requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
    "operation": "translations_add",
    "status": "completed",
    "createdAt": 1792144800000,
    "updatedAt": 1792144820000,
    "resultStored": true,
    "result": {
      "projectId": "project_launch_2026",
      "workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24",
      "targetLanguage": "english"
    }
  }
}
```

## 操作说明

* 添加新语言不会启动转写、翻译或语音生成。新的语言内容会等待校对，所有源片段索引初始均为待处理。
* 新建语言内容的分支仅返回 projectId、workId 和 targetLanguage。已有语言内容的分支返回与 translations\_get 相同的字段集合。
* 使用 translations\_start 或 translations\_dub 单独启动实际媒体处理。
* 已保存的失败返回 VoiceCheap 错误代码和固定消息。请根据代码和资源的当前状态决定如何恢复。

## 用量

每次成功调用消耗一次月度 API/MCP 调用额度。媒体额度和操作本身的生成限额也适用。

## 错误

| HTTP 状态 | 代码 | 含义或恢复方式 |
| - | - | - |
| 400 | `CREDENTIAL_IN_QUERY` | 凭证通过 access\_token 或 api\_key 查询参数提供。请在标头中发送凭证。 |
| 400 | `IDEMPOTENCY_CONFLICT` | Idempotency-Key 请求头必须与请求体中的 requestId 字段一致。 |
| 400 | `INVALID_REQUEST_ID` | 请在 requestId 或 Idempotency-Key 中提供 UUID v4。 |
| 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 | `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` | 可访问的账户中不存在此项目。 |
| 409 | `CONCURRENT_ACTION_LIMIT_REACHED` | 此账户已有 10 个集成操作正在运行。请先轮询现有请求，再启动另一个操作。 |
| 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": ["translations:write"]
  }
}
```


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