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

# Obtener el estado de procesamiento de un proyecto

> Consulta el progreso de la transcripción, la traducción y la sincronización labial, y recupera las URL de las salidas completadas.

Consulta el progreso de la transcripción, la traducción y la sincronización labial, y recupera las URL de las salidas completadas.

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

## Autenticación y permisos

<ParamField header="x-api-key" type="string" required>
  Envía una clave de API de VoiceCheap en esta cabecera. También se admite Authorization: Bearer con la misma clave de API. Los tokens de acceso OAuth
  solo se aceptan en MCP, no en este endpoint REST.
</ParamField>

Permisos necesarios: `projects:read`.

Se requiere una suscripción de pago activa. Los permisos no cambian los roles del equipo, la propiedad de los recursos, los créditos multimedia ni los límites del plan.

## Parámetros

<ParamField body="projectId" type="string" required>
  Valor de texto.

  Longitud mínima: 1. Longitud máxima: 200. Patrón: `^[^/\\]+$`.
</ParamField>

<Accordion title="Esquema completo de entrada">
  El JSON Schema siguiente conserva los nombres exactos de los campos, los tipos anidados, los valores predeterminados, los límites y los valores aceptados que expone el descubrimiento. Las reglas adicionales entre campos se indican en las notas de la operación.

  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "projectId": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200,
        "pattern": "^[^/\\\\]+$"
      }
    },
    "required": ["projectId"],
    "additionalProperties": false
  }
  ```
</Accordion>

## Ejemplos de solicitud

Sustituye los identificadores de recursos y las claves multimedia de los ejemplos por valores devueltos para tu cuenta. Mantén el identificador de solicitud al reintentar la misma modificación.

<RequestExample>
  ```bash cURL theme={null}
  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"}'
  ```

  ```javascript JavaScript theme={null}
  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);
  ```

  ```python Python theme={null}
  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)
  ```
</RequestExample>

## Respuesta

Una primera ejecución correcta devuelve HTTP 200 con el resultado de la operación en data. Una repetición puede devolver el estado de la solicitud guardada en su lugar. El ejemplo muestra una respuesta admitida, no todos los campos opcionales.

Devuelve el progreso de procesamiento y las URL de las salidas completadas sin transcripciones incrustadas.

<ResponseExample>
  ```json HTTP 200 theme={null}
  {
    "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"
    }
  }
  ```
</ResponseExample>

## Campos del resultado

| Campo | Descripción |
| - | - |
| `data.projectId` | Identificador del proyecto principal. |
| `data.projectName` | Nombre del proyecto. |
| `data.originalVideoUrl` | URL original del contenido multimedia guardado o una cadena vacía. |
| `data.originalLanguage` | Idioma de origen o unknown. |
| `data.targetLanguage` | El primer idioma de destino configurado del proyecto, con english como valor predeterminado; no es una lista de todos los trabajos de idioma. |
| `data.duration` | Duración del contenido multimedia en segundos. |
| `data.createdAt` | Momento de creación del proyecto en milisegundos Unix. |
| `data.workflow` | transcription o translation. |
| `data.transcriptionStatus` | processing, success o failed. |
| `data.actualProgressStep` | Paso actual del proyecto, sustituido por el paso de doblaje cuando la transcripción ha terminado y el doblaje sigue activo. |
| `data.translationAndTranscriptionProgress` | Progreso de transcripción almacenado opcional. |
| `data.status` | processing, success o failed para el flujo de trabajo actual. |
| `data.workId` | Está presente cuando existe una última versión traducida en el trabajo de idioma más reciente. |
| `data.translatedVersionId` | Identificador de la última versión del trabajo de idioma más reciente. |
| `data.dubbingStep` | Paso opcional de doblaje de esa versión. |
| `data.dubbingProgress` | Progreso opcional del doblaje de esa versión. |
| `data.translatedVideoUrl` | Se incluye para una versión completada correctamente cuando existe una URL de vídeo. |
| `data.translatedAudioUrl` | Se incluye para una versión completada correctamente; es una cadena vacía cuando no hay ninguna URL de audio almacenada. |
| `data.lipSync` | Entrada opcional más reciente de sincronización labial con jobId, status, videoUrl, errorMessage, type público, createdAt y los campos opcionales requestedAt, completedAt, failedAt, timedOutAt, activeSpeakerDetectionEnabled. |
| `data.error` | \{code,message} público opcional cuando ha fallado el procesamiento del proyecto, la traducción o la sincronización labial. |

## Notas de la operación

* Usa esta acción para consultar el estado de projects\_create, translations\_create, translations\_start, translations\_dub y lipsync\_create. Obtén las transcripciones por separado con transcripts\_get.
* Esta consulta de estado autenticada y sujeta a un límite de frecuencia no consume la cuota mensual de llamadas a acciones.
* Para las traducciones, sigue el trabajo de idioma creado más recientemente y su última versión. Para obtener el estado completo de varios idiomas, consulta projects\_get o translations\_list.
* Un proyecto de solo transcripción tiene éxito cuando termina la transcripción. Una salida doblada completada puede permanecer en processing mientras la sincronización labial esté activa, o en failed si ha fallado su última sincronización labial.
* El controlador siempre elimina transcripts del resultado de estado subyacente. No tiene campos de finalización de subtítulos dinámicos; consulta projects\_get para obtenerlos.
* Los fallos guardados devuelven códigos de error de VoiceCheap y mensajes fijos. Use el código y el estado actual del recurso para decidir cómo recuperarse del error.

## Uso

Este control de estado o uso no consume la cuota mensual de llamadas de API/MCP. Siguen aplicándose la autenticación, el acceso de pago, la propiedad de los recursos y los límites de frecuencia.

## Errores

| Estado HTTP | Código | Significado o solución |
| - | - | - |
| 400 | `CREDENTIAL_IN_QUERY` | Se han proporcionado credenciales en un parámetro de consulta access\_token o api\_key. Envía las credenciales en las cabeceras. |
| 400 | `VALIDATION_ERROR` | Corrige la entrada según el esquema. Los valores no válidos o incoherentes se rechazan antes de la ejecución. |
| 401 | `API_KEY_EXPIRED` | La clave API ha caducado. |
| 401 | `INVALID_API_KEY` | Proporciona una clave de API válida que no haya caducado. |
| 401 | `INVALID_CREDENTIAL` | La cabecera Authorization tiene un formato incorrecto o entra en conflicto con x-api-key. |
| 401 | `MISSING_CREDENTIAL` | No se proporcionó ninguna credencial de cabecera utilizable o superaba 4096 caracteres. |
| 401 | `USER_NOT_FOUND` | La cuenta de la credencial ya no existe. |
| 403 | `AMBIGUOUS_TEAM_API_KEY` | El usuario de la credencial pertenece a más de un equipo, por lo que el contexto de facturación es ambiguo. |
| 403 | `FORBIDDEN` | El actor autenticado no puede acceder a este proyecto. |
| 403 | `INSUFFICIENT_SCOPE` | Concede todos los permisos necesarios o elige otra credencial. |
| 403 | `INTEGRATION_PLAN_UNSUPPORTED` | No se han podido verificar los límites de integración de la cuenta. |
| 403 | `SUBSCRIPTION_REQUIRED` | Usa una suscripción de pago activa. |
| 403 | `TEAM_OWNER_NOT_FOUND` | No se pudo encontrar la cuenta del propietario efectivo del equipo. |
| 404 | `PROJECT_NOT_FOUND` | El proyecto no existe en la cuenta accesible. |
| 429 | `INTEGRATION_RATE_LIMIT_REACHED` | Espera el tiempo indicado en Retry-After cuando esté presente y aplica esperas progresivas. |
| 500 | `INTERNAL_ERROR` | Comprueba el estado de la solicitud guardada y el historial del recurso antes de decidir si reintentas una modificación. |
| 503 | `SERVER_RESTARTING` | El servidor se está reiniciando. Reinténtalo en breve y conserva el mismo identificador de solicitud para una modificación. |

```json theme={null}
{
  "code": "INSUFFICIENT_SCOPE",
  "message": "This credential does not permit the requested action.",
  "status": 403,
  "details": {
    "requiredScopes": ["projects:read"]
  }
}
```


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