curl --request POST \
--url https://api.sunbird.ai/tasks/audio/transcriptions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form audio='@example-file' \
--form timestamps=falseimport requests
url = "https://api.sunbird.ai/tasks/audio/transcriptions"
files = { "audio": ("example-file", open("example-file", "rb")) }
payload = { "timestamps": "false" }
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('audio', '<string>');
form.append('timestamps', 'false');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.sunbird.ai/tasks/audio/transcriptions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sunbird.ai/tasks/audio/transcriptions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"timestamps\"\r\n\r\nfalse\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.sunbird.ai/tasks/audio/transcriptions"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"timestamps\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.sunbird.ai/tasks/audio/transcriptions")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"timestamps\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sunbird.ai/tasks/audio/transcriptions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"timestamps\"\r\n\r\nfalse\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"audio_transcription": "<string>",
"diarization_output": {},
"formatted_diarization_output": "<string>",
"audio_transcription_id": 123,
"audio_url": "<string>",
"language": "<string>",
"was_audio_trimmed": false,
"original_duration_minutes": 123,
"segments": [
{
"start": 123,
"end": 123,
"text": "<string>"
}
],
"duration_seconds": 123,
"usage": {
"type": "duration",
"seconds": 123,
"input_tokens": 123,
"output_tokens": 123,
"total_tokens": 123
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Speech to Text
Unified Speech-to-Text endpoint, powered by Sunbird’s faster-whisper ASR model covering 51 African languages. Accepts an uploaded audio file and a required language code; set timestamps=true to also receive per-segment timings. Replaces /stt, /stt_from_gcs, /org/stt, and /modal/stt.
curl --request POST \
--url https://api.sunbird.ai/tasks/audio/transcriptions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form audio='@example-file' \
--form timestamps=falseimport requests
url = "https://api.sunbird.ai/tasks/audio/transcriptions"
files = { "audio": ("example-file", open("example-file", "rb")) }
payload = { "timestamps": "false" }
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('audio', '<string>');
form.append('timestamps', 'false');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.sunbird.ai/tasks/audio/transcriptions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sunbird.ai/tasks/audio/transcriptions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"timestamps\"\r\n\r\nfalse\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.sunbird.ai/tasks/audio/transcriptions"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"timestamps\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.sunbird.ai/tasks/audio/transcriptions")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"timestamps\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sunbird.ai/tasks/audio/transcriptions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"timestamps\"\r\n\r\nfalse\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"audio_transcription": "<string>",
"diarization_output": {},
"formatted_diarization_output": "<string>",
"audio_transcription_id": 123,
"audio_url": "<string>",
"language": "<string>",
"was_audio_trimmed": false,
"original_duration_minutes": 123,
"segments": [
{
"start": 123,
"end": 123,
"text": "<string>"
}
],
"duration_seconds": 123,
"usage": {
"type": "duration",
"seconds": 123,
"input_tokens": 123,
"output_tokens": 123,
"total_tokens": 123
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
The access token received from the authorization server in the OAuth 2.0 flow.
Body
Audio file to transcribe.
Language of the audio (ISO 639-3). Required: this model reuses Whisper's language-token slots, so auto-detection is unreliable.
ach, afr, aka, amh, bam, bem, ber, cgg, dag, dga, eng, ewe, fra, ful, hau, ibo, kab, kau, kik, kin, kln, koo, kpo, led, lgg, lin, lth, lug, luo, luy, mlg, myx, nbl, nya, nyn, orm, pcm, ruc, rwm, sna, som, sot, swa, teo, tsn, ttj, wol, xho, xog, yor, zul Return per-segment start/end timestamps in 'segments'.
Response
Successful Response
Response model for speech-to-text transcription results.
This model represents the output of an STT transcription request, including the transcribed text, diarization data, and metadata.
Fields
audio_transcription— The transcribed text from the audio.diarization_output— Speaker diarization data as a dictionary.formatted_diarization_output— Human-readable diarization output.audio_transcription_id— Database ID of the saved transcription.audio_url— URL or path to the processed audio file.language— The language code used for transcription.was_audio_trimmed— Whether the audio was trimmed to max duration.original_duration_minutes— Original duration if audio was trimmed.
The transcribed text from the audio
Speaker diarization data
Human-readable diarization output
Database ID of the saved transcription
URL or path to the processed audio file
The language code used for transcription
Whether the audio was trimmed to max duration
Original duration in minutes if audio was trimmed
Timestamped segments. Only populated when the request sets timestamps=true
Show child attributes
Show child attributes
Duration of the transcribed audio in seconds
Usage for this transcription (audio duration in seconds)
Show child attributes
Show child attributes

