Muse Voice Transcribe API: Pricing, Documentation
by Meta
Muse Voice Transcribe API gives developers a production-ready speech recognition endpoint that turns recorded audio into structured, speaker-attributed text. It transcribes across more than 70 languages and switches between them inside a single sentence, so bilingual meetings and mixed-language interviews do not need to be split or pre-tagged. Beyond a flat transcript, the API segments a recording into turns with millisecond timings and can label each turn with a speaker, resolving more than twenty distinct voices in a single file. Recognition accuracy can be steered without fine-tuning by naming the languages you expect and the vocabulary that matters to you, which is what makes proper nouns, product names and domain jargon come back spelled correctly. Requests are asynchronous: a submit returns a request id, and the finished transcript is delivered as a JSON file you fetch when the job completes. Billing is measured on the length of the audio you send, not on how long transcription takes or how much text comes back.

Models Version
Get $5 Free Credit on First Payment
No strings attached — add funds and get $5 bonus instantly
Muse Voice Transcribe API Documentation
Transcribe speech to text with speaker diarization across 70+ languages, with code-switching inside a single sentence. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED. The transcript is returned as a JSON file.
POST https://gateway.pixazo.ai/muse-voice-transcribe/v1/speech-to-textAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Speech to Text - Muse Voice Transcribe
Request Code
POST https://gateway.pixazo.ai/muse-voice-transcribe/v1/speech-to-text
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"audio_url": "https://example.com/interview.wav",
"audio_encoding": "WAV",
"mode": "DIARIZATION"
}import requests
url = "https://gateway.pixazo.ai/muse-voice-transcribe/v1/speech-to-text"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"audio_url": "https://example.com/interview.wav",
"audio_encoding": "WAV",
"mode": "DIARIZATION"
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/muse-voice-transcribe/v1/speech-to-text", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"audio_url": "https://example.com/interview.wav",
"audio_encoding": "WAV",
"mode": "DIARIZATION"
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/muse-voice-transcribe/v1/speech-to-text' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"audio_url": "https://example.com/interview.wav", "audio_encoding": "WAV", "mode": "DIARIZATION"}'Output
{
"request_id": "muse-voice-transcribe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/muse-voice-transcribe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/muse-voice-transcribe/v1/speech-to-text' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"audio_url": "https://example.com/interview.wav", "audio_encoding": "WAV", "mode": "DIARIZATION"}'Callback Payload (success)
{
"request_id": "muse-voice-transcribe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "muse-voice-transcribe",
"output": {
"media_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.json",
"media_type": "application/json"
},
"created_at": "2026-09-04T11:18:56.746Z",
"completed_at": "2026-09-04T11:19:32.000Z"
}Failure callback shape
{
"request_id": "muse-voice-transcribe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "muse-voice-transcribe",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on each status change.
- Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
audio_url | Yes | string | — | https URL, file up to 32 MB | Public URL of the audio to transcribe. The file is fetched by the gateway, so the URL must be reachable without authentication. |
audio_encoding | Yes | string | — | WAV, PCM_16KHZ, PCM_24KHZ | Format of the audio at audio_url. Required, and it must match the file you send — the model reads only mono 16-bit PCM and the format cannot be inferred from the URL. Use WAV: a RIFF/WAVE container holding mono 16-bit PCM at 16 kHz or 24 kHz. Convert other formats before uploading. The PCM_* values are accepted by this endpoint but are the encodings of the provider's realtime interface; send a WAV container unless you have confirmed otherwise. |
mode | No | string | PUSH_TO_TALK | PUSH_TO_TALK, ENDPOINTING, DIARIZATION | How the transcript is segmented. PUSH_TO_TALK returns one transcript; ENDPOINTING splits it into turns at speech boundaries; DIARIZATION splits it into turns and labels each with a speaker. |
language_bias | No | array of strings | — (auto-detected) | 1–25 language names, e.g. ["English", "French"] | Languages to bias recognition towards, given as language names — a list of languages, not locale codes such as en-US, and not free-form context. Omit it and the language is detected automatically; the model code-switches mid-sentence either way. |
keywords | No | array of strings | — | up to 100 entries | Names, product terms, acronyms or jargon that appear in the audio. Biases recognition towards this vocabulary, which improves accuracy on proper nouns and domain terminology. Keywords bias recognition but do not guarantee an exact spelling. |
Audio requirements
- Audio must be mono, signed 16-bit little-endian PCM, at 16 kHz or 24 kHz. Stereo and 8-bit audio fail once the file is read, reported as
status: "ERROR". Audio is not converted for you. - At most 10 minutes per request, and at most 32 MB. Split longer recordings and submit each part.
audio_encodingmust match the bytes ataudio_url. A declaration that disagrees with the file —WAVfor headerless audio, or aPCM_*value for a RIFF/WAVE file — fails once the file is read, reported asstatus: "ERROR".audio_urlmust be anhttpsURL and publicly reachable.- Cost scales with the length of the audio; the current rate is in the pricing panel on this page.
Choosing a mode
| Mode | turns[] | speaker | Use it for |
|---|---|---|---|
PUSH_TO_TALK | empty | — | A single utterance or dictation, where you only want the text. |
ENDPOINTING | populated | — | Long recordings you want split at natural speech boundaries, with timings. |
DIARIZATION | populated | populated | Meetings and interviews, where you need to know who said what. Handles 20+ speakers. |
An empty turns[] under PUSH_TO_TALK is expected behaviour, not a failure.
Transcript Format
The completed request returns output.media_url, a JSON file containing the transcript. Fetch that URL to read the result.
{
"request_id": "50ad7353-7814-4a9f-a059-1465e86c12dd",
"transcript": "Good morning everyone. Thanks for joining. Let's start with the quarterly numbers.",
"turns": [
{
"turnId": 0,
"startMs": 60,
"endMs": 2180,
"transcript": "Good morning everyone. Thanks for joining.",
"speaker": "A"
},
{
"turnId": 1,
"startMs": 2240,
"endMs": 5010,
"transcript": "Let's start with the quarterly numbers.",
"speaker": "B"
}
],
"audio_duration_ms": 5010,
"mode": "DIARIZATION"
}| Field | Type | Description |
|---|---|---|
| transcript | string | The full transcript, with punctuation and capitalisation. Present in every mode. |
| turns | array | Segments of the transcript. Populated in ENDPOINTING and DIARIZATION; empty in PUSH_TO_TALK. |
| turns[].turnId | number | Zero-based index of the segment. |
| turns[].startMs | number | Start of the segment, in milliseconds from the beginning of the audio. |
| turns[].endMs | number | End of the segment, in milliseconds. |
| turns[].transcript | string | Text of that segment. |
| turns[].speaker | string | Speaker label, e.g. A or B. Present only in DIARIZATION. |
| audio_duration_ms | number | Length of the transcribed audio in milliseconds. This is the quantity you are billed on. |
| mode | string | The mode the request ran in. |
Speech that is silent or below the confidence floor transcribes to an empty string rather than failing. That is a successful, billable request.
Example Request
{
"audio_url": "https://example.com/interview.wav",
"audio_encoding": "WAV",
"mode": "DIARIZATION"
}Example Response
{
"request_id": "muse-voice-transcribe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/muse-voice-transcribe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Bad request — audio_url or audio_encoding missing, of the wrong type, or an audio_encoding outside the accepted values. Anything checkable from the request body alone. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Only what can be judged from the request body itself is rejected synchronously. Everything that needs the audio to be fetched and read is reported through the status endpoint instead, as status: "ERROR". Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
audio_url or audio_encoding missing, or the wrong type | synchronous 400 |
audio_encoding outside WAV / PCM_16KHZ / PCM_24KHZ | synchronous 400 |
language_bias or keywords outside their size bounds | synchronous 400 |
audio_url not https, not reachable, or not public | status: "ERROR" |
| Audio longer than 10 minutes, or a body over 32 MB | status: "ERROR" |
audio_encoding does not match the actual bytes | status: "ERROR" |
| Audio not mono, or not 16-bit | status: "ERROR" |
Note the two audio_encoding failures are different checks at different moments: an unrecognised value is caught before the request is accepted, while a value that disagrees with the file can only be caught once the audio has been downloaded.
Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or FAILED/ERROR), then fetch output.media_url for the transcript.
curl 'https://gateway.pixazo.ai/v2/requests/status/muse-voice-transcribe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "muse-voice-transcribe_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "muse-voice-transcribe",
"output": {
"media_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.json",
"media_type": "application/json"
},
"created_at": "2026-09-04T11:18:56.746Z",
"completed_at": "2026-09-04T11:19:32.000Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR. |
| model_id | string | The model that handled the request. |
| output.media_url | string | URL of the transcript JSON file. |
| output.media_type | string | application/json. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is FAILED/ERROR. |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or FAILED/ERROR (failure).
How billing is measured
Billing is measured on the length of the audio you submit, rounded up to the next whole minute — not on the size of the transcript, and not on how long transcription takes. A hold is placed when the request is submitted, because the audio length is not known until the file has been read; the hold is reduced to the real cost once the duration is known, and released in full if the request fails.
The current rate is shown in the pricing panel on this page.
Muse Voice Transcribe API Pricing
⚡ Performance
Live usage measured on Pixazo's gateway, split by model version. Generation time is how long a generation takes end-to-end (lower is better). Success rate is the percent of generations that complete (higher is better).
〰 Uptime
Percent of generations that succeeded over the selected period, per model version.