> 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/speech-to-text-api-reference.md).

# Speech-To-Text 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/speech-to-text/generate" \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "questiion=Transcribe this audio:" \
  -F "audio_format=mp3" \
  -F "file=@path/to/audio"
```

{% 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 stt() {
  const url = `${baseUrl}/api/v1/speech-to-text/generate`;

  const formData = new FormData();
  formData.append("question", "Transcribe this audio:");
  formData.append("audio_format", "mp3");
  formData.append("file", fs.createReadStream("path/to/audio.mp3"));

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

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

stt();
```

{% 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 stt():
    url = f'{base_url}/api/v1/speech-to-text/generate'
    data = {
        'question': 'Transcribe this audio:', # text to specify output,
        'audio_format': 'mp3' # 'mp3', 'wav'
    }
 
    files=[('file', ('audio.mp3', open('path/to/audio.mp3', 'rb'), 'audio/mpeg'))]
    headers = {'X-API-Key': api_key}
    response = requests.request("POST", url, headers=headers, data=data, files=files)
    print(response.text)

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

{% endtab %}
{% endtabs %}

## How To Create Image Generation Task

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

This `API` starts the `STT` process by creating a task that generates text content from audio file.

{% 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 text content
  {% endhint %}

### Request

<table><thead><tr><th width="128">Parameter</th><th width="85">Type</th><th width="109">Required</th><th>Description</th></tr></thead><tbody><tr><td>file</td><td>File</td><td>Yes</td><td>Input audio.</td></tr><tr><td>audio_format</td><td>String</td><td>Yes</td><td>This value can be set to <code>mp3</code>, or <code>wav.</code></td></tr><tr><td>question</td><td>String</td><td>Yes</td><td>This value is text to specify output content. default value is <code>Transcribe this audio:</code></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/speech-to-text/generate" \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "questiion=Transcribe this audio:" \
  -F "audio_format=mp3" \
  -F "file=@path/to/audio"
```

{% 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 stt() {
  const url = `${baseUrl}/api/v1/speech-to-text/generate`;

  const formData = new FormData();
  formData.append("question", "Transcribe this audio:");
  formData.append("audio_format", "mp3");
  formData.append("file", fs.createReadStream("path/to/audio.mp3"));

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

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

stt();
```

{% 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 stt():
    url = f'{base_url}/api/v1/speech-to-text/generate'
    data = {
        'question': 'Transcribe this audio:', # text to specify output,
        'audio_format': 'mp3' # 'mp3', 'wav'
    }
 
    files=[('file', ('audio.mp3', open('path/to/audio.mp3', 'rb'), 'audio/mpeg'))]
    headers = {'X-API-Key': api_key}
    response = requests.request("POST", url, headers=headers, data=data, files=files)
    print(response.text)

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

{% endtab %}
{% endtabs %}

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

```bash
{"success":true,"data":{"jobId":"d6527af6-9697-4860-b635-b930a441fbf2","status":"PENDING"},"message":"Speech-to-text job created successfully"}
```

**Response Field**

<table><thead><tr><th width="102">Field</th><th width="81">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>message</td><td>String</td><td>To indicates the status of task.</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></tbody></table>

## How To Get Task Status

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

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

### Task Status:

<table><thead><tr><th width="115">Status</th><th>Description</th><th width="112">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="118">Parameter</th><th width="83">Type</th><th width="108">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>STT</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/speech-to-text/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/speech-to-text/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/speech-to-text/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': 'd6527af6-9697-4860-b635-b930a441fbf2', 'userId': 'eebf31b5-7bec-445e-8b99-51c0311a389d', 'audioFileName': '3.mp3', 'audioUrl': 'https://backend.miragic.ai/uploads/speechToText/1762344258701-12284807.mp3', 'question': 'Transcribe this audio:', 'audioFormat': 'mp3', 'transcription': "The content provided appears to be audio, and I'm unable to transcribe or process voice recordings. If you have any text-based questions or need assistance, feel free to ask!", 'status': 'COMPLETED', 'errorMessage': None, 'metadata': {'apiResponse': {'success': True, 'transcription': "The content provided appears to be audio, and I'm unable to transcribe or process voice recordings. If you have any text-based questions or need assistance, feel free to ask!"}, 'audioFilePath': '/var/www/html/MiragicAI/backend/uploads/speechToText/1762344258701-12284807.mp3', 'processingTimeMs': 9937}, 'creditsUsed': 2, 'createdAt': '2025-11-05T12:04:18.785Z', 'updatedAt': '2025-11-05T12:04:28.723Z'}}
```

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

<table><thead><tr><th width="130">Field</th><th width="100">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>transcription</td><td>String</td><td>text content from audio file.</td></tr><tr><td>createdAt</td><td>Number</td><td>Unix timestamp when processing is created</td></tr><tr><td>userId</td><td>String</td><td>Unique identifier of the user</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/speech-to-text/generate" \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "questiion=Transcribe this audio:" \
  -F "audio_format=mp3" \
  -F "file=@path/to/audio"
```

{% 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 stt() {
  const url = `${baseUrl}/api/v1/speech-to-text/generate`;

  const formData = new FormData();
  formData.append("question", "Transcribe this audio:");
  formData.append("audio_format", "mp3");
  formData.append("file", fs.createReadStream("path/to/audio.mp3"));
    
  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/speech-to-text/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);
  }
}

stt();
```

{% 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 stt():
    url = f'{base_url}/api/v1/speech-to-text/generate'
    data = {
        'question': 'Transcribe this audio:', # text to specify output,
        'audio_format': 'mp3' # 'mp3', 'wav'
    }
 
    files=[('file', ('audio.mp3', open('path/to/audio.mp3', 'rb'), 'audio/mpeg'))]
    headers = {'X-API-Key': api_key}
    response = requests.request("POST", url, headers=headers, data=data, files=files)
    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/speech-to-text/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__':
    stt()
```

{% 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/speech-to-text-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.
