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"}'
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);
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)
{
"data": {
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
"status": "running",
"pollAction": "action_request_get",
"pollAfterSeconds": 5
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
{
"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"
}
{
"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"
}
{
"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"
}
字幕
为翻译视频添加动态字幕
将所选动态字幕模板应用于已完成的翻译视频或口型同步视频。使用常规套餐限额和媒体额度。请轮询 projects_get。
POST
/
v1
/
actions
/
subtitles_dynamic_create
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"}'
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);
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)
{
"data": {
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
"status": "running",
"pollAction": "action_request_get",
"pollAfterSeconds": 5
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
{
"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"
}
{
"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"
}
{
"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"
}
将所选动态字幕模板应用于已完成的翻译视频或口型同步视频。使用常规套餐限额和媒体额度。请轮询 projects_get。
所需权限:
POST https://api.voicecheap.ai/v1/actions/subtitles_dynamic_create
身份验证和权限
string
必填
在此请求头中发送 VoiceCheap API 密钥。也支持通过 Authorization: Bearer 发送同一 API 密钥。OAuth 访问令牌仅适用于 MCP,此 REST 端点不接受 OAuth
访问令牌。
subtitles:write.
需要有效的付费订阅。权限不会改变团队角色、资源归属、媒体额度或套餐限制。
参数
string
必填
文本值。最小长度: 1. 最大长度: 200. 匹配模式:
^[^/\\]+$.string
必填
文本值。最小长度: 1. 最大长度: 200. 匹配模式:
^[^/\\]+$.string
必填
文本值。最小长度: 1. 最大长度: 200. 匹配模式:
^[^/\\]+$.string
必填
文本值。允许的值: “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”.
string
文本值。允许的值: “translated”, “lip-synced”. 默认值: “translated”.
boolean
布尔值。默认值: false.
boolean
布尔值。默认值: false.
number
数值。最小值: 0. 最大值: 100. 默认值: 0.
string
文本值。允许的值: “natural”, “fast”, “extra-fast”.
boolean
布尔值。
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}$.完整输入架构
完整输入架构
以下 JSON Schema 保留了发现接口公开的确切字段名、嵌套类型、默认值、范围和可接受值。其他跨字段规则列于操作说明中。
{
"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
}
幂等性
为每次修改操作在 requestId 或 Idempotency-Key HTTP 请求头中提供 UUID v4。网络故障后,请使用相同标识符和完全相同的参数重试。如果同时提供这两个值,它们必须一致。重放已保存的请求不会重复执行操作,也不会再次扣除月度调用次数。失败或中断的请求不会自动重新执行。 对于每次修改操作,如果重试时发现同一请求仍在运行,即使首次执行通常为同步操作,也可能返回 HTTP 202。如果执行已完成但 resultStored 为 false,重试会返回 HTTP 200 和已保存的请求状态,而非原始结果。请通过对应领域的历史记录、结果或下载操作获取输出。请求示例
请将示例资源标识符和媒体键替换为账户返回的值。重试同一次修改操作时,请保持请求标识符不变。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"}'
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);
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)
响应
此操作在运行期间返回 HTTP 202。请保存 requestId,并使用该标识符和原始操作名称轮询 action_request_get。轮询状态包括 running、completed、failed 和 interrupted。已完成的结果可能指向独立的媒体任务;请继续使用该操作对应的状态或输出操作。 动态字幕生成获准执行后,返回所选项目、语言内容和版本标识符,以及 processing 状态。{
"data": {
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
"status": "running",
"pollAction": "action_request_get",
"pollAfterSeconds": 5
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
{
"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"
}
{
"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"
}
{
"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"
}
结果字段
| 字段 | 说明 |
|---|---|
data.projectId | 父项目标识符。 |
data.workId | 已获授权的语言内容标识符。 |
data.translatedVersionId | 所选的已完成翻译版本。 |
data.status | 下游请求获准执行后为 processing;输出是否完成须单独轮询。 |
恢复并轮询此请求
即使连接丢失,也应使用同一标识符。如果 resultStored 为 false,请通过相应的历史记录、结果或下载操作获取输出。切勿仅为查看进度而启动第二次生成。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"}'
HTTP 200
{
"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 为布尔值。
- 语言取自已获授权的语言内容。仍需进行常规套餐限额和媒体额度检查;每个翻译版本只能重新生成一次动态字幕。
- 这是一个长时间运行的操作。先轮询 action_request_get 等待处理完成,再查看 projects_get.translations[].dynamicSubtitles 中的 inProgress、videoUrl 和 errorMessage。projects_status 不公开此动态字幕状态。
用量
每次成功调用消耗一次月度 API/MCP 调用额度。媒体额度和操作本身的生成限额也适用。错误
| HTTP 状态 | 代码 | 含义或恢复方式 |
|---|---|---|
| 400 | BAD_REQUEST | 该版本或所选视频尚未就绪,其格式或大小不受支持,或可用媒体额度不足。 |
| 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 | UNAUTHORIZED | 生成已在进行中、已达到仅可重试生成一次的限额,或套餐限额已用尽。 |
| 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 | 服务器正在重启。请稍后重试;对于修改操作,请保持请求标识符不变。 |
{
"code": "INSUFFICIENT_SCOPE",
"message": "This credential does not permit the requested action.",
"status": 403,
"details": {
"requiredScopes": ["subtitles:write"]
}
}
此页面对您有帮助吗?

