curl --request POST 'https://api.voicecheap.ai/v1/actions/projects_update' \
--header "x-api-key: $VOICECHEAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"projectId":"project_launch_2026","requestId":"41321bda-e243-4b6f-96a4-622cd047c991","changes":{"projectName":"Product launch — English","translationInstructions":"Keep product names unchanged.","keepBackgroundMusic":true,"subtitles":{"isEnable":true,"source":"translated"}}}'
const input = {
projectId: 'project_launch_2026',
requestId: '41321bda-e243-4b6f-96a4-622cd047c991',
changes: {
projectName: 'Product launch — English',
translationInstructions: 'Keep product names unchanged.',
keepBackgroundMusic: true,
subtitles: {
isEnable: true,
source: 'translated',
},
},
};
const response = await fetch('https://api.voicecheap.ai/v1/actions/projects_update', {
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_update",
headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
json={"projectId": "project_launch_2026", "requestId": "41321bda-e243-4b6f-96a4-622cd047c991", "changes": {"projectName": "Product launch — English", "translationInstructions": "Keep product names unchanged.", "keepBackgroundMusic": True, "subtitles": {"isEnable": True, "source": "translated"}}},
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 — English",
"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": "Keep product names unchanged.",
"isReadyForDubbing": true,
"settings": {
"voiceCloning": true,
"customVoice": false,
"customVoiceId": "",
"keepBackgroundMusic": true,
"keepOriginalVoice": false,
"originalVoiceVolume": 30,
"activeSpeakerDetectionEnabled": false,
"subtitles": {
"isEnable": true,
"source": "translated"
},
"smartSync": true,
"voiceIsolatorOption": "studio",
"voiceCloningSettings": {
"stability": 0.5,
"similarity": 0.75
}
}
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
{
"data": {
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
"operation": "projects_update",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "running",
"pollAfterSeconds": 5
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
{
"data": {
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
"operation": "projects_update",
"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"
}
Projekty
Zaktualizuj ustawienia projektu
Zmień nazwę projektu, instrukcje tłumaczenia, gotowość do korekty, preferencje mowy, dźwięku w tle lub napisów. Można zmieniać wyłącznie jawne ustawienia klienta.
POST
/
v1
/
actions
/
projects_update
curl --request POST 'https://api.voicecheap.ai/v1/actions/projects_update' \
--header "x-api-key: $VOICECHEAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"projectId":"project_launch_2026","requestId":"41321bda-e243-4b6f-96a4-622cd047c991","changes":{"projectName":"Product launch — English","translationInstructions":"Keep product names unchanged.","keepBackgroundMusic":true,"subtitles":{"isEnable":true,"source":"translated"}}}'
const input = {
projectId: 'project_launch_2026',
requestId: '41321bda-e243-4b6f-96a4-622cd047c991',
changes: {
projectName: 'Product launch — English',
translationInstructions: 'Keep product names unchanged.',
keepBackgroundMusic: true,
subtitles: {
isEnable: true,
source: 'translated',
},
},
};
const response = await fetch('https://api.voicecheap.ai/v1/actions/projects_update', {
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_update",
headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
json={"projectId": "project_launch_2026", "requestId": "41321bda-e243-4b6f-96a4-622cd047c991", "changes": {"projectName": "Product launch — English", "translationInstructions": "Keep product names unchanged.", "keepBackgroundMusic": True, "subtitles": {"isEnable": True, "source": "translated"}}},
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 — English",
"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": "Keep product names unchanged.",
"isReadyForDubbing": true,
"settings": {
"voiceCloning": true,
"customVoice": false,
"customVoiceId": "",
"keepBackgroundMusic": true,
"keepOriginalVoice": false,
"originalVoiceVolume": 30,
"activeSpeakerDetectionEnabled": false,
"subtitles": {
"isEnable": true,
"source": "translated"
},
"smartSync": true,
"voiceIsolatorOption": "studio",
"voiceCloningSettings": {
"stability": 0.5,
"similarity": 0.75
}
}
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
{
"data": {
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
"operation": "projects_update",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "running",
"pollAfterSeconds": 5
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
{
"data": {
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
"operation": "projects_update",
"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"
}
Zmień nazwę projektu, instrukcje tłumaczenia, gotowość do korekty, preferencje mowy, dźwięku w tle lub napisów. Można zmieniać wyłącznie jawne ustawienia klienta.
Wymagane uprawnienia:
POST https://api.voicecheap.ai/v1/actions/projects_update
Uwierzytelnianie i uprawnienia
string
wymagane
Wyślij klucz API VoiceCheap w tym nagłówku. Obsługiwany jest również nagłówek Authorization: Bearer z tym samym kluczem API. Tokeny dostępu OAuth są
akceptowane tylko przez MCP, a nie przez ten endpoint REST.
projects:write.
Wymagana jest aktywna płatna subskrypcja. Uprawnienia nie zmieniają ról w zespole, własności zasobów, kredytów na multimedia ani limitów planu.
Parametry
string
wymagane
Wartość tekstowa.Minimalna długość: 1. Maksymalna długość: 200. Wzorzec:
^[^/\\]+$.string
Opcjonalne na poziomie transportu: jeśli identyfikator zostanie pominięty, serwer doda go przed walidacją. Podaj własny, stały UUID v4, aby bezpiecznie odzyskać wynik po utracie odpowiedzi.Format: “uuid”. Wzorzec:
^[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}$.object
wymagane
Obiekt JSON. Pola zagnieżdżone opisuje pełny schemat danych wejściowych.
Pełny schemat danych wejściowych
Pełny schemat danych wejściowych
Poniższy JSON Schema zachowuje dokładne nazwy pól, typy zagnieżdżone, wartości domyślne, ograniczenia i akceptowane wartości udostępniane przez mechanizm wykrywania. Dodatkowe reguły zależności między polami znajdują się w uwagach do operacji.
{
"type": "object",
"properties": {
"projectId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[^/\\\\]+$"
},
"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."
},
"changes": {
"type": "object",
"properties": {
"projectName": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"translationInstructions": {
"type": "string",
"maxLength": 1000
},
"isReadyForDubbing": {
"type": "boolean"
},
"voiceCloning": {
"type": "boolean"
},
"keepBackgroundMusic": {
"type": "boolean"
},
"keepOriginalVoice": {
"type": "boolean"
},
"originalVoiceVolume": {
"type": "number",
"minimum": 1,
"maximum": 70
},
"activeSpeakerDetectionEnabled": {
"type": "boolean"
},
"smartSync": {
"type": "boolean"
},
"voiceIsolatorOption": {
"type": "string",
"enum": ["studio", "realistic"]
},
"voiceCloningSettings": {
"type": "object",
"properties": {
"stability": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"similarity": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": ["stability", "similarity"],
"additionalProperties": false
},
"subtitles": {
"type": "object",
"properties": {
"isEnable": {
"type": "boolean"
},
"source": {
"type": "string",
"enum": ["original", "translated"]
}
},
"required": ["isEnable", "source"],
"additionalProperties": false
}
},
"additionalProperties": false
}
},
"required": ["projectId", "changes"],
"additionalProperties": false
}
Idempotencja
Dla każdej operacji zmieniającej dane użyj UUID v4 w requestId lub w nagłówku HTTP Idempotency-Key. Po awarii sieci użyj ponownie tego samego identyfikatora i identycznych argumentów. Jeśli podasz oba, muszą być zgodne. Ponowienie zapisanego żądania nie powtarza operacji ani nie zużywa kolejnego wywołania z miesięcznego limitu. Żądania zakończone błędem lub przerwane nie są automatycznie uruchamiane ponownie. Każda operacja zmieniająca dane może zwrócić HTTP 202, gdy ponowienie napotka to samo żądanie nadal w stanie running, nawet jeśli jej pierwsze wykonanie zwykle jest synchroniczne. Jeśli wykonanie się zakończyło, ale resultStored ma wartość false, ponowienie zwraca HTTP 200 z zapisanym stanem żądania zamiast pierwotnego wyniku. Pobierz wynik za pomocą akcji historii, wyniku lub pobierania właściwej dla danej domeny.Przykłady żądań
Zastąp przykładowe identyfikatory zasobów i klucze multimediów wartościami zwróconymi dla Twojego konta. Przy ponawianiu tej samej operacji zmieniającej dane zachowaj identyfikator żądania.curl --request POST 'https://api.voicecheap.ai/v1/actions/projects_update' \
--header "x-api-key: $VOICECHEAP_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"projectId":"project_launch_2026","requestId":"41321bda-e243-4b6f-96a4-622cd047c991","changes":{"projectName":"Product launch — English","translationInstructions":"Keep product names unchanged.","keepBackgroundMusic":true,"subtitles":{"isEnable":true,"source":"translated"}}}'
const input = {
projectId: 'project_launch_2026',
requestId: '41321bda-e243-4b6f-96a4-622cd047c991',
changes: {
projectName: 'Product launch — English',
translationInstructions: 'Keep product names unchanged.',
keepBackgroundMusic: true,
subtitles: {
isEnable: true,
source: 'translated',
},
},
};
const response = await fetch('https://api.voicecheap.ai/v1/actions/projects_update', {
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_update",
headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
json={"projectId": "project_launch_2026", "requestId": "41321bda-e243-4b6f-96a4-622cd047c991", "changes": {"projectName": "Product launch — English", "translationInstructions": "Keep product names unchanged.", "keepBackgroundMusic": True, "subtitles": {"isEnable": True, "source": "translated"}}},
timeout=120,
)
body = response.json()
if not response.ok:
raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
print(body)
Odpowiedź
Pierwsze pomyślne wykonanie zwraca HTTP 200 z wynikiem operacji w data. Ponowienie może zamiast tego zwrócić zapisany stan żądania. Przykład przedstawia jedną obsługiwaną odpowiedź, bez wszystkich opcjonalnych pól. Zwraca odświeżone publiczne szczegóły projektu po zaktualizowaniu jawnie podanych ustawień klienta.{
"data": {
"projectId": "project_launch_2026",
"projectName": "Product launch — English",
"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": "Keep product names unchanged.",
"isReadyForDubbing": true,
"settings": {
"voiceCloning": true,
"customVoice": false,
"customVoiceId": "",
"keepBackgroundMusic": true,
"keepOriginalVoice": false,
"originalVoiceVolume": 30,
"activeSpeakerDetectionEnabled": false,
"subtitles": {
"isEnable": true,
"source": "translated"
},
"smartSync": true,
"voiceIsolatorOption": "studio",
"voiceCloningSettings": {
"stability": 0.5,
"similarity": 0.75
}
}
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
{
"data": {
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
"operation": "projects_update",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"status": "running",
"pollAfterSeconds": 5
},
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991"
}
{
"data": {
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
"operation": "projects_update",
"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"
}
Pola wyniku
| Pole | Opis |
|---|---|
data.projectId | Identyfikator dostępnego projektu. |
data.projectName | Nazwa projektu widoczna dla klienta. |
data.status | Podsumowanie projektu: processing, success lub failed. |
data.workflow | transcription dla projektów obejmujących wyłącznie transkrypcję; translation dla projektów dubbingowych. |
data.originalVideoUrl | Pierwotnie zapisany adres URL multimediów, również dla projektów audio; pusty ciąg znaków, jeśli go nie ma. |
data.originalLanguage | Wykryty lub wybrany język źródłowy; unknown, gdy niedostępny. |
data.targetLanguages | Tablica nazw języków docelowych. |
data.duration | Czas trwania oryginalnych multimediów w sekundach. |
data.createdAt | Czas utworzenia projektu w milisekundach czasu Unix. |
data.progress | Publiczny etap transkrypcji, opcjonalne transcriptionProgress i transcriptionStatus. |
data.translations | Wszystkie przetłumaczone wersje ze wszystkich wersji językowych, uporządkowane od najnowszych według ujednoliconego createdAt. |
data.segmentStructureRevision | Bieżąca rewizja struktury segmentów źródłowych, domyślnie 0. Przekaż tę wartość jako expectedSegmentStructureRevision do segments_delete lub segments_merge. |
data.numberOfSpeakers | Zapisana liczba mówców w źródle, jeśli jest dostępna. |
data.translationInstructions | Bieżące instrukcje tłumaczenia projektu; pusty ciąg znaków, gdy nie zapisano żadnych. |
data.isReadyForDubbing | true tylko wtedy, gdy zapisany projekt jest oznaczony jako gotowy do dubbingu. |
data.settings | Opcjonalne ustawienia klienta wybrane z ustawień dubbingu projektu lub starszych ustawień. Zwracane są tylko zapisane pola; nieobecne wartości opcjonalne są pomijane. |
data.settings.voiceCloning | Opcjonalna preferencja klonowania głosu w projekcie. |
data.settings.customVoice | Opcjonalna preferencja własnego głosu. |
data.settings.customVoiceId | Opcjonalny identyfikator własnego głosu. |
data.settings.keepBackgroundMusic | Opcjonalna preferencja dźwięku w tle. |
data.settings.keepOriginalVoice | Opcjonalna preferencja oryginalnej mowy. |
data.settings.originalVoiceVolume | Opcjonalna głośność oryginalnej mowy. |
data.settings.activeSpeakerDetectionEnabled | Opcjonalna preferencja wykrywania aktywnego mówcy. |
data.settings.subtitles | Opcjonalna preferencja napisów {isEnable,source}. |
data.settings.smartSync | Opcjonalna preferencja SmartSync. |
data.settings.voiceIsolatorOption | Opcjonalna preferencja izolacji głosu studio lub realistic. |
data.settings.voiceCloningSettings | Opcjonalne preferencje klonowania głosu {stability,similarity}. |
data.error | Opcjonalne publiczne {code,message} dla błędu przetwarzania na poziomie projektu. |
data.translations[].workId | Identyfikator wersji językowej zawierającej tę wersję. |
data.translations[].translatedVersionId | Identyfikator określonej wersji wyniku dubbingu. |
data.translations[].targetLanguage | Język docelowy wersji, z użyciem języka jej wersji językowej jako wartości zastępczej. |
data.translations[].status | Zapisany stan wersji: not-started, in-progress, completed lub failed. |
data.translations[].currentStep | Opcjonalny etap procesu dubbingu; progress to opcjonalna liczbowa wartość postępu. |
data.translations[].progress | Opcjonalna wartość postępu dubbingu. |
data.translations[].createdAt | Czas utworzenia ujednolicony do milisekund Unix; w razie braku używany jest czas utworzenia wersji językowej. |
data.translations[].completedAt | Opcjonalny czas ukończenia w milisekundach Unix. |
data.translations[].failedAt | Opcjonalny czas niepowodzenia w milisekundach Unix. |
data.translations[].timedOutAt | Opcjonalny czas przekroczenia limitu czasu w milisekundach Unix. |
data.translations[].translatedVideoUrl | Zapisany adres URL przetłumaczonego wideo lub pusty ciąg znaków, gdy jest niedostępny. |
data.translations[].translatedAudioUrl | Zapisany adres URL przetłumaczonego audio lub pusty ciąg znaków, gdy jest niedostępny. |
data.translations[].error | Opcjonalne {code,message}, gdy wersja zakończyła się błędem. |
data.translations[].settings | Publiczne ustawienia wersji: voiceCloning, uploadType, keepBackgroundMusic, keepOriginalVoice, originalVoiceVolume, subtitles, smartSync, dubbingMode, voiceIsolatorOption oraz opcjonalne translationQualityMode, cutBecauseFreeUser, originalDurationSeconds, cutDurationSeconds, voiceCloningSettings. |
data.translations[].settings.dubbingMode | translate lub dub-only. SmartSync ma wartość false dla wersji dub-only. |
data.translations[].lipSync | Opcjonalne {latest,history}; każdy wpis zawiera jobId, status, videoUrl, errorMessage, type, createdAt oraz opcjonalne requestedAt, retryRequestedAt, completedAt, failedAt, timedOutAt, activeSpeakerDetectionEnabled, isRetried. Czasy synchronizacji ruchu ust są zapisanymi ciągami znaków ISO. |
data.translations[].dynamicSubtitles | Opcjonalny obiekt z used, inProgress, magicZooms, magicBrolls, magicBrollsPercentage, videoUrl, errorMessage oraz opcjonalnymi removeSilencePace, removeBadTakes, templateName, requestedAt, rerunCount. requestedAt to czas Unix w milisekundach. |
data.translations[].publicationAttempts | Opcjonalna tablica publicznych prób publikacji: id, status, origin oraz opcjonalnie scheduledAt, processingStartedAt, publishedAt, failedAt, privacyStatus, url, videoId, errorMessage. |
data.translations[].publishedVideos | Opcjonalna tablica z type, videoId, privacyStatus oraz opcjonalnymi url, datePublished, origin, scheduledAt, plannedPublicationId. |
Odzyskaj żądanie i sprawdź jego stan
Używaj tego samego identyfikatora także po utracie połączenia. Jeśli resultStored ma wartość false, pobierz wynik za pomocą odpowiedniej akcji historii, wyniku lub pobierania. Nigdy nie uruchamiaj drugiego generowania tylko po to, aby sprawdzić postęp.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":"projects_update"}'
HTTP 200
{
"data": {
"requestId": "41321bda-e243-4b6f-96a4-622cd047c991",
"operation": "projects_update",
"status": "completed",
"createdAt": 1792144800000,
"updatedAt": 1792144820000,
"resultStored": true,
"result": {
"projectId": "project_launch_2026",
"projectName": "Product launch — English",
"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": "Keep product names unchanged.",
"isReadyForDubbing": true,
"settings": {
"voiceCloning": true,
"customVoice": false,
"customVoiceId": "",
"keepBackgroundMusic": true,
"keepOriginalVoice": false,
"originalVoiceVolume": 30,
"activeSpeakerDetectionEnabled": false,
"subtitles": {
"isEnable": true,
"source": "translated"
},
"smartSync": true,
"voiceIsolatorOption": "studio",
"voiceCloningSettings": {
"stability": 0.5,
"similarity": 0.75
}
}
}
}
}
Uwagi do operacji
- changes musi zawierać co najmniej jedno obsługiwane pole. Właściwości niewymienione na liście są odrzucane. Pominięte pola pozostają bez zmian.
- Obiekt changes obsługuje projectName, translationInstructions, isReadyForDubbing, voiceCloning, keepBackgroundMusic, keepOriginalVoice, originalVoiceVolume, activeSpeakerDetectionEnabled, smartSync, voiceIsolatorOption, voiceCloningSettings i subtitles.
- originalVoiceVolume mieści się w zakresie od 1 do 70. voiceCloningSettings musi zawierać zarówno stability, jak i similarity w zakresie od 0 do 1; subtitles musi zawierać zarówno isEnable, jak i source.
- Aktualizuje preferencje i gotowość do korekty; samo w sobie nie generuje ponownie wcześniej ukończonych multimediów. Wynik używa tego samego publicznego zestawu pól co projects_get.
- Zapisane błędy zwracają kody błędów VoiceCheap i stałe komunikaty. Użyj kodu i aktualnego stanu zasobu, aby zdecydować, jak wznowić działanie.
Wykorzystanie
Każde pomyślne wywołanie zużywa jedno wywołanie z miesięcznego limitu API/MCP. Obowiązują również kredyty na multimedia oraz limity generowania danej operacji.Błędy
| Status HTTP | Kod | Znaczenie lub sposób rozwiązania |
|---|---|---|
| 400 | CREDENTIAL_IN_QUERY | Dane uwierzytelniające zostały podane w parametrze zapytania access_token lub api_key. Wysyłaj dane uwierzytelniające w nagłówkach. |
| 400 | IDEMPOTENCY_CONFLICT | Nagłówek Idempotency-Key i pole requestId w treści żądania muszą być zgodne. |
| 400 | INVALID_REQUEST_ID | Podaj requestId lub Idempotency-Key w formacie UUID v4. |
| 400 | VALIDATION_ERROR | Popraw dane wejściowe zgodnie ze schematem. Nieprawidłowe lub niespójne wartości są odrzucane przed wykonaniem. |
| 401 | API_KEY_EXPIRED | Klucz API wygasł. |
| 401 | INVALID_API_KEY | Podaj prawidłowy, niewygasły klucz API. |
| 401 | INVALID_CREDENTIAL | Nagłówek Authorization ma nieprawidłowy format lub jest sprzeczny z x-api-key. |
| 401 | MISSING_CREDENTIAL | Nie podano użytecznych danych uwierzytelniających w nagłówku lub przekroczyły one 4096 znaków. |
| 401 | USER_NOT_FOUND | Konto powiązane z poświadczeniem już nie istnieje. |
| 403 | ACCOUNT_UNAVAILABLE | Konto wykonujące operację lub konto rozliczeniowe jest niedostępne albo jest w trakcie usuwania. |
| 403 | AMBIGUOUS_TEAM_API_KEY | Użytkownik, do którego należą dane uwierzytelniające, należy do więcej niż jednego zespołu, więc kontekst rozliczeniowy jest niejednoznaczny. |
| 403 | FORBIDDEN | Uwierzytelniony podmiot wykonujący akcję nie ma dostępu do tego projektu. |
| 403 | INSUFFICIENT_SCOPE | Nadaj wszystkie wymagane uprawnienia lub wybierz inne dane uwierzytelniające. |
| 403 | INTEGRATION_PLAN_UNSUPPORTED | Nie udało się zweryfikować limitów integracji konta. |
| 403 | SUBSCRIPTION_REQUIRED | Użyj aktywnej płatnej subskrypcji. |
| 403 | TEAM_OWNER_NOT_FOUND | Nie znaleziono konta faktycznego właściciela zespołu. |
| 404 | PROJECT_NOT_FOUND | Projekt nie istnieje na dostępnym koncie. |
| 409 | CONCURRENT_ACTION_LIMIT_REACHED | Na tym koncie działa już 10 akcji integracji. Sprawdzaj stan istniejącego żądania przed rozpoczęciem kolejnego. |
| 409 | IDEMPOTENCY_CONFLICT | Używaj ponownie identyfikatora wyłącznie z tą samą operacją i tymi samymi argumentami. |
| 429 | INTEGRATION_MONTHLY_LIMIT_REACHED | Poczekaj na odnowienie miesięcznego limitu lub zmień plan. |
| 429 | INTEGRATION_RATE_LIMIT_REACHED | Jeśli występuje nagłówek Retry-After, odczekaj wskazany czas i stosuj rosnące odstępy między ponowieniami. |
| 500 | INTERNAL_ERROR | Sprawdź stan zapisanego żądania i historię zasobu przed podjęciem decyzji o ponowieniu operacji zmieniającej dane. |
| 503 | ACTION_RESULT_UNAVAILABLE | Akcja została wykonana, ale nie udało się zapisać jej wyniku. Sprawdź zapisany stan żądania i historię zasobu przed rozpoczęciem nowego generowania. |
| 503 | SERVER_RESTARTING | Serwer jest uruchamiany ponownie. Spróbuj ponownie wkrótce i zachowaj ten sam identyfikator żądania dla operacji zmieniającej dane. |
{
"code": "INSUFFICIENT_SCOPE",
"message": "This credential does not permit the requested action.",
"status": 403,
"details": {
"requiredScopes": ["projects:write"]
}
}
Czy ta strona była pomocna?

