curl --request POST 'https://api.voicecheap.ai/v1/actions/projects_status' \
--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_status', {
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_status",
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",
"originalVideoUrl": "https://media.example.com/launch/original.mp4",
"originalLanguage": "fr",
"targetLanguage": "english",
"duration": 75,
"createdAt": 1792152000000,
"workflow": "translation",
"transcriptionStatus": "success",
"actualProgressStep": "done",
"translationAndTranscriptionProgress": 100,
"workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24",
"translatedVersionId": "0fa684f3-4997-4d7a-9424-16d1f9ac849c",
"dubbingStep": "done",
"dubbingProgress": 100,
"status": "success",
"translatedVideoUrl": "https://media.example.com/launch/english.mp4",
"translatedAudioUrl": "https://media.example.com/launch/english.mp3"
}
}
Projets
Consulter le statut de traitement d’un projet
Suivez l’avancement de la transcription, de la traduction et de la synchronisation labiale, puis récupérez les URL des résultats terminés.
POST
/
v1
/
actions
/
projects_status
curl --request POST 'https://api.voicecheap.ai/v1/actions/projects_status' \
--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_status', {
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_status",
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",
"originalVideoUrl": "https://media.example.com/launch/original.mp4",
"originalLanguage": "fr",
"targetLanguage": "english",
"duration": 75,
"createdAt": 1792152000000,
"workflow": "translation",
"transcriptionStatus": "success",
"actualProgressStep": "done",
"translationAndTranscriptionProgress": 100,
"workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24",
"translatedVersionId": "0fa684f3-4997-4d7a-9424-16d1f9ac849c",
"dubbingStep": "done",
"dubbingProgress": 100,
"status": "success",
"translatedVideoUrl": "https://media.example.com/launch/english.mp4",
"translatedAudioUrl": "https://media.example.com/launch/english.mp3"
}
}
Suivez l’avancement de la transcription, de la traduction et de la synchronisation labiale, puis récupérez les URL des résultats terminés.
Autorisations requises:
POST https://api.voicecheap.ai/v1/actions/projects_status
Authentification et autorisations
string
requis
Envoyez une clé API VoiceCheap dans cet en-tête. Authorization: Bearer avec la même clé API est également accepté. Les jetons d’accès OAuth sont
acceptés uniquement par MCP, pas par cet endpoint REST.
projects:read.
Un abonnement payant actif est requis. Les autorisations ne modifient ni les rôles dans l’équipe, ni la propriété des ressources, ni les crédits média, ni les limites du forfait.
Paramètres
string
requis
Valeur textuelle.Longueur minimale: 1. Longueur maximale: 200. Motif:
^[^/\\]+$.Schéma d’entrée complet
Schéma d’entrée complet
Le JSON Schema ci-dessous conserve les noms de champs exacts, les types imbriqués, les valeurs par défaut, les limites et les valeurs acceptées exposés par la découverte. Les règles supplémentaires entre champs figurent dans les notes de l’opération.
{
"type": "object",
"properties": {
"projectId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[^/\\\\]+$"
}
},
"required": ["projectId"],
"additionalProperties": false
}
Exemples de requêtes
Remplacez les exemples d’identifiants de ressources et de clés média par des valeurs renvoyées pour votre compte. Conservez le même identifiant de requête lorsque vous réessayez la même mutation.curl --request POST 'https://api.voicecheap.ai/v1/actions/projects_status' \
--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_status', {
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_status",
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)
Réponse
Une première exécution réussie renvoie HTTP 200 avec le résultat de l’opération sous data. Une nouvelle tentative peut renvoyer à la place l’état de la requête enregistrée. L’exemple présente une réponse possible, sans tous les champs facultatifs. Renvoie la progression du traitement et les URL des sorties terminées, sans inclure les transcriptions.{
"data": {
"projectId": "project_launch_2026",
"projectName": "Product launch",
"originalVideoUrl": "https://media.example.com/launch/original.mp4",
"originalLanguage": "fr",
"targetLanguage": "english",
"duration": 75,
"createdAt": 1792152000000,
"workflow": "translation",
"transcriptionStatus": "success",
"actualProgressStep": "done",
"translationAndTranscriptionProgress": 100,
"workId": "5f8423d1-e4c0-4f80-9e3f-eed959389e24",
"translatedVersionId": "0fa684f3-4997-4d7a-9424-16d1f9ac849c",
"dubbingStep": "done",
"dubbingProgress": 100,
"status": "success",
"translatedVideoUrl": "https://media.example.com/launch/english.mp4",
"translatedAudioUrl": "https://media.example.com/launch/english.mp3"
}
}
Champs du résultat
| Champ | Description |
|---|---|
data.projectId | Identifiant du projet parent. |
data.projectName | Nom du projet. |
data.originalVideoUrl | URL du média d’origine enregistrée ou chaîne vide. |
data.originalLanguage | Langue source ou unknown. |
data.targetLanguage | Première langue cible configurée du projet, english par défaut ; il ne s’agit pas de la liste de tous les travaux de traduction. |
data.duration | Durée du média en secondes. |
data.createdAt | Date de création du projet en millisecondes Unix. |
data.workflow | transcription ou translation. |
data.transcriptionStatus | processing, success ou failed. |
data.actualProgressStep | Étape actuelle du projet, remplacée par l’étape de doublage lorsque la transcription est terminée et que le doublage reste actif. |
data.translationAndTranscriptionProgress | Progression de transcription enregistrée facultative. |
data.status | processing, success ou failed pour le traitement actuel. |
data.workId | Présent lorsqu’une dernière version traduite existe dans le travail de traduction le plus récent. |
data.translatedVersionId | Identifiant de la dernière version dans le travail de traduction le plus récent. |
data.dubbingStep | Étape facultative de doublage de cette version. |
data.dubbingProgress | Progression facultative du doublage de cette version. |
data.translatedVideoUrl | Inclus pour une version terminée avec succès lorsqu’une URL vidéo existe. |
data.translatedAudioUrl | Inclus pour une version terminée avec succès ; chaîne vide lorsqu’aucune URL audio n’est enregistrée. |
data.lipSync | Entrée facultative de synchronisation labiale la plus récente avec jobId, status, videoUrl, errorMessage, le champ public type, createdAt et, éventuellement, requestedAt, completedAt, failedAt, timedOutAt, activeSpeakerDetectionEnabled. |
data.error | Objet public {code,message} facultatif en cas d’échec du traitement du projet, de la traduction ou de la synchronisation labiale. |
Notes de l’opération
- Utilisez cette action pour suivre projects_create, translations_create, translations_start, translations_dub et lipsync_create par interrogations répétées. Récupérez les transcriptions séparément avec transcripts_get.
- Cette lecture d’état authentifiée et soumise à une limite de fréquence ne consomme pas le quota mensuel d’appels d’actions.
- Pour les traductions, suit le travail de traduction créé le plus récemment et sa dernière version. Pour obtenir l’état complet dans toutes les langues, consultez projects_get ou translations_list.
- Un projet de transcription seule réussit lorsque la transcription est terminée. Une sortie de doublage terminée peut rester à l’état processing pendant la synchronisation labiale, ou passer à failed si sa dernière synchronisation labiale a échoué.
- Le gestionnaire supprime toujours transcripts du résultat de statut sous-jacent. Il ne possède aucun champ de finalisation des sous-titres dynamiques ; interrogez projects_get pour les obtenir.
- Les échecs enregistrés renvoient des codes d’erreur VoiceCheap et des messages fixes. Utilisez le code et l’état actuel de la ressource pour choisir comment reprendre.
Utilisation
Cette vérification de statut ou d’utilisation ne consomme pas le quota mensuel d’appels API/MCP. L’authentification, l’accès payant, la propriété et les limites de débit restent applicables.Erreurs
| Statut HTTP | Code | Signification ou solution |
|---|---|---|
| 400 | CREDENTIAL_IN_QUERY | Des identifiants ont été fournis dans un paramètre de requête access_token ou api_key. Envoyez les identifiants dans les en-têtes. |
| 400 | VALIDATION_ERROR | Corrigez l’entrée à l’aide du schéma. Les valeurs invalides ou incohérentes sont refusées avant l’exécution. |
| 401 | API_KEY_EXPIRED | La clé API a expiré. |
| 401 | INVALID_API_KEY | Fournissez une clé API valide et non expirée. |
| 401 | INVALID_CREDENTIAL | L’en-tête Authorization est mal formé ou entre en conflit avec x-api-key. |
| 401 | MISSING_CREDENTIAL | Aucun identifiant d’authentification utilisable n’a été fourni dans les en-têtes, ou il dépassait 4096 caractères. |
| 401 | USER_NOT_FOUND | Le compte associé à l’identifiant d’accès n’existe plus. |
| 403 | AMBIGUOUS_TEAM_API_KEY | L’utilisateur associé aux identifiants d’authentification appartient à plusieurs équipes, ce qui rend le contexte de facturation ambigu. |
| 403 | FORBIDDEN | L’appelant authentifié ne peut pas accéder à ce projet. |
| 403 | INSUFFICIENT_SCOPE | Accordez toutes les autorisations requises ou choisissez d’autres identifiants d’accès. |
| 403 | INTEGRATION_PLAN_UNSUPPORTED | Les limites d’intégration du compte n’ont pas pu être vérifiées. |
| 403 | SUBSCRIPTION_REQUIRED | Utilisez un abonnement payant actif. |
| 403 | TEAM_OWNER_NOT_FOUND | Le compte du propriétaire effectif de l’équipe est introuvable. |
| 404 | PROJECT_NOT_FOUND | Le projet n’existe pas dans le compte accessible. |
| 429 | INTEGRATION_RATE_LIMIT_REACHED | Respectez Retry-After lorsqu’il est présent et espacez progressivement les nouvelles tentatives. |
| 500 | INTERNAL_ERROR | Vérifiez l’état de la requête enregistrée et l’historique de la ressource avant de décider de réessayer une mutation. |
| 503 | SERVER_RESTARTING | Le serveur redémarre. Réessayez dans un instant en conservant le même identifiant de requête pour une mutation. |
{
"code": "INSUFFICIENT_SCOPE",
"message": "This credential does not permit the requested action.",
"status": 403,
"details": {
"requiredScopes": ["projects:read"]
}
}
Cette page vous a-t-elle été utile ?

