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

# Get Project Details

> Retrieve public project details, translated version history, and lip-sync history

# Get Project Details

Retrieve a normalized public view of a project. Use this endpoint when you need translated version history, lip-sync history, dynamic subtitles state, or publishing state.

For frequent polling, keep using [Get Translation Status](/docs/api-reference/translation-status). This endpoint is richer and intentionally returns more data.

## Request

### Headers

<ParamField header="x-api-key" type="string" required>
  Your VoiceCheap API key. Get one from [app.voicecheap.ai/page-api](https://app.voicecheap.ai/page-api).
</ParamField>

### Path Parameters

<ParamField path="projectId" type="string" required>
  The unique identifier of the project returned from [Create Project](/docs/api-reference/create-project) or [Start Translation](/docs/api-reference/translate).
</ParamField>

## Response

<ResponseField name="projectId" type="string" required>
  The unique identifier of the project.
</ResponseField>

<ResponseField name="projectName" type="string" required>
  The project name.
</ResponseField>

<ResponseField name="status" type="string" required>
  Public project status: `processing`, `success`, or `failed`.
</ResponseField>

<ResponseField name="originalVideoUrl" type="string" required>
  URL to the original uploaded video or audio file.
</ResponseField>

<ResponseField name="originalLanguage" type="string" required>
  The detected or specified original language.
</ResponseField>

<ResponseField name="targetLanguages" type="string[]" required>
  Target languages associated with the project.
</ResponseField>

<ResponseField name="duration" type="number" required>
  Duration of the content in seconds.
</ResponseField>

<ResponseField name="createdAt" type="number" required>
  Unix timestamp when the project was created.
</ResponseField>

<ResponseField name="progress" type="object" required>
  Current project-level progress.

  <Expandable title="progress properties">
    <ResponseField name="progress.step" type="string">
      Current project creation or transcription step.
    </ResponseField>

    <ResponseField name="progress.transcriptionProgress" type="number">
      Approximate project creation/transcription progress percentage.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="translations" type="array" required>
  Translated version history, sorted with the newest version first.

  <Expandable title="translation properties">
    <ResponseField name="translations[].workId" type="string">
      Translation work identifier.
    </ResponseField>

    <ResponseField name="translations[].translatedVersionId" type="string">
      Translated version identifier.
    </ResponseField>

    <ResponseField name="translations[].targetLanguage" type="string">
      Target language for this version.
    </ResponseField>

    <ResponseField name="translations[].status" type="string">
      Translation version status: `in-progress`, `completed`, `not-started`, or `failed`.
    </ResponseField>

    <ResponseField name="translations[].currentStep" type="string">
      Current dubbing step for this version.
    </ResponseField>

    <ResponseField name="translations[].progress" type="number">
      Approximate dubbing progress percentage.
    </ResponseField>

    <ResponseField name="translations[].createdAt" type="number">
      Timestamp when this translated version was created.
    </ResponseField>

    <ResponseField name="translations[].completedAt" type="number">
      Completion timestamp when available.
    </ResponseField>

    <ResponseField name="translations[].failedAt" type="number">
      Failure timestamp when available.
    </ResponseField>

    <ResponseField name="translations[].timedOutAt" type="number">
      Timeout timestamp when available.
    </ResponseField>

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

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

    <ResponseField name="translations[].settings" type="object">
      Public settings used for the translated version, such as subtitles, SmartSync, background audio, and quality mode.
    </ResponseField>

    <ResponseField name="translations[].error" type="object">
      Error code and message when the translated version failed.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="translations[].lipSync" type="object">
  Lip-sync history for the translated version, only present when lip-sync has been requested.

  <Expandable title="lipSync properties">
    <ResponseField name="translations[].lipSync.latest" type="object">
      Latest lip-sync attempt.
    </ResponseField>

    <ResponseField name="translations[].lipSync.history" type="array">
      All lip-sync attempts for this translated version, in creation order.
    </ResponseField>

    <ResponseField name="translations[].lipSync.history[].jobId" type="string">
      Lip-sync job identifier.
    </ResponseField>

    <ResponseField name="translations[].lipSync.history[].status" type="string">
      Lip-sync status: `PENDING`, `PROCESSING`, `COMPLETED`, `FAILED`, `REJECTED`, or `CANCELED`.
    </ResponseField>

    <ResponseField name="translations[].lipSync.history[].videoUrl" type="string">
      Lip-synced video URL when completed.
    </ResponseField>

    <ResponseField name="translations[].lipSync.history[].type" type="string">
      Lip-sync mode: `standard`, `pro`, or `pro_2`.
    </ResponseField>

    <ResponseField name="translations[].lipSync.history[].activeSpeakerDetectionEnabled" type="boolean">
      Whether active speaker detection was enabled for this attempt.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="translations[].dynamicSubtitles" type="object">
  Dynamic subtitles state when available.
</ResponseField>

<ResponseField name="translations[].publicationAttempts" type="array">
  Public publishing attempt state when available.
</ResponseField>

<ResponseField name="translations[].publishedVideos" type="array">
  Public published video references when available.
</ResponseField>

## Example

```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",
  "originalVideoUrl": "https://storage.example.com/input.mp4",
  "originalLanguage": "en",
  "targetLanguages": ["french"],
  "duration": 120,
  "createdAt": 1791280000000,
  "progress": {
    "step": "done",
    "transcriptionProgress": 100
  },
  "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
          }
        ]
      }
    }
  ]
}
```

## Errors

| Status | Code                  | Description                                      |
| ------ | --------------------- | ------------------------------------------------ |
| 401    | `MISSING_API_KEY`     | API key is required                              |
| 401    | `INVALID_API_KEY`     | The provided API key is invalid                  |
| 403    | `FORBIDDEN`           | You do not have permission to access the project |
| 404    | `PROJECT_NOT_FOUND`   | The project does not exist                       |
| 429    | `RATE_LIMIT_EXCEEDED` | Too many requests                                |
| 500    | `INTERNAL_ERROR`      | Unexpected server error                          |
