> For the complete documentation index, see [llms.txt](https://docs.miragic.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.miragic.ai/text-to-speech-api-reference.md).

# Text-To-Speech API Reference

{% hint style="info" %}
**Good to know:** A quick start guide can be good to help folks get up and running with your API in a few steps. Some people prefer diving in with the basics rather than meticulously reading every page of documentation!
{% endhint %}

## Get your API keys

Your `API` requests are authenticated using `API` keys. Any request that doesn't include an `API` key will return an `error`.

You can generate an `API` key from your user `dashboard` in [Miragic](https://miragic.ai/) website anytime.

<figure><img src="/files/20ehQwfdabPgUTlxGVtj" alt=""><figcaption></figcaption></figure>

## Authentication

All requests must include the `X-API-Key` header containing your assigned `API` key.&#x20;

{% tabs %}
{% tab title="cURL" %}

```bash
curl -X POST "https://backend.miragic.ai/api/v1/text-to-speech/generate" \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "text=Say verbatim: A beatiful sunset over the ocean. Where I can make good?" \
  -F "voice=alloy"
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
import fs from "fs";
import FormData from "form-data";
import fetch from "node-fetch";

const apiKey = "YOUR_API_KEY";
const baseUrl = "https://backend.miragic.ai";

async function tts() {
  const url = `${baseUrl}/api/v1/text-to-speech/generate`;

  const formData = new FormData();
  formData.append("text", "Say verbatim: A beautiful sunset over the ocean. Where I can make good?");
  formData.append("voice", "alloy");

  const response = await fetch(url, {
    method: "POST",
    headers: {
      "X-API-Key": apiKey,
      ...formData.getHeaders(),
    },
    body: formData,
  });

  const result = await response.text();
  console.log(result);
}

tts();
```

{% endtab %}

{% tab title="Python" %}

```python
import requests
import time

api_key = 'YOUR_API_KEY'   # ← Replace with your actual API key
base_url = 'https://backend.miragic.ai'

def tts():
    url = f'{base_url}/api/v1/text-to-speech/generate'
    data = {
        'text': 'Say verbatim: A beautiful sunset over the ocean. Where I can make good?',
        'voice': 'alloy' # 'alloy', 'amuch', 'ash', 'ballad', 'dan', 'echo', 'onyx', 'verse', 'coral', 'elan', 'fable', 'nova', 'sage', 'shimmer'
    }
 
    headers = {'X-API-Key': api_key}
    response = requests.request("POST", url, headers=headers, data=data)
    print(response.text)

if __name__ == '__main__':
    tts()
```

{% endtab %}
{% endtabs %}

## How To Create Image Generation Task

<mark style="background-color:green;">POST</mark>   `/api/v1/text-to-speech/generate`

This `API` starts the `TTS` process by creating a task that generates an audio file containing speech.

{% hint style="info" %}
Processing Information

* Tasks are processed asynchronously in the background
* Progress can be monitored using the `Get Task Status API`
* The final result will be a high-quality audio
  {% endhint %}

### Request

<table><thead><tr><th width="117">Parameter</th><th width="81">Type</th><th width="111">Required</th><th>Description</th></tr></thead><tbody><tr><td>text</td><td>String</td><td>Yes</td><td>Input text to generate audio.</td></tr><tr><td>voice</td><td>String</td><td>Yes</td><td>This value can be set to <code>alloy</code>, <code>amuch</code>, <code>ash</code>, <code>ballad</code>, <code>dan</code>, <code>echo</code>, <code>onyx</code>, <code>verse</code>, <code>coral</code>, <code>elan</code>, <code>fable</code>, <code>nova</code>, <code>sage</code>, <code>shimmer</code>, etc.</td></tr></tbody></table>

<mark style="color:green;">**Request Example**</mark>

{% tabs %}
{% tab title="cURL" %}

```bash
curl -X POST "https://backend.miragic.ai/api/v1/text-to-speech/generate" \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "text=Say verbatim: A beatiful sunset over the ocean. Where I can make good?" \
  -F "voice=alloy"
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
import fs from "fs";
import FormData from "form-data";
import fetch from "node-fetch";

const apiKey = "YOUR_API_KEY";
const baseUrl = "https://backend.miragic.ai";

async function tts() {
  const url = `${baseUrl}/api/v1/text-to-speech/generate`;

  const formData = new FormData();
  formData.append("text", "Say verbatim: A beautiful sunset over the ocean. Where I can make good?");
  formData.append("voice", "alloy");

  const response = await fetch(url, {
    method: "POST",
    headers: {
      "X-API-Key": apiKey,
      ...formData.getHeaders(),
    },
    body: formData,
  });

  const result = await response.text();
  console.log(result);
}

tts();
```

{% endtab %}

{% tab title="Python" %}

```python
import requests
import time

api_key = 'YOUR_API_KEY'   # ← Replace with your actual API key
base_url = 'https://backend.miragic.ai'

def tts():
    url = f'{base_url}/api/v1/text-to-speech/generate'
    data = {
        'text': 'Say verbatim: A beautiful sunset over the ocean. Where I can make good?',
        'voice': 'alloy' # 'alloy', 'amuch', 'ash', 'ballad', 'dan', 'echo', 'onyx', 'verse', 'coral', 'elan', 'fable', 'nova', 'sage', 'shimmer'
    }
 
    headers = {'X-API-Key': api_key}
    response = requests.request("POST", url, headers=headers, data=data)
    print(response.text)

if __name__ == '__main__':
    tts()
```

{% endtab %}
{% endtabs %}

<mark style="color:green;">**Response**</mark>

```bash
{"success":true,"data":{"jobId":"eddb46cf-ca93-4513-a45d-747a9702c446","status":"PENDING"},"message":"Text-to-speech job created successfully"}
Job ID: eddb46cf-ca93-4513-a45d-747a9702c446
```

**Response Field**

<table><thead><tr><th width="102">Field</th><th width="88">Type</th><th>Description</th></tr></thead><tbody><tr><td>jobId</td><td>String</td><td>A unique identifier used to track task status and retrieve results.</td></tr><tr><td>status</td><td>String</td><td>The initial status will be <code>PENDING</code>. Use the <code>Get Task Status API</code> to track progress.</td></tr><tr><td>success</td><td>Logic</td><td><code>true</code> or <code>false</code> to indicate whether task is successful or not.</td></tr><tr><td>message</td><td>String</td><td>To indicate the status of task</td></tr></tbody></table>

## How To Get Task Status

<mark style="background-color:green;">GET</mark>   `/api/v1/text-to-speech/jobs/:jobId`

This `API` lets you check the status of a `TTS` task and retrieve the final result. Because the `TTS` process runs asynchronously, you’ll need to poll this endpoint until the task is finished.

### Task Status:

<table><thead><tr><th width="103">Status</th><th>Description</th><th width="107">Progress</th><th>Next Action</th></tr></thead><tbody><tr><td><code>PENDING</code></td><td>Task is currently being processed.</td><td><code>0</code>~<code>99</code>%</td><td>Continue polling</td></tr><tr><td><code>COMPLETED</code></td><td>Task has finished successfully.</td><td><code>100</code>%</td><td>Download result using download_signed_url</td></tr><tr><td><code>FAILED</code></td><td>Task processing failed.</td><td>N/A</td><td>Check error details and retry if needed</td></tr></tbody></table>

{% hint style="info" %} <mark style="color:green;">**Progress Tracking:**</mark>

* The `progress` field indicates the percentage of task completion (`0`-`100`)
* Progress updates are available in real-time during the `PENDING` state
* Progress increases as the AI processes different stages of the try-on task
  {% endhint %}

{% hint style="info" %}
**Polling Guidelines:**

* Start polling immediately after creating the task
* Implement exponential backoff to avoid rate limiting
* The download\_signed\_url is temporary and should be used promptly
* Consider implementing a timeout after extended polling
  {% endhint %}

### Request:

<mark style="color:blue;">**URL Parameters**</mark>

<table><thead><tr><th width="117">Parameter</th><th width="83">Type</th><th width="105">Required</th><th>Description</th></tr></thead><tbody><tr><td>JobId</td><td>String</td><td>Yes</td><td>This value indicates task <code>ID</code> assigned by requesting <code>TTS</code> process <code>API</code></td></tr></tbody></table>

<mark style="color:blue;">**Request Example**</mark>

{% tabs %}
{% tab title="cURL" %}

```bash
curl -X GET https://backend.miragic.ai/api/v1/text-to-speech/jobs/25331fb2-d0b0-44f6fcc85e3e \
  -H "X-API-Key: YOUR_API_KEY"
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
const fetch = require("node-fetch"); // for Node.js

const apiKey = "YOUR_API_KEY";
const jobId = "25331fb2-d0b0-44f6fcc85e3e";
const url = `https://backend.miragic.ai/api/v1/text-to-speech/jobs/${jobId}`;

const options = {
  method: "GET",
  headers: {
    "X-API-Key": apiKey
  }
};

fetch(url, options)
  .then(response => response.json())
  .then(data => {
    console.log("Response:", data);
  })
  .catch(error => {
    console.error("Error:", error);
  });
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

api_key = "YOUR_API_KEY"
job_id = "25331fb2-d0b0-44f6fcc85e3e"
url = f"https://backend.miragic.ai/api/v1/text-to-speech/jobs/{job_id}"

headers = {
    "X-API-Key": api_key
}

response = requests.get(url, headers=headers)

# Print status code and response JSON
print("Status Code:", response.status_code)
print("Response:", response.json())
```

{% endtab %}
{% endtabs %}

<mark style="color:blue;">**Response Example**</mark>

#### Completed Status (200):

```bash
{'success': True, 'data': {'id': 'eddb46cf-ca93-4513-a45d-747a9702c446', 'userId': 'eebf31b5-7bec-445e-8b99-51c0311a389d', 'text': 'Say verbatim: A beautiful sunset over the ocean. Where I can make good?', 'voice': 'alloy', 'audioUrl': 'https://backend.miragic.ai/uploads/textToSpeech/processed/eebf31b5-7bec-445e-8b99-51c0311a389d/7caf97b8-f60f-41f5-9b23-5bccdfca67e2.mp3', 'status': 'COMPLETED', 'errorMessage': None, 'metadata': {'apiResponse': {'success': True, 'audio_link': 'https://www.dropbox.com/scl/fi/pyrh623yt9etrjjeqb9m6/bcfd45b6-17e4-4d78-adeb-1eecddaae0c0.mp3?rlkey=soni37e2h7e1gjip74bfodmjw&raw=1'}, 'localAudioPath': 'uploads/textToSpeech/processed/eebf31b5-7bec-445e-8b99-51c0311a389d/7caf97b8-f60f-41f5-9b23-5bccdfca67e2.mp3', 'processingTimeMs': 7082}, 'creditsUsed': 2, 'createdAt': '2025-11-04T14:58:15.547Z', 'updatedAt': '2025-11-04T14:58:22.630Z'}}
```

<mark style="color:blue;">**Response Fields**</mark>

<table><thead><tr><th width="105">Field</th><th width="89">Type</th><th>Description</th></tr></thead><tbody><tr><td>id</td><td>String</td><td>Unique identifier of the task</td></tr><tr><td>status</td><td>String</td><td>Current status of the task (<code>PENDING</code>/<code>COMPLETED</code>/<code>FAILED</code>)</td></tr><tr><td>audio_link</td><td>String</td><td><code>URL</code> to result audio file.</td></tr><tr><td>createdAt</td><td>Number</td><td>Unix timestamp when processing is created</td></tr></tbody></table>

## Full Code Example

The following code lines are quick example to use our `API` in multiple languages.

{% tabs %}
{% tab title="cURL" %}

```bash
curl -X POST "https://backend.miragic.ai/api/v1/text-to-speech/generate" \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "text=Say verbatim: A beatiful sunset over the ocean. Where I can make good?" \
  -F "voice=alloy"
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
import axios from "axios";
import fs from "fs";
import FormData from "form-data";

const apiKey = "YOUR_API_KEY";
const baseUrl = "https://devapi.miragic.ai";

async function tts() {
  const url = `${baseUrl}/api/v1/text-to-speech/generate`;

  const formData = new FormData();
  formData.append("text", "Say verbatim: A beautiful sunset over the ocean. Where I can make good?");
  formData.append("voice", "alloy");
  
  const headers = {
    "X-API-Key": apiKey,
    ...form.getHeaders(),
  };

  try {
    // Step 1: Create job
    const response = await axios.post(url, form, { headers });
    console.log(response.data);

    if (response.data.success) {
      const jobId = response.data.data.jobId;
      console.log(`Job ID: ${jobId}`);

      // Step 2: Poll for results
      let status = "PENDING";
      while (status !== "COMPLETED" && status !== "FAILED") {
        await new Promise((r) => setTimeout(r, 2000)); // wait 2 sec
        const result = await axios.get(`${baseUrl}/api/v1/text-to-speech/jobs/${jobId}`, {
          headers: { "X-API-Key": apiKey },
        });

        status = result.data.data.status;

        if (status === "COMPLETED") {
          console.log("Result:", result.data);
          break;
        } else if (status === "FAILED") {
          console.log("Job failed:", result.data);
          break;
        } else {
          console.log(`Current status: ${status}...`);
        }
      }
    } else {
      console.log("Error:", response.data);
    }
  } catch (error) {
    console.error("Request failed:", error.response?.data || error.message);
  }
}

tts();
```

{% endtab %}

{% tab title="Python" %}

```python
import requests
import time

api_key = 'YOUR_API_KEY'   # ← Replace with your actual API key
base_url = 'https://backend.miragic.ai'

def tts():
    url = f'{base_url}/api/v1/text-to-speech/generate'
    data = {
        'text': 'Say verbatim: A beautiful sunset over the ocean. Where I can make good?',
        'voice': 'alloy' # 'alloy', 'amuch', 'ash', 'ballad', 'dan', 'echo', 'onyx', 'verse', 'coral', 'elan', 'fable', 'nova', 'sage', 'shimmer'
    }

    headers = {'X-API-Key': api_key}
    response = requests.request("POST", url, headers=headers, data=data)
    print(response.text)
    
    if response.json()['success']:
        job_id = response.json()['data']['jobId']
        print(f'Job ID: {job_id}')
        
        # Poll for results
        while True:
            result = requests.get(
                f'{base_url}/api/v1/text-to-speech/jobs/{job_id}',
                headers=headers
            )
            
            if result.json()['data']['status'] == 'COMPLETED':
                print('Result:', result.json())
                break
            elif result.json()['data']['status'] == 'FAILED':
                print('Job failed:', result.json())
                break
            
            time.sleep(2)
    else:
        print('Error:', response.json())

if __name__ == '__main__':
    tts()
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.miragic.ai/text-to-speech-api-reference.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
