> ## 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 detalles del proyecto

> Recuperar detalles públicos del proyecto, historial de versiones traducidas e historial de sincronización labial

# Obtener detalles del proyecto

Recuperar una vista pública normalizada de un proyecto. Utilice este endpoint cuando necesite el historial de versiones traducidas, el historial de sincronización labial, el estado de los subtítulos dinámicos o el estado de publicación.

Para sondeos frecuentes, siga utilizando [Obtener estado de traducción](/docs/es/api-reference/translation-status). Este endpoint es más completo e intencionalmente devuelve más datos.

## Solicitud

### Encabezados

<ParamField header="x-api-key" type="string" required>
  Su clave de API VoiceCheap. Obtenga una en [app.voicecheap.ai/page-api](https://app.voicecheap.ai/page-api).
</ParamField>

### Parámetros de ruta

<ParamField path="projectId" type="string" required>
  El identificador único del proyecto devuelto desde [Crear proyecto](/docs/es/api-reference/create-project) o [Iniciar traducción](/docs/es/api-reference/translate).
</ParamField>

## Respuesta

<ResponseField name="projectId" type="string" required>
  El identificador único del proyecto.
</ResponseField>

<ResponseField name="projectName" type="string" required>
  El nombre del proyecto.
</ResponseField>

<ResponseField name="status" type="string" required>
  Estado público del proyecto: `processing`, `success` o `failed`.
</ResponseField>

<ResponseField name="workflow" type="string" required>
  Flujo de trabajo de API: `translation` o `transcription`. Los flujos de trabajo de transcripción alcanzan el éxito cuando finaliza la transcripción de origen.
</ResponseField>

<ResponseField name="originalVideoUrl" type="string" required>
  URL del archivo de video o audio original cargado.
</ResponseField>

<ResponseField name="originalLanguage" type="string" required>
  El idioma original detectado o especificado.
</ResponseField>

<ResponseField name="targetLanguages" type="string[]" required>
  Idiomas de destino asociados con el proyecto.
</ResponseField>

<ResponseField name="duration" type="number" required>
  Duración del contenido en segundos.
</ResponseField>

<ResponseField name="createdAt" type="number" required>
  Marca de tiempo Unix de cuando se creó el proyecto.
</ResponseField>

<ResponseField name="progress" type="object" required>
  Progreso actual a nivel de proyecto.

  <Expandable title="propiedades de progreso">
    <ResponseField name="progress.step" type="string">
      Paso actual de creación o transcripción del proyecto.
    </ResponseField>

    <ResponseField name="progress.transcriptionProgress" type="number">
      Porcentaje aproximado de progreso de creación/transcripción del proyecto.
    </ResponseField>

    <ResponseField name="progress.transcriptionStatus" type="string" required>
      Estado de la transcripción de origen: `processing`, `success` o `failed`.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="translations" type="array" required>
  Historial de versiones traducidas, ordenado con la versión más reciente primero.

  <Expandable title="propiedades de traducción">
    <ResponseField name="translations[].workId" type="string">
      Identificador del trabajo de traducción.
    </ResponseField>

    <ResponseField name="translations[].translatedVersionId" type="string">
      Identificador de la versión traducida.
    </ResponseField>

    <ResponseField name="translations[].targetLanguage" type="string">
      Idioma de destino para esta versión.
    </ResponseField>

    <ResponseField name="translations[].status" type="string">
      Estado de la versión de traducción: `in-progress`, `completed`, `not-started` o `failed`.
    </ResponseField>

    <ResponseField name="translations[].currentStep" type="string">
      Paso actual de doblaje para esta versión.
    </ResponseField>

    <ResponseField name="translations[].progress" type="number">
      Porcentaje aproximado de progreso de doblaje.
    </ResponseField>

    <ResponseField name="translations[].createdAt" type="number">
      Marca de tiempo de cuando se creó esta versión traducida.
    </ResponseField>

    <ResponseField name="translations[].completedAt" type="number">
      Marca de tiempo de finalización cuando esté disponible.
    </ResponseField>

    <ResponseField name="translations[].failedAt" type="number">
      Marca de tiempo de fallo cuando esté disponible.
    </ResponseField>

    <ResponseField name="translations[].timedOutAt" type="number">
      Marca de tiempo de tiempo de espera cuando esté disponible.
    </ResponseField>

    <ResponseField name="translations[].translatedVideoUrl" type="string">
      URL del video traducido.
    </ResponseField>

    <ResponseField name="translations[].translatedAudioUrl" type="string">
      URL del audio traducido.
    </ResponseField>

    <ResponseField name="translations[].settings" type="object">
      Configuraciones públicas utilizadas para la versión traducida, tales como subtítulos, SmartSync, audio de fondo y modo de calidad.
    </ResponseField>

    <ResponseField name="translations[].error" type="object">
      Código de error y mensaje cuando la versión traducida falló.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="translations[].lipSync" type="object">
  Historial de sincronización labial para la versión traducida, solo presente cuando se ha solicitado la sincronización labial.

  <Expandable title="propiedades de lipSync">
    <ResponseField name="translations[].lipSync.latest" type="object">
      Último intento de sincronización labial.
    </ResponseField>

    <ResponseField name="translations[].lipSync.history" type="array">
      Todos los intentos de sincronización labial para esta versión traducida, en orden de creación.
    </ResponseField>

    <ResponseField name="translations[].lipSync.history[].jobId" type="string">
      Identificador del trabajo de sincronización labial.
    </ResponseField>

    <ResponseField name="translations[].lipSync.history[].status" type="string">
      Estado de la sincronización labial: `PENDING`, `PROCESSING`, `COMPLETED`, `FAILED`, `REJECTED` o `CANCELED`.
    </ResponseField>

    <ResponseField name="translations[].lipSync.history[].videoUrl" type="string">
      URL del video con sincronización labial cuando se completa.
    </ResponseField>

    <ResponseField name="translations[].lipSync.history[].type" type="string">
      Modo de sincronización labial: `standard`, `pro` o `studio`.
    </ResponseField>

    <ResponseField name="translations[].lipSync.history[].activeSpeakerDetectionEnabled" type="boolean">
      Si la detección de hablante activo estaba habilitada para este intento.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="translations[].dynamicSubtitles" type="object">
  Estado de los subtítulos dinámicos cuando están disponibles.
</ResponseField>

<ResponseField name="translations[].publicationAttempts" type="array">
  Estado del intento de publicación pública cuando está disponible.
</ResponseField>

<ResponseField name="translations[].publishedVideos" type="array">
  Referencias de video publicado públicamente cuando están disponibles.
</ResponseField>

## Ejemplo

```bash cURL theme={null}
curl -X GET "https://api.voicecheap.ai/v1/projects/abc123-def456-ghi789" \
  -H "x-api-key: vc_your-api-key"
```

```json Response theme={null}
{
  "projectId": "abc123-def456-ghi789",
  "projectName": "Launch Demo",
  "status": "success",
  "workflow": "translation",
  "originalVideoUrl": "https://storage.example.com/input.mp4",
  "originalLanguage": "en",
  "targetLanguages": ["french"],
  "duration": 120,
  "createdAt": 1791280000000,
  "progress": {
    "step": "done",
    "transcriptionProgress": 100,
    "transcriptionStatus": "success"
  },
  "translations": [
    {
      "workId": "work_123",
      "translatedVersionId": "version_456",
      "targetLanguage": "french",
      "status": "completed",
      "currentStep": "done",
      "progress": 100,
      "createdAt": 1791280200000,
      "completedAt": 1791280800000,
      "translatedVideoUrl": "https://storage.example.com/translated.mp4",
      "translatedAudioUrl": "https://storage.example.com/translated.mp3",
      "settings": {
        "voiceCloning": true,
        "uploadType": "video",
        "keepBackgroundMusic": true,
        "keepOriginalVoice": false,
        "originalVoiceVolume": 30,
        "subtitles": {
          "isEnable": true,
          "source": "translated"
        },
        "smartSync": true,
        "voiceIsolatorOption": "studio",
        "translationQualityMode": "max"
      },
      "lipSync": {
        "latest": {
          "jobId": "lip_789",
          "status": "COMPLETED",
          "videoUrl": "https://storage.example.com/lipsync.mp4",
          "errorMessage": null,
          "type": "pro",
          "createdAt": "2026-06-08T10:00:00.000Z",
          "completedAt": "2026-06-08T10:20:00.000Z",
          "activeSpeakerDetectionEnabled": true
        },
        "history": [
          {
            "jobId": "lip_789",
            "status": "COMPLETED",
            "videoUrl": "https://storage.example.com/lipsync.mp4",
            "errorMessage": null,
            "type": "pro",
            "createdAt": "2026-06-08T10:00:00.000Z",
            "completedAt": "2026-06-08T10:20:00.000Z",
            "activeSpeakerDetectionEnabled": true
          }
        ]
      }
    }
  ]
}
```

## Errores

| Estado | Código                | Descripción                               |
| ------ | --------------------- | ----------------------------------------- |
| 401    | `MISSING_API_KEY`     | Se requiere la clave API                  |
| 401    | `INVALID_API_KEY`     | La clave API proporcionada no es válida   |
| 403    | `FORBIDDEN`           | No tiene permiso para acceder al proyecto |
| 404    | `PROJECT_NOT_FOUND`   | El proyecto no existe                     |
| 429    | `RATE_LIMIT_EXCEEDED` | Demasiadas solicitudes                    |
| 500    | `INTERNAL_ERROR`      | Error inesperado del servidor             |
