curl --request POST \
--url https://api.sully.ai/v2/audio/transcriptions \
--header 'Content-Type: multipart/form-data' \
--header 'X-API-Key: <api-key>' \
--header 'X-Account-Id: <api-key>' \
--form 'audio=@example-file;type=audio/wav' \
--form language=en \
--form encoding=linear16 \
--form multichannel=false \
--form dictation=falseimport requests
url = "https://api.sully.ai/v2/audio/transcriptions"
files = { "audio": ("example-file", open("example-file", "rb"), "audio/wav") }
payload = {
"language": "en",
"encoding": "linear16",
"multichannel": "false",
"dictation": "false"
}
headers = {
"X-API-Key": "<api-key>",
"X-Account-Id": "<api-key>"
}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('audio', '<string>');
form.append('language', 'en');
form.append('encoding', 'linear16');
form.append('multichannel', 'false');
form.append('dictation', 'false');
const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'X-Account-Id': '<api-key>'}
};
options.body = form;
fetch('https://api.sully.ai/v2/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.sully.ai/v2/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: audio/wav\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\nen\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"encoding\"\r\n\r\nlinear16\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"multichannel\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"dictation\"\r\n\r\nfalse\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"X-API-Key: <api-key>",
"X-Account-Id: <api-key>"
],
]);
$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.sully.ai/v2/audio/transcriptions"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: audio/wav\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\nen\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"encoding\"\r\n\r\nlinear16\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"multichannel\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"dictation\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("X-Account-Id", "<api-key>")
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.sully.ai/v2/audio/transcriptions")
.header("X-API-Key", "<api-key>")
.header("X-Account-Id", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: audio/wav\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\nen\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"encoding\"\r\n\r\nlinear16\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"multichannel\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"dictation\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sully.ai/v2/audio/transcriptions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["X-Account-Id"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: audio/wav\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\nen\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"encoding\"\r\n\r\nlinear16\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"multichannel\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"dictation\"\r\n\r\nfalse\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"data": {
"id": "tr_abc123def456",
"status": "pending",
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z"
}
}Create Audio Transcription
Upload an audio file for transcription
Processing is asynchronous - the endpoint returns immediately with a pending status.
Use GET /v2/audio/transcriptions/{id} with the returned transcription ID to check status and retrieve results.
curl --request POST \
--url https://api.sully.ai/v2/audio/transcriptions \
--header 'Content-Type: multipart/form-data' \
--header 'X-API-Key: <api-key>' \
--header 'X-Account-Id: <api-key>' \
--form 'audio=@example-file;type=audio/wav' \
--form language=en \
--form encoding=linear16 \
--form multichannel=false \
--form dictation=falseimport requests
url = "https://api.sully.ai/v2/audio/transcriptions"
files = { "audio": ("example-file", open("example-file", "rb"), "audio/wav") }
payload = {
"language": "en",
"encoding": "linear16",
"multichannel": "false",
"dictation": "false"
}
headers = {
"X-API-Key": "<api-key>",
"X-Account-Id": "<api-key>"
}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('audio', '<string>');
form.append('language', 'en');
form.append('encoding', 'linear16');
form.append('multichannel', 'false');
form.append('dictation', 'false');
const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'X-Account-Id': '<api-key>'}
};
options.body = form;
fetch('https://api.sully.ai/v2/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.sully.ai/v2/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: audio/wav\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\nen\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"encoding\"\r\n\r\nlinear16\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"multichannel\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"dictation\"\r\n\r\nfalse\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"X-API-Key: <api-key>",
"X-Account-Id: <api-key>"
],
]);
$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.sully.ai/v2/audio/transcriptions"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: audio/wav\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\nen\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"encoding\"\r\n\r\nlinear16\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"multichannel\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"dictation\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("X-Account-Id", "<api-key>")
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.sully.ai/v2/audio/transcriptions")
.header("X-API-Key", "<api-key>")
.header("X-Account-Id", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: audio/wav\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\nen\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"encoding\"\r\n\r\nlinear16\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"multichannel\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"dictation\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sully.ai/v2/audio/transcriptions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["X-Account-Id"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: audio/wav\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\nen\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"encoding\"\r\n\r\nlinear16\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"multichannel\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"dictation\"\r\n\r\nfalse\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"data": {
"id": "tr_abc123def456",
"status": "pending",
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z"
}
}dictation field. Send dictation=true to request dictation-oriented
transcript formatting. If omitted, dictation defaults to false.Authorizations
Required together with the other Sully authentication header.
Required together with the other Sully authentication header.
Body
Multipart upload: one audio file, at most 16 text fields (16 KiB each), and 17 parts total. Boolean fields use the strings true or false on the wire.
One binary audio file, maximum 100 MiB (104857600 bytes). Send its actual supported audio Content-Type; application/octet-stream is rejected.
Language code for the audio content. Different models are used based on language
en, en-US, es, de, fr, hi, it, ja, nl, pt, ru, bg, ca, zh, zh-CN, zh-Hans, zh-TW, zh-Hant, zh-HK, cs, da, da-DK, en-AU, en-GB, en-NZ, en-IN, et, fi, nl-BE, fr-CA, de-CH, el, hu, id, ko, ko-KR, lv, lt, ms, no, pl, pt-BR, pt-PT, ro, sk, es-419, sv, sv-SE, th, th-TH, tr, uk, vi "en"
Audio encoding format. Optional - if not specified, the API will auto-detect. Common formats:
linear16: 16-bit linear PCMflac: Free Lossless Audio Codecmulaw: μ-law encodingogg_opus: Opus codec in OGG containerwebm_opus: Opus codec in WebM container
linear16, flac, mulaw, amr, amr_wb, ogg_opus, speex, webm_opus "linear16"
Enable multichannel audio processing
Enable dictation-oriented transcript formatting. Defaults to false when omitted. When sent as multipart form-data, provide true or false.
Response
Transcription created successfully
Show child attributes
Show child attributes