POST /v1/speech-to-text

Speech to text

Transcribe one audio file and return the transcript in this response. For a live stream, see Speech to text realtime.

POST https://api.pascalai.co/v1/speech-to-text
Content-Type: multipart/form-data

Authenticate with Authorization: Bearer and an API key. Send model before file. The file must be under 500 MB. Pascal Transcribe accepts a file under 80 MB. Sarvam Saaras accepts audio up to 2 hours. The call remains open for up to 4 minutes. When processing has finished inside that window, the body is the job, including result.text. When status is queued or running, retrieve the same object with GET /v1/speech-to-text/{job_id}.

FieldTypeDescription
modelRequiredstringCatalogue id of the model, for example whisper-large-v3-turbo. This part must be sent before the file. A missing model is rejected with model_required.
fileRequiredfileAudio file to transcribe. The file must be under 500 MB. Pascal Transcribe accepts a file under 80 MB. Sarvam Saaras accepts audio up to 2 hours.
paramsstringJSON object for that model, encoded as a string. Omit the field, or send an empty string, to use the defaults. The value must be a JSON object. The fields are on the model page.
namestringOptional label stored on the job and returned as name.

Parameters

params is a JSON object for the chosen model. Each row is one field for one model, with the default used when the field is omitted. Limits and accepted language codes are on the model page. speaker_diarization labels who spoke. Pascal Transcribe, Pascal Transcribe Live, Sarvam Saaras, Deepgram Nova-3, and Deepgram Nova-3 Streaming accept it. Sarvam Saaras Live and the Flux models do not.

FieldModelDefault
params.speaker_diarizationPascal Transcribefalse. true labels speakers and bills $0.20 per hour.
Pascal Transcribe Livefalse. true labels speakers and bills $0.25 per hour.
Sarvam Saarasfalse. true labels speakers and bills $0.0075 per minute. Saaras Live does not diarize.
Deepgram Nova-3false. true labels speakers. Included in the file price.
Deepgram Nova-3 Streamingfalse. true labels speakers and adds $0.0020 per minute.
params.languageWhisper Large V3 Turboauto. Detects the language.
Whisper Large V3auto. Detects the language.
Canary 1B Flashauto. Transcribes the file as English.
Canary 1B v2auto. Transcribes the file as English.
Qwen3 ASR 1.7Bauto. Detects the language.
Cohere TranscribeSend a language code. This field has no default.
params.taskWhisper Large V3transcribe. translate returns English.
params.response_formatWhisper Large V3 Turboverbose_json
Whisper Large V3verbose_json
Parakeet TDT 0.6B v3verbose_json
Parakeet TDT 0.6B v2verbose_json
Parakeet CTC 0.6Bverbose_json
Parakeet RNNT 0.6Bverbose_json
Canary 1B Flashverbose_json
Canary 1B v2verbose_json
Qwen3 ASR 1.7Bjson
Cohere Transcribejson
params.timestamp_granularityWhisper Large V3 Turboword. Also accepts segment and none.
Whisper Large V3word. Also accepts segment and none.
Parakeet TDT 0.6B v3word. Also accepts none.
Parakeet TDT 0.6B v2word. Also accepts none.
Parakeet CTC 0.6Bword. Also accepts none.
Parakeet RNNT 0.6Bword. Also accepts none.
Canary 1B Flashword. Also accepts none.
Canary 1B v2word. Also accepts none.
Qwen3 ASR 1.7Bnone. Also accepts word.
params.promptWhisper Large V3 TurboOmitted.
Whisper Large V3Omitted.
Qwen3 ASR 1.7BOmitted.
params.temperatureWhisper Large V3 Turbo0, 0.2, 0.4, 0.6, 0.8, 1.0
Whisper Large V30, 0.2, 0.4, 0.6, 0.8, 1.0
params.hotwordsWhisper Large V3 TurboOmitted.
Whisper Large V3Omitted.
params.vad_filterWhisper Large V3 Turbofalse
Whisper Large V3false
params.min_silence_duration_msWhisper Large V3 Turbo1000 when vad_filter is true
Whisper Large V31000 when vad_filter is true
params.condition_on_previous_textWhisper Large V3 Turbotrue
Whisper Large V3true
params.prompt_reset_on_temperatureWhisper Large V3 Turbo0.5
Whisper Large V30.5
params.language_detection_thresholdWhisper Large V3 Turbo0.5
Whisper Large V30.5
params.prefixWhisper Large V3 TurboOmitted.
Whisper Large V3Omitted.
params.repetition_penaltyWhisper Large V3 Turbo1
Whisper Large V31
params.no_repeat_ngram_sizeWhisper Large V3 Turbo0
Whisper Large V30
params.hallucination_silence_thresholdWhisper Large V3 TurboOmitted.
Whisper Large V3Omitted.
params.no_speech_thresholdWhisper Large V3 Turbo0.6
Whisper Large V30.6
params.log_prob_thresholdWhisper Large V3 Turbo-1
Whisper Large V3-1
params.max_initial_timestampWhisper Large V3 Turbo999999
Whisper Large V3999999
params.length_penaltyWhisper Large V3 Turbo1
Whisper Large V31
params.compression_ratio_thresholdWhisper Large V3 Turbo2.4
Whisper Large V32.4
params.multilingualWhisper Large V3 Turbofalse
Whisper Large V3false
params.max_new_tokensWhisper Large V3 TurboOmitted.
Whisper Large V3Omitted.
params.chunk_lengthWhisper Large V3 TurboOmitted.
Whisper Large V3Omitted.
params.language_detection_segmentsWhisper Large V3 Turbo1
Whisper Large V31
params.blank_penaltyParakeet TDT 0.6B v30.75
Parakeet TDT 0.6B v20

Response

200 with the job. A successful file is charged $0.05 plus the audio duration in minutes. duration_seconds is the measured length that usage is billed from.

FieldTypeDescription
idstringIdentifier of the job. Pass it to GET /v1/speech-to-text/{job_id}.
statusstringqueued, running, succeeded, failed, cancelled, or expired. queued and running mean the transcript is not in this body yet.
model_idstringCatalogue id of the model that ran.
namestringLabel stored on the job.
languagestringLanguage code from the request, when one was sent.
duration_secondsstringMeasured length of the audio, as a decimal string of seconds. Null until the file has been measured. Audio minutes are billed from this value.
resultobjectPresent when status is succeeded. result.text is the transcript. verbose_json also includes language, duration, segments, and words.
error_codestringSet when the job has failed, and while a queued job is waiting for capacity. Cleared once the job starts.
error_messagestringMessage for a failed job. Branch on error_code.
created_atstringTime the job was created, as an ISO 8601 timestamp.
started_atstringTime processing started. Null while the job is queued.
finished_atstringTime the job reached a terminal status. Null while it is queued or running.

Example

This example sends a few fields for one model. The full list for the model you call is on that model’s page.

curl https://api.pascalai.co/v1/speech-to-text \
  -H "Authorization: Bearer $PASCAL_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -F model=whisper-large-v3-turbo \
  -F params='{"response_format":"verbose_json","timestamp_granularity":"word","language":"en"}' \
  -F file=@input.wav

curl https://api.pascalai.co/v1/speech-to-text/$JOB_ID \
  -H "Authorization: Bearer $PASCAL_API_KEY"

Batch

POST /v1/speech-to-text/batch

Transcribe up to 50 files in a single request. All files use the same model and the same parameters. Send model, then params, then each audio file as a part named file. Each file must be under 500 MB. Pascal Transcribe accepts a file under 80 MB. Sarvam Saaras accepts audio up to 2 hours.

The response contains the batch identifier. Retrieve progress with GET /v1/speech-to-text/batch/{batch_id}. An account may have two open batches. A file can be retrieved on its own with GET /v1/speech-to-text/{job_id}.

FieldTypeDescription
idstringIdentifier of the batch.
statusstringopen while any file is still in progress, and complete when every file has finished.
model_idstringModel applied to every file in the batch.
file_countintegerNumber of files in the batch.
succeededintegerNumber of files with status succeeded.
failedintegerNumber of files with status failed, cancelled, or expired.
remainingintegerNumber of files still pending, queued, or running.
files[].job_idstringJob identifier for the file, available after the file is queued.
files[].namestringOriginal file name.
files[].statusstringpending, queued, running, succeeded, failed, cancelled, or expired.
files[].resultobjectTranscript of the file.
files[].error_codestringError code for that file.
files[].error_messagestringError message for that file.

A successful batch is charged $0.05 once. Each file is charged for its audio duration in minutes.

curl https://api.pascalai.co/v1/speech-to-text/batch \
  -H "Authorization: Bearer $PASCAL_API_KEY" \
  -F model=whisper-large-v3-turbo \
  -F params='{"language":"en"}' \
  -F file=@clip-001.wav \
  -F file=@clip-002.wav

curl https://api.pascalai.co/v1/speech-to-text/batch/$BATCH_ID \
  -H "Authorization: Bearer $PASCAL_API_KEY"

Models