curl --request POST 'https://api.voicecheap.ai/v1/actions/projects_get' \
--header "x-api-key: $VOICECHEAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"projectId":"project_launch_2026"}'
const input = {
projectId: 'project_launch_2026',
};
const response = await fetch('https://api.voicecheap.ai/v1/actions/projects_get', {
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/projects_get",
headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
json={"projectId": "project_launch_2026"},
timeout=120,
)
body = response.json()
if not response.ok:
raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
print(body)
{
"data": {
"projectId": "project_launch_2026",
"projectName": "Product launch",
"status": "success",
"workflow": "translation",
"originalVideoUrl": "https://media.example.com/launch/original.mp4",
"originalLanguage": "fr",
"targetLanguages": [
"english"
],
"duration": 75,
"createdAt": 1792152000000,
"progress": {
"step": "done",
"transcriptionProgress": 100,
"transcriptionStatus": "success"
},
"translations": [
{
"workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24",
"translatedVersionId": "0fa684f3-4997-4d7a-9424-16d1f9ac849c",
"targetLanguage": "english",
"status": "completed",
"currentStep": "done",
"progress": 100,
"createdAt": 1792152060000,
"completedAt": 1792152300000,
"translatedVideoUrl": "https://media.example.com/launch/english.mp4",
"translatedAudioUrl": "https://media.example.com/launch/english.mp3",
"settings": {
"voiceCloning": true,
"uploadType": "video",
"keepBackgroundMusic": true,
"keepOriginalVoice": false,
"originalVoiceVolume": 30,
"subtitles": {
"isEnable": false,
"source": "translated"
},
"smartSync": true,
"dubbingMode": "translate",
"voiceIsolatorOption": "studio"
}
}
],
"segmentStructureRevision": 3,
"numberOfSpeakers": 1,
"translationInstructions": "",
"isReadyForDubbing": true,
"settings": {
"voiceCloning": true,
"customVoice": false,
"customVoiceId": "",
"keepBackgroundMusic": true,
"keepOriginalVoice": false,
"originalVoiceVolume": 30,
"activeSpeakerDetectionEnabled": false,
"subtitles": {
"isEnable": false,
"source": "translated"
},
"smartSync": true,
"voiceIsolatorOption": "studio",
"voiceCloningSettings": {
"stability": 0.5,
"similarity": 0.75
}
}
}
}
项目
获取项目
获取项目详情、可编辑设置、片段修订号、输出 URL 和翻译版本。
POST
/
v1
/
actions
/
projects_get
curl --request POST 'https://api.voicecheap.ai/v1/actions/projects_get' \
--header "x-api-key: $VOICECHEAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"projectId":"project_launch_2026"}'
const input = {
projectId: 'project_launch_2026',
};
const response = await fetch('https://api.voicecheap.ai/v1/actions/projects_get', {
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/projects_get",
headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
json={"projectId": "project_launch_2026"},
timeout=120,
)
body = response.json()
if not response.ok:
raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
print(body)
{
"data": {
"projectId": "project_launch_2026",
"projectName": "Product launch",
"status": "success",
"workflow": "translation",
"originalVideoUrl": "https://media.example.com/launch/original.mp4",
"originalLanguage": "fr",
"targetLanguages": [
"english"
],
"duration": 75,
"createdAt": 1792152000000,
"progress": {
"step": "done",
"transcriptionProgress": 100,
"transcriptionStatus": "success"
},
"translations": [
{
"workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24",
"translatedVersionId": "0fa684f3-4997-4d7a-9424-16d1f9ac849c",
"targetLanguage": "english",
"status": "completed",
"currentStep": "done",
"progress": 100,
"createdAt": 1792152060000,
"completedAt": 1792152300000,
"translatedVideoUrl": "https://media.example.com/launch/english.mp4",
"translatedAudioUrl": "https://media.example.com/launch/english.mp3",
"settings": {
"voiceCloning": true,
"uploadType": "video",
"keepBackgroundMusic": true,
"keepOriginalVoice": false,
"originalVoiceVolume": 30,
"subtitles": {
"isEnable": false,
"source": "translated"
},
"smartSync": true,
"dubbingMode": "translate",
"voiceIsolatorOption": "studio"
}
}
],
"segmentStructureRevision": 3,
"numberOfSpeakers": 1,
"translationInstructions": "",
"isReadyForDubbing": true,
"settings": {
"voiceCloning": true,
"customVoice": false,
"customVoiceId": "",
"keepBackgroundMusic": true,
"keepOriginalVoice": false,
"originalVoiceVolume": 30,
"activeSpeakerDetectionEnabled": false,
"subtitles": {
"isEnable": false,
"source": "translated"
},
"smartSync": true,
"voiceIsolatorOption": "studio",
"voiceCloningSettings": {
"stability": 0.5,
"similarity": 0.75
}
}
}
}
获取项目详情、可编辑设置、片段修订号、输出 URL 和翻译版本。
所需权限:
POST https://api.voicecheap.ai/v1/actions/projects_get
身份验证和权限
string
必填
在此请求头中发送 VoiceCheap API 密钥。也支持通过 Authorization: Bearer 发送同一 API 密钥。OAuth 访问令牌仅适用于 MCP,此 REST 端点不接受 OAuth
访问令牌。
projects:read.
需要有效的付费订阅。权限不会改变团队角色、资源归属、媒体额度或套餐限制。
参数
string
必填
文本值。最小长度: 1. 最大长度: 200. 匹配模式:
^[^/\\]+$.完整输入架构
完整输入架构
以下 JSON Schema 保留了发现接口公开的确切字段名、嵌套类型、默认值、范围和可接受值。其他跨字段规则列于操作说明中。
{
"type": "object",
"properties": {
"projectId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[^/\\\\]+$"
}
},
"required": ["projectId"],
"additionalProperties": false
}
请求示例
请将示例资源标识符和媒体键替换为账户返回的值。重试同一次修改操作时,请保持请求标识符不变。curl --request POST 'https://api.voicecheap.ai/v1/actions/projects_get' \
--header "x-api-key: $VOICECHEAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"projectId":"project_launch_2026"}'
const input = {
projectId: 'project_launch_2026',
};
const response = await fetch('https://api.voicecheap.ai/v1/actions/projects_get', {
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/projects_get",
headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
json={"projectId": "project_launch_2026"},
timeout=120,
)
body = response.json()
if not response.ok:
raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
print(body)
响应
首次执行成功时返回 HTTP 200,操作结果位于 data 下。重放请求时可能改为返回已保存的请求状态。示例展示了一种支持的响应,并未包含所有可选字段。 返回公开项目详情、客户设置、当前源结构修订号及所有翻译输出版本。{
"data": {
"projectId": "project_launch_2026",
"projectName": "Product launch",
"status": "success",
"workflow": "translation",
"originalVideoUrl": "https://media.example.com/launch/original.mp4",
"originalLanguage": "fr",
"targetLanguages": [
"english"
],
"duration": 75,
"createdAt": 1792152000000,
"progress": {
"step": "done",
"transcriptionProgress": 100,
"transcriptionStatus": "success"
},
"translations": [
{
"workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24",
"translatedVersionId": "0fa684f3-4997-4d7a-9424-16d1f9ac849c",
"targetLanguage": "english",
"status": "completed",
"currentStep": "done",
"progress": 100,
"createdAt": 1792152060000,
"completedAt": 1792152300000,
"translatedVideoUrl": "https://media.example.com/launch/english.mp4",
"translatedAudioUrl": "https://media.example.com/launch/english.mp3",
"settings": {
"voiceCloning": true,
"uploadType": "video",
"keepBackgroundMusic": true,
"keepOriginalVoice": false,
"originalVoiceVolume": 30,
"subtitles": {
"isEnable": false,
"source": "translated"
},
"smartSync": true,
"dubbingMode": "translate",
"voiceIsolatorOption": "studio"
}
}
],
"segmentStructureRevision": 3,
"numberOfSpeakers": 1,
"translationInstructions": "",
"isReadyForDubbing": true,
"settings": {
"voiceCloning": true,
"customVoice": false,
"customVoiceId": "",
"keepBackgroundMusic": true,
"keepOriginalVoice": false,
"originalVoiceVolume": 30,
"activeSpeakerDetectionEnabled": false,
"subtitles": {
"isEnable": false,
"source": "translated"
},
"smartSync": true,
"voiceIsolatorOption": "studio",
"voiceCloningSettings": {
"stability": 0.5,
"similarity": 0.75
}
}
}
}
结果字段
| 字段 | 说明 |
|---|---|
data.projectId | 可访问的项目标识符。 |
data.projectName | 客户可见的项目名称。 |
data.status | 项目摘要:processing、success 或 failed。 |
data.workflow | 仅转写项目使用 transcription;配音项目使用 translation。 |
data.originalVideoUrl | 原始存储媒体 URL,也适用于音频项目;不存在时为空字符串。 |
data.originalLanguage | 检测到或选定的源语言;不可用时为 unknown。 |
data.targetLanguages | 目标语言名称数组。 |
data.duration | 原始媒体时长,以秒为单位。 |
data.createdAt | 项目创建时间,以 Unix 毫秒表示。 |
data.progress | 公开的转写步骤、可选的 transcriptionProgress,以及 transcriptionStatus。 |
data.translations | 所有语言内容中的全部翻译版本,按规范化后的 createdAt 从新到旧排序。 |
data.segmentStructureRevision | 当前源片段结构修订号,默认为 0。请将此值作为 expectedSegmentStructureRevision 传给 segments_delete 或 segments_merge。 |
data.numberOfSpeakers | 已存储的源说话人数(如有)。 |
data.translationInstructions | 当前项目翻译指令;未存储时为空字符串。 |
data.isReadyForDubbing | 仅当已存储项目被标记为配音就绪时为 true。 |
data.settings | 从项目配音设置或旧版设置中选取的可选客户设置。仅返回已存储字段;缺失的可选值会被省略。 |
data.settings.voiceCloning | 可选的项目音色克隆偏好。 |
data.settings.customVoice | 可选的自定义音色偏好。 |
data.settings.customVoiceId | 可选的自定义音色标识符。 |
data.settings.keepBackgroundMusic | 可选的背景音频偏好。 |
data.settings.keepOriginalVoice | 可选的原始语音偏好。 |
data.settings.originalVoiceVolume | 可选的原始语音音量。 |
data.settings.activeSpeakerDetectionEnabled | 可选的活跃说话人检测偏好。 |
data.settings.subtitles | 可选的 {isEnable,source} 字幕偏好。 |
data.settings.smartSync | 可选的 SmartSync 偏好。 |
data.settings.voiceIsolatorOption | 可选的人声分离偏好:studio 或 realistic。 |
data.settings.voiceCloningSettings | 可选的 {stability,similarity} 音色克隆偏好。 |
data.error | 项目级处理失败时可选的公开 {code,message}。 |
data.translations[].workId | 包含此版本的语言内容标识符。 |
data.translations[].translatedVersionId | 特定配音输出版本的标识符。 |
data.translations[].targetLanguage | 版本的目标语言;缺失时使用其语言内容的目标语言。 |
data.translations[].status | 已存储版本的状态:not-started、in-progress、completed 或 failed。 |
data.translations[].currentStep | 可选的配音处理流程步骤;progress 为可选的数值进度。 |
data.translations[].progress | 可选的配音进度值。 |
data.translations[].createdAt | 规范化为 Unix 毫秒时间戳的创建时间;缺失时使用语言内容的创建时间。 |
data.translations[].completedAt | 可选的完成时间,采用 Unix 毫秒时间戳。 |
data.translations[].failedAt | 可选的失败时间,采用 Unix 毫秒时间戳。 |
data.translations[].timedOutAt | 可选的超时时间,采用 Unix 毫秒时间戳。 |
data.translations[].translatedVideoUrl | 已存储的翻译视频 URL;不可用时为空字符串。 |
data.translations[].translatedAudioUrl | 已存储的翻译音频 URL;不可用时为空字符串。 |
data.translations[].error | 版本失败时可选的 {code,message}。 |
data.translations[].settings | 公开的版本设置:voiceCloning、uploadType、keepBackgroundMusic、keepOriginalVoice、originalVoiceVolume、subtitles、smartSync、dubbingMode、voiceIsolatorOption,以及可选的 translationQualityMode、cutBecauseFreeUser、originalDurationSeconds、cutDurationSeconds、voiceCloningSettings。 |
data.translations[].settings.dubbingMode | translate 或 dub-only。dub-only 版本的 SmartSync 为 false。 |
data.translations[].lipSync | 可选的 {latest,history};每个条目包含 jobId、status、videoUrl、errorMessage、type、createdAt,以及可选的 requestedAt、retryRequestedAt、completedAt、failedAt、timedOutAt、activeSpeakerDetectionEnabled、isRetried。口型同步时间存储为 ISO 字符串。 |
data.translations[].dynamicSubtitles | 可选对象,包含 used、inProgress、magicZooms、magicBrolls、magicBrollsPercentage、videoUrl、errorMessage,以及可选的 removeSilencePace、removeBadTakes、templateName、requestedAt、rerunCount。requestedAt 为 Unix 毫秒时间戳。 |
data.translations[].publicationAttempts | 可选的公开发布尝试数组:id、status、origin,以及可选的 scheduledAt、processingStartedAt、publishedAt、failedAt、privacyStatus、url、videoId、errorMessage。 |
data.translations[].publishedVideos | 可选数组,包含 type、videoId、privacyStatus,以及可选的 url、datePublished、origin、scheduledAt、plannedPublicationId。 |
操作说明
- 此操作不返回转写文本或原始片段文档。请使用 transcripts_get 获取转写内容,使用 translations_list 获取语言内容元数据。
- 序列化 JSON 时会省略缺失的可选嵌套字段。在相应输出可用前,输出 URL 为空字符串。
- 项目状态概括工作流和最新翻译版本;管理多种语言时,请查看各个 translations[] 条目。
- error 字段描述已存储的处理失败;成功获取处理失败的项目时,仍会返回正常结果。
- 已保存的失败返回 VoiceCheap 错误代码和固定消息。请根据代码和资源的当前状态决定如何恢复。
用量
每次成功调用消耗一次月度 API/MCP 调用额度。媒体额度和操作本身的生成限额也适用。错误
| HTTP 状态 | 代码 | 含义或恢复方式 |
|---|---|---|
| 400 | CREDENTIAL_IN_QUERY | 凭证通过 access_token 或 api_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 | USER_NOT_FOUND | 该凭据对应的账户已不存在。 |
| 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 | 可访问的账户中不存在此项目。 |
| 429 | INTEGRATION_MONTHLY_LIMIT_REACHED | 请等待月度额度重置,或更改套餐。 |
| 429 | INTEGRATION_RATE_LIMIT_REACHED | 如果提供了 Retry-After,请等待其指定的时间,并采用退避重试。 |
| 500 | INTERNAL_ERROR | 在决定是否重试修改操作前,请检查已保存的请求状态和资源历史记录。 |
| 503 | SERVER_RESTARTING | 服务器正在重启。请稍后重试;对于修改操作,请保持请求标识符不变。 |
{
"code": "INSUFFICIENT_SCOPE",
"message": "This credential does not permit the requested action.",
"status": 403,
"details": {
"requiredScopes": ["projects:read"]
}
}
此页面对您有帮助吗?

