curl --request POST \
--url https://api.opper.ai/v3/audio/transcriptions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"audio": "<string>",
"model": "<string>"
}
'import requests
url = "https://api.opper.ai/v3/audio/transcriptions"
payload = {
"audio": "<string>",
"model": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({audio: '<string>', model: '<string>'})
};
fetch('https://api.opper.ai/v3/audio/transcriptions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"created": 123,
"id": "<string>",
"model": "<string>",
"text": "<string>",
"usage": {
"cost": 123,
"seconds": 123
},
"duration": 123,
"language": "<string>",
"segments": [
{
"end": 123,
"start": 123,
"text": "<string>",
"speaker": "<string>"
}
],
"words": [
{
"end": 123,
"start": 123,
"word": "<string>"
}
]
}{
"id": "<string>",
"status_url": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
},
"meta": {}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
},
"meta": {}
}Transcribe audio
Transcribe audio to text. By default runs synchronously and returns the transcript inline (200); audio accepts a file_<id>, an https URL, or a base64 data-URI (max 25MB decoded). Set stream: true to receive the transcript live as Server-Sent Events (transcript.text.delta chunks then a final transcript.text.done, terminated by data: [DONE]) — supported on streaming models like mistral/voxtral-mini-2602, a 400 otherwise. Set async: true to run on the background worker and get a 202 with a status URL to poll instead — use it for long recordings that can exceed the synchronous timeout; it accepts the same audio sources (an inline data-URI is staged server-side and deleted after transcription) and lifts the decoded-audio cap to 100MB (a file_<id> or https URL is the best way to reach that; a data-URI that large needs a ~133MB request body). stream and async are mutually exclusive. model and audio are required; language and prompt are passed through as hints; diarize requests speaker labels (400 on models without diarization support); everything in parameters is forwarded verbatim to the provider.
curl --request POST \
--url https://api.opper.ai/v3/audio/transcriptions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"audio": "<string>",
"model": "<string>"
}
'import requests
url = "https://api.opper.ai/v3/audio/transcriptions"
payload = {
"audio": "<string>",
"model": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({audio: '<string>', model: '<string>'})
};
fetch('https://api.opper.ai/v3/audio/transcriptions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"created": 123,
"id": "<string>",
"model": "<string>",
"text": "<string>",
"usage": {
"cost": 123,
"seconds": 123
},
"duration": 123,
"language": "<string>",
"segments": [
{
"end": 123,
"start": 123,
"text": "<string>",
"speaker": "<string>"
}
],
"words": [
{
"end": 123,
"start": 123,
"word": "<string>"
}
]
}{
"id": "<string>",
"status_url": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
},
"meta": {}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
},
"meta": {}
}Authorizations
API key authentication. Pass your API key as a Bearer token.