> ## Documentation Index
> Fetch the complete documentation index at: https://docs.indigenius.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Create Studio

> Generate text-to-speech audio, transcribe speech, and dub video into other languages.

## Overview

Create Studio exposes three media generation capabilities:

* **Text-to-speech (TTS)** — convert written text to audio using your chosen voice
* **Speech-to-text (STT)** — transcribe an uploaded audio file
* **Dubbing** — translate and re-voice a video into another language, with optional lip-sync

TTS and dubbing jobs are **asynchronous** — you submit the job, get an ID, and poll for status. See the [polling pattern](#async-job-polling) below.

**Required scopes:** `create_studio:read` (read/list/status), `create_studio:write` (create/generate jobs)

***

## Voices

### `GET /v1/create-studio/available-voices`

Returns all voices available for TTS and dubbing.

<CodeGroup>
  ```bash Bash theme={null}
  curl https://api.indigenius.ai/v1/create-studio/available-voices \
    -H "X-API-Key: $INDIGENIUS_API_KEY"
  ```

  ```javascript Node theme={null}
  const response = await fetch(
    'https://api.indigenius.ai/v1/create-studio/available-voices',
    { headers: { 'X-API-Key': process.env.INDIGENIUS_API_KEY } },
  );
  console.log(await response.json());
  ```

  ```python Python theme={null}
  import requests, os

  response = requests.get(
      "https://api.indigenius.ai/v1/create-studio/available-voices",
      headers={"X-API-Key": os.environ["INDIGENIUS_API_KEY"]},
      timeout=30,
  )
  print(response.json())
  ```
</CodeGroup>

**Common errors:** `403` missing `create_studio:read` scope

***

## Text-to-speech

### `POST /v1/create-studio/text-to-speech`

Submits a TTS job. The job processes asynchronously — use `GET /v1/create-studio/text-to-speech/{id}` to check status.

<CodeGroup>
  ```bash Bash theme={null}
  curl -X POST https://api.indigenius.ai/v1/create-studio/text-to-speech \
    -H "X-API-Key: $INDIGENIUS_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "content": "Welcome to Indigenius",
      "speed": 1,
      "voiceId": "voice_001",
      "voiceName": "Sade",
      "voiceGender": "female",
      "provider": "indigenius_voice_model_1",
      "languageCode": "en",
      "language": "English"
    }'
  ```

  ```javascript Node theme={null}
  const response = await fetch(
    'https://api.indigenius.ai/v1/create-studio/text-to-speech',
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-API-Key': process.env.INDIGENIUS_API_KEY,
      },
      body: JSON.stringify({
        content: 'Welcome to Indigenius',
        speed: 1,
        voiceId: 'voice_001',
        voiceName: 'Sade',
        voiceGender: 'female',
        provider: 'indigenius_voice_model_1',
        languageCode: 'en',
        language: 'English',
      }),
    },
  );
  console.log(await response.json());
  ```

  ```python Python theme={null}
  import requests, os

  response = requests.post(
      "https://api.indigenius.ai/v1/create-studio/text-to-speech",
      headers={
          "X-API-Key": os.environ["INDIGENIUS_API_KEY"],
          "Content-Type": "application/json",
      },
      json={
          "content": "Welcome to Indigenius",
          "speed": 1,
          "voiceId": "voice_001",
          "voiceName": "Sade",
          "voiceGender": "female",
          "provider": "indigenius_voice_model_1",
          "languageCode": "en",
          "language": "English",
      },
      timeout=30,
  )
  print(response.json())
  ```
</CodeGroup>

**`201 Created`**

```json theme={null}
{
  "status": true,
  "message": "Text-to-speech job created",
  "id": "665e4a34c65bb95f2f2d72e8"
}
```

**Common errors:** `400` validation error · `403` missing `create_studio:write` scope

***

### `GET /v1/create-studio/text-to-speech`

Lists all TTS jobs for your organization.

<CodeGroup>
  ```bash Bash theme={null}
  curl https://api.indigenius.ai/v1/create-studio/text-to-speech \
    -H "X-API-Key: $INDIGENIUS_API_KEY"
  ```

  ```javascript Node theme={null}
  const response = await fetch(
    'https://api.indigenius.ai/v1/create-studio/text-to-speech',
    { headers: { 'X-API-Key': process.env.INDIGENIUS_API_KEY } },
  );
  console.log(await response.json());
  ```

  ```python Python theme={null}
  import requests, os

  response = requests.get(
      "https://api.indigenius.ai/v1/create-studio/text-to-speech",
      headers={"X-API-Key": os.environ["INDIGENIUS_API_KEY"]},
      timeout=30,
  )
  print(response.json())
  ```
</CodeGroup>

***

### `GET /v1/create-studio/text-to-speech/{id}`

Returns the status and output of a single TTS job.

<CodeGroup>
  ```bash Bash theme={null}
  curl https://api.indigenius.ai/v1/create-studio/text-to-speech/JOB_ID \
    -H "X-API-Key: $INDIGENIUS_API_KEY"
  ```

  ```javascript Node theme={null}
  const response = await fetch(
    `https://api.indigenius.ai/v1/create-studio/text-to-speech/${jobId}`,
    { headers: { 'X-API-Key': process.env.INDIGENIUS_API_KEY } },
  );
  console.log(await response.json());
  ```

  ```python Python theme={null}
  import requests, os

  response = requests.get(
      f"https://api.indigenius.ai/v1/create-studio/text-to-speech/{job_id}",
      headers={"X-API-Key": os.environ["INDIGENIUS_API_KEY"]},
      timeout=30,
  )
  print(response.json())
  ```
</CodeGroup>

***

### `DELETE /v1/create-studio/text-to-speech/{id}`

Deletes a TTS job and its output.

<CodeGroup>
  ```bash Bash theme={null}
  curl -X DELETE https://api.indigenius.ai/v1/create-studio/text-to-speech/JOB_ID \
    -H "X-API-Key: $INDIGENIUS_API_KEY"
  ```

  ```javascript Node theme={null}
  const response = await fetch(
    `https://api.indigenius.ai/v1/create-studio/text-to-speech/${jobId}`,
    {
      method: 'DELETE',
      headers: { 'X-API-Key': process.env.INDIGENIUS_API_KEY },
    },
  );
  console.log(await response.json());
  ```

  ```python Python theme={null}
  import requests, os

  response = requests.delete(
      f"https://api.indigenius.ai/v1/create-studio/text-to-speech/{job_id}",
      headers={"X-API-Key": os.environ["INDIGENIUS_API_KEY"]},
      timeout=30,
  )
  print(response.json())
  ```
</CodeGroup>

***

## Speech-to-text

### `POST /v1/create-studio/speech-to-text`

Uploads an audio file and starts a transcription job. Send as `multipart/form-data`.

<CodeGroup>
  ```bash Bash theme={null}
  curl -X POST https://api.indigenius.ai/v1/create-studio/speech-to-text \
    -H "X-API-Key: $INDIGENIUS_API_KEY" \
    -F "language=English" \
    -F "file=@/path/to/audio.wav"
  ```

  ```javascript Node theme={null}
  const form = new FormData();
  form.append('language', 'English');
  form.append('file', fileInput.files[0]);

  const response = await fetch(
    'https://api.indigenius.ai/v1/create-studio/speech-to-text',
    {
      method: 'POST',
      headers: { 'X-API-Key': process.env.INDIGENIUS_API_KEY },
      body: form,
    },
  );
  console.log(await response.json());
  ```

  ```python Python theme={null}
  import requests, os

  with open("/path/to/audio.wav", "rb") as f:
      response = requests.post(
          "https://api.indigenius.ai/v1/create-studio/speech-to-text",
          headers={"X-API-Key": os.environ["INDIGENIUS_API_KEY"]},
          data={"language": "English"},
          files={"file": f},
          timeout=60,
      )
  print(response.json())
  ```
</CodeGroup>

**Common errors:** `400` missing file or unsupported format · `403` missing `create_studio:write` scope

***

### `GET /v1/create-studio/speech-to-text`

Lists all STT jobs.

<CodeGroup>
  ```bash Bash theme={null}
  curl https://api.indigenius.ai/v1/create-studio/speech-to-text \
    -H "X-API-Key: $INDIGENIUS_API_KEY"
  ```

  ```javascript Node theme={null}
  const response = await fetch(
    'https://api.indigenius.ai/v1/create-studio/speech-to-text',
    { headers: { 'X-API-Key': process.env.INDIGENIUS_API_KEY } },
  );
  console.log(await response.json());
  ```

  ```python Python theme={null}
  import requests, os

  response = requests.get(
      "https://api.indigenius.ai/v1/create-studio/speech-to-text",
      headers={"X-API-Key": os.environ["INDIGENIUS_API_KEY"]},
      timeout=30,
  )
  print(response.json())
  ```
</CodeGroup>

***

### `GET /v1/create-studio/speech-to-text/{id}`

Returns the result of a single STT job.

<CodeGroup>
  ```bash Bash theme={null}
  curl https://api.indigenius.ai/v1/create-studio/speech-to-text/JOB_ID \
    -H "X-API-Key: $INDIGENIUS_API_KEY"
  ```

  ```javascript Node theme={null}
  const response = await fetch(
    `https://api.indigenius.ai/v1/create-studio/speech-to-text/${jobId}`,
    { headers: { 'X-API-Key': process.env.INDIGENIUS_API_KEY } },
  );
  console.log(await response.json());
  ```

  ```python Python theme={null}
  import requests, os

  response = requests.get(
      f"https://api.indigenius.ai/v1/create-studio/speech-to-text/{job_id}",
      headers={"X-API-Key": os.environ["INDIGENIUS_API_KEY"]},
      timeout=30,
  )
  print(response.json())
  ```
</CodeGroup>

***

### `DELETE /v1/create-studio/speech-to-text/{id}`

<CodeGroup>
  ```bash Bash theme={null}
  curl -X DELETE https://api.indigenius.ai/v1/create-studio/speech-to-text/JOB_ID \
    -H "X-API-Key: $INDIGENIUS_API_KEY"
  ```

  ```javascript Node theme={null}
  const response = await fetch(
    `https://api.indigenius.ai/v1/create-studio/speech-to-text/${jobId}`,
    {
      method: 'DELETE',
      headers: { 'X-API-Key': process.env.INDIGENIUS_API_KEY },
    },
  );
  console.log(await response.json());
  ```

  ```python Python theme={null}
  import requests, os

  response = requests.delete(
      f"https://api.indigenius.ai/v1/create-studio/speech-to-text/{job_id}",
      headers={"X-API-Key": os.environ["INDIGENIUS_API_KEY"]},
      timeout=30,
  )
  print(response.json())
  ```
</CodeGroup>

***

## Dubbing

Dubbing translates and re-voices a source video into a target language. The workflow is:

1. Create a dubbing project (`POST /v1/create-studio/dubbing/create`)
2. Trigger generation (`POST /v1/create-studio/dubbing/generate`)
3. Poll status until `completed` (`GET /v1/create-studio/dubbing/status/{id}`)
4. Download the output (`GET /v1/create-studio/dubbing/download/{id}/{mode}`)

***

### `POST /v1/create-studio/dubbing/create`

Creates a dubbing project. Send as `multipart/form-data`.

<CodeGroup>
  ```bash Bash theme={null}
  curl -X POST https://api.indigenius.ai/v1/create-studio/dubbing/create \
    -H "X-API-Key: $INDIGENIUS_API_KEY" \
    -F "projectName=Product explainer dub" \
    -F "videoUrl=https://example.com/source-video.mp4" \
    -F "sourceLanguage=English" \
    -F "targetLanguage=French" \
    -F "voiceId=voice_001" \
    -F "voiceName=Sade" \
    -F "voiceGender=female" \
    -F "provider=indigenius_voice_model_1" \
    -F "lipSync=no"
  ```

  ```javascript Node theme={null}
  const form = new FormData();
  form.append('projectName', 'Product explainer dub');
  form.append('videoUrl', 'https://example.com/source-video.mp4');
  form.append('sourceLanguage', 'English');
  form.append('targetLanguage', 'French');
  form.append('voiceId', 'voice_001');
  form.append('voiceName', 'Sade');
  form.append('voiceGender', 'female');
  form.append('provider', 'indigenius_voice_model_1');
  form.append('lipSync', 'no');

  const response = await fetch(
    'https://api.indigenius.ai/v1/create-studio/dubbing/create',
    {
      method: 'POST',
      headers: { 'X-API-Key': process.env.INDIGENIUS_API_KEY },
      body: form,
    },
  );
  console.log(await response.json());
  ```

  ```python Python theme={null}
  import requests, os

  response = requests.post(
      "https://api.indigenius.ai/v1/create-studio/dubbing/create",
      headers={"X-API-Key": os.environ["INDIGENIUS_API_KEY"]},
      data={
          "projectName": "Product explainer dub",
          "videoUrl": "https://example.com/source-video.mp4",
          "sourceLanguage": "English",
          "targetLanguage": "French",
          "voiceId": "voice_001",
          "voiceName": "Sade",
          "voiceGender": "female",
          "provider": "indigenius_voice_model_1",
          "lipSync": "no",
      },
      timeout=60,
  )
  print(response.json())
  ```
</CodeGroup>

**`201 Created`**

```json theme={null}
{
  "status": true,
  "message": "Dubbing project created",
  "id": "665e4a34c65bb95f2f2d72e7"
}
```

***

### `POST /v1/create-studio/dubbing/generate`

Triggers generation for an existing dubbing project. Pass the `id` from the create step.

<CodeGroup>
  ```bash Bash theme={null}
  curl -X POST https://api.indigenius.ai/v1/create-studio/dubbing/generate \
    -H "X-API-Key: $INDIGENIUS_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "dubbingId": "665e4a34c65bb95f2f2d72e7",
      "targetLanguage": "French",
      "voiceId": "voice_001",
      "voiceName": "Sade",
      "voiceGender": "female",
      "provider": "indigenius_voice_model_1"
    }'
  ```

  ```javascript Node theme={null}
  const response = await fetch(
    'https://api.indigenius.ai/v1/create-studio/dubbing/generate',
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-API-Key': process.env.INDIGENIUS_API_KEY,
      },
      body: JSON.stringify({
        dubbingId: '665e4a34c65bb95f2f2d72e7',
        targetLanguage: 'French',
        voiceId: 'voice_001',
        voiceName: 'Sade',
        voiceGender: 'female',
        provider: 'indigenius_voice_model_1',
      }),
    },
  );
  console.log(await response.json());
  ```

  ```python Python theme={null}
  import requests, os

  response = requests.post(
      "https://api.indigenius.ai/v1/create-studio/dubbing/generate",
      headers={
          "X-API-Key": os.environ["INDIGENIUS_API_KEY"],
          "Content-Type": "application/json",
      },
      json={
          "dubbingId": "665e4a34c65bb95f2f2d72e7",
          "targetLanguage": "French",
          "voiceId": "voice_001",
          "voiceName": "Sade",
          "voiceGender": "female",
          "provider": "indigenius_voice_model_1",
      },
      timeout=60,
  )
  print(response.json())
  ```
</CodeGroup>

**`201 Created`**

```json theme={null}
{
  "status": true,
  "message": "Dubbing generation started",
  "id": "665e4a34c65bb95f2f2d72e7"
}
```

**Common errors:** `400` validation error · `403` missing `create_studio:write` scope · `404` project not found

***

### `GET /v1/create-studio/dubbing/status/{id}`

Polls the status of a dubbing job. Poll every 5–10 seconds until `status` is `completed` or `failed`.

<CodeGroup>
  ```bash Bash theme={null}
  curl https://api.indigenius.ai/v1/create-studio/dubbing/status/665e4a34c65bb95f2f2d72e7 \
    -H "X-API-Key: $INDIGENIUS_API_KEY"
  ```

  ```javascript Node theme={null}
  const dubbingId = '665e4a34c65bb95f2f2d72e7';
  const response = await fetch(
    `https://api.indigenius.ai/v1/create-studio/dubbing/status/${dubbingId}`,
    { headers: { 'X-API-Key': process.env.INDIGENIUS_API_KEY } },
  );
  console.log(await response.json());
  ```

  ```python Python theme={null}
  import requests, os

  dubbing_id = "665e4a34c65bb95f2f2d72e7"
  response = requests.get(
      f"https://api.indigenius.ai/v1/create-studio/dubbing/status/{dubbing_id}",
      headers={"X-API-Key": os.environ["INDIGENIUS_API_KEY"]},
      timeout=30,
  )
  print(response.json())
  ```
</CodeGroup>

**`200 OK`**

```json theme={null}
{
  "status": true,
  "message": "Dubbing status fetched",
  "data": {
    "id": "665e4a34c65bb95f2f2d72e7",
    "status": "processing"
  }
}
```

Possible `status` values: `pending` · `processing` · `completed` · `failed`

***

### `GET /v1/create-studio/dubbing/download/{id}/{mode}`

Downloads the completed output. Use `mode` to select the output format.

| `mode`  | Description       |
| ------- | ----------------- |
| `video` | Dubbed video file |
| `audio` | Audio track only  |

<CodeGroup>
  ```bash Bash theme={null}
  curl https://api.indigenius.ai/v1/create-studio/dubbing/download/665e4a34c65bb95f2f2d72e7/video \
    -H "X-API-Key: $INDIGENIUS_API_KEY" \
    --output dubbed-video.mp4
  ```

  ```javascript Node theme={null}
  const dubbingId = '665e4a34c65bb95f2f2d72e7';
  const response = await fetch(
    `https://api.indigenius.ai/v1/create-studio/dubbing/download/${dubbingId}/video`,
    { headers: { 'X-API-Key': process.env.INDIGENIUS_API_KEY } },
  );
  // response body is the binary file
  const buffer = await response.arrayBuffer();
  ```

  ```python Python theme={null}
  import requests, os

  dubbing_id = "665e4a34c65bb95f2f2d72e7"
  response = requests.get(
      f"https://api.indigenius.ai/v1/create-studio/dubbing/download/{dubbing_id}/video",
      headers={"X-API-Key": os.environ["INDIGENIUS_API_KEY"]},
      timeout=120,
  )
  with open("dubbed-video.mp4", "wb") as f:
      f.write(response.content)
  ```
</CodeGroup>

**Common errors:** `403` missing `create_studio:read` scope · `404` dubbing job not found or not yet completed

***

### `GET /v1/create-studio/dubbing/list`

Lists all dubbing projects.

<CodeGroup>
  ```bash Bash theme={null}
  curl https://api.indigenius.ai/v1/create-studio/dubbing/list \
    -H "X-API-Key: $INDIGENIUS_API_KEY"
  ```

  ```javascript Node theme={null}
  const response = await fetch(
    'https://api.indigenius.ai/v1/create-studio/dubbing/list',
    { headers: { 'X-API-Key': process.env.INDIGENIUS_API_KEY } },
  );
  console.log(await response.json());
  ```

  ```python Python theme={null}
  import requests, os

  response = requests.get(
      "https://api.indigenius.ai/v1/create-studio/dubbing/list",
      headers={"X-API-Key": os.environ["INDIGENIUS_API_KEY"]},
      timeout=30,
  )
  print(response.json())
  ```
</CodeGroup>

***

### `GET /v1/create-studio/dubbing/details/{id}`

Returns full details for one dubbing project.

<CodeGroup>
  ```bash Bash theme={null}
  curl https://api.indigenius.ai/v1/create-studio/dubbing/details/665e4a34c65bb95f2f2d72e7 \
    -H "X-API-Key: $INDIGENIUS_API_KEY"
  ```

  ```javascript Node theme={null}
  const response = await fetch(
    `https://api.indigenius.ai/v1/create-studio/dubbing/details/${dubbingId}`,
    { headers: { 'X-API-Key': process.env.INDIGENIUS_API_KEY } },
  );
  console.log(await response.json());
  ```

  ```python Python theme={null}
  import requests, os

  response = requests.get(
      f"https://api.indigenius.ai/v1/create-studio/dubbing/details/{dubbing_id}",
      headers={"X-API-Key": os.environ["INDIGENIUS_API_KEY"]},
      timeout=30,
  )
  print(response.json())
  ```
</CodeGroup>

***

### `DELETE /v1/create-studio/dubbing/delete/{id}`

Permanently deletes a dubbing project and its output files.

<CodeGroup>
  ```bash Bash theme={null}
  curl -X DELETE https://api.indigenius.ai/v1/create-studio/dubbing/delete/665e4a34c65bb95f2f2d72e7 \
    -H "X-API-Key: $INDIGENIUS_API_KEY"
  ```

  ```javascript Node theme={null}
  const response = await fetch(
    `https://api.indigenius.ai/v1/create-studio/dubbing/delete/${dubbingId}`,
    {
      method: 'DELETE',
      headers: { 'X-API-Key': process.env.INDIGENIUS_API_KEY },
    },
  );
  console.log(await response.json());
  ```

  ```python Python theme={null}
  import requests, os

  response = requests.delete(
      f"https://api.indigenius.ai/v1/create-studio/dubbing/delete/{dubbing_id}",
      headers={"X-API-Key": os.environ["INDIGENIUS_API_KEY"]},
      timeout=30,
  )
  print(response.json())
  ```
</CodeGroup>

***

### `GET /v1/create-studio/download-file/{id}/{mode}`

Downloads any Create Studio output file by its job ID and mode.

<CodeGroup>
  ```bash Bash theme={null}
  curl https://api.indigenius.ai/v1/create-studio/download-file/JOB_ID/audio \
    -H "X-API-Key: $INDIGENIUS_API_KEY" \
    --output output.mp3
  ```

  ```javascript Node theme={null}
  const response = await fetch(
    `https://api.indigenius.ai/v1/create-studio/download-file/${jobId}/audio`,
    { headers: { 'X-API-Key': process.env.INDIGENIUS_API_KEY } },
  );
  const buffer = await response.arrayBuffer();
  ```

  ```python Python theme={null}
  import requests, os

  response = requests.get(
      f"https://api.indigenius.ai/v1/create-studio/download-file/{job_id}/audio",
      headers={"X-API-Key": os.environ["INDIGENIUS_API_KEY"]},
      timeout=120,
  )
  with open("output.mp3", "wb") as f:
      f.write(response.content)
  ```
</CodeGroup>

***

## Async job polling

TTS and dubbing jobs process asynchronously. Use this pattern to wait for completion:

```javascript theme={null}
async function waitForJob(
  statusUrl,
  headers,
  intervalMs = 5000,
  maxAttempts = 60,
) {
  for (let i = 0; i < maxAttempts; i++) {
    const res = await fetch(statusUrl, { headers });
    const json = await res.json();
    const status = json?.data?.status;

    if (status === 'completed') return json;
    if (status === 'failed')
      throw new Error(`Job failed: ${JSON.stringify(json)}`);

    await new Promise((r) => setTimeout(r, intervalMs));
  }
  throw new Error('Job polling timed out');
}

// Usage
const jobId = '665e4a34c65bb95f2f2d72e7';
const result = await waitForJob(
  `https://api.indigenius.ai/v1/create-studio/dubbing/status/${jobId}`,
  { 'X-API-Key': process.env.INDIGENIUS_API_KEY },
);
```

```python theme={null}
import time
import requests
import os

def wait_for_job(status_url, headers, interval=5, max_attempts=60):
    for _ in range(max_attempts):
        response = requests.get(status_url, headers=headers, timeout=30)
        data = response.json().get("data", {})
        status = data.get("status")

        if status == "completed":
            return response.json()
        if status == "failed":
            raise Exception(f"Job failed: {response.json()}")

        time.sleep(interval)

    raise TimeoutError("Job polling timed out")

# Usage
dubbing_id = "665e4a34c65bb95f2f2d72e7"
result = wait_for_job(
    f"https://api.indigenius.ai/v1/create-studio/dubbing/status/{dubbing_id}",
    {"X-API-Key": os.environ["INDIGENIUS_API_KEY"]},
)
```

<Tip>
  Subscribe to the `dubbing.completed` and `tts.completed` webhook events to
  avoid polling entirely. See [Webhooks](/webhooks).
</Tip>
