Introduction
What it returns
The transcript as text on the task result, plus output.transcript: the detected language and language code, the audio length in seconds, and every word with its start and end time in seconds. With multichannel on, output.transcript.channels holds the same for each channel. Speaker labels are not included.
Sending audio
audio_url takes an uploaded MP3 or WAV, or a public URL to MP3, WAV, M4A, FLAC, OGG, Opus, AAC, MP4 or MKV, from 1 second to 2 hours. The URL has to answer with the audio itself. Raw audio without a file header (PCM, μ-law, A-law) is not accepted.
Language and numbers
Leave language empty and the language is detected; speech in any of the 25 supported languages is transcribed either way. text_normalization needs language.
Key terms and filler words
keyterms takes up to 100 terms of up to 50 characters, one per row. In our test "Xandrelle" and "Qorvessa" came back as "Xandrel" and "Corvessa" without them and exactly right with them. filler_words keeps um and uh, which are removed by default.
Several channels
Turn on multichannel for recordings with each speaker on their own channel. Each channel is transcribed separately and returned on its own line, in channel order. Leave it off only when every channel carries the same sound: in our tests a stereo file with a different speaker on each side came back with one of the two speakers missing.
Request parameters
| Parameter | Required | Description |
|---|---|---|
audio_url | Yes | The voice or music track to use. |
filler_words | No | Keep filler words such as um and uh in the transcript. Default: false |
keyterms | No | Names and terms to spell the way you list them, up to 100. Default: [] |
language | No | The language of the speech. ar · cs · da · nl · en · fil · fr · de · hi · id · it · ja · ko · mk · ms · fa · pl · pt · ro · ru · es · sv · th · tr · vi |
multichannel | No | Transcribe each channel separately, one line per channel. Turn on when speakers are on separate channels. Default: false |
text_normalization | No | Write spoken numbers, prices, dates and units in digits. Needs language. Default: false |
Pricing
Prices are in credits, the same credits you use on the website (1 credit = $0.01). The hold is taken when the task is accepted and settled to the actual charge when it finishes; failed tasks are refunded.
| Option | Credits per second | ≈ USD |
|---|---|---|
| Standard | 0.01 | $0.0001 |
For an exact number before you run, send the same body to POST /jobs/quote.
API quick start
Call the Grok STT API in three steps
- Create an API key. Sign in to PopNow and create a key in the API console. Keys start with sk-popnow- and use the same credits as the website.
- Send the request. POST /jobs/createTask with model xai/grok-stt/speech-to-text and an input object that follows the parameter table. The response returns a task ID straight away.
- Get the result. Poll GET /jobs/recordInfo with the task ID, or pass a callBackUrl and we post the result to it. Download the output links when the task succeeds.
# 1. Create the task. Keep the Idempotency-Key if you retry after a network error.
export IDEMPOTENCY_KEY="$(uuidgen)"
curl -X POST https://api.popnow.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $POPNOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $IDEMPOTENCY_KEY" \
-d '{
"model": "xai/grok-stt/speech-to-text",
"input": {
"audio_url": "https://media.popnow.ai/shortfilm/voices/Aoede-46e4c427.mp3"
}
}'
# 2. Copy data.taskId from the response, then poll until state is succeeded, failed, canceled or expired.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.popnow.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
-H "Authorization: Bearer $POPNOW_API_KEY"Replace the prompt and any links with your own. The API tab has the response, polling and callback reference.
Grok STT API questions
How much does the Grok STT API cost?
Grok STT costs 0.01 credits ($0.0001) per second. Credits are the same as on the website (1 credit = $0.01), new accounts get 30 free credits, and failed tasks are refunded.
What is the model name for Grok STT in the API?
Put xai/grok-stt/speech-to-text for Speech to Text in the model field of POST /jobs/createTask.
What comes back?
The transcript as text on the task result, plus a structured transcript (output.transcript) with the detected language, the audio length and every word with its start and end time in seconds — per channel when multichannel is on. There is no file to download. Speaker labels are not included.
Can it tell speakers apart?
Not by voice: speaker labels are not returned. If each speaker was recorded on a separate channel, as in many call recordings, turn on multichannel and each channel comes back on its own line. Leave it off and one side can go missing: in our two tests with a different speaker on each channel, one of them was dropped from the transcript.
Which audio can I send?
An uploaded MP3 or WAV, or a public URL to common formats such as MP3, WAV, M4A, FLAC, OGG, Opus, AAC, MP4 or MKV, from 1 second to 2 hours long. Raw audio without a file header is not accepted.
What are the limits of the Grok STT API?
Largest upload: 90 MB; Languages: 25. Requests outside these limits are rejected before anything is charged.
Can I try Grok STT without writing code?
Yes. The Playground runs Grok STT on your PopNow credits, needs no API key, and shows the matching code for every run.
All Grok models
HeartMuLa Transcribe is tuned for sung lyrics over music; Grok handles spoken audio.

