Transcribe audio
curl --request POST \
--url https://api.typelessapi.com/v1/transcribe \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"language": "<string>"
}
'import requests
url = "https://api.typelessapi.com/v1/transcribe"
payload = {
"model": "<string>",
"language": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({model: '<string>', language: '<string>'})
};
fetch('https://api.typelessapi.com/v1/transcribe', 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.typelessapi.com/v1/transcribe",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'model' => '<string>',
'language' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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.typelessapi.com/v1/transcribe"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"language\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
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.typelessapi.com/v1/transcribe")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"language\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.typelessapi.com/v1/transcribe")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"<string>\",\n \"language\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "<string>",
"result": {
"transcript": "<string>",
"detected_language": {},
"duration_seconds": 123
},
"usage": {
"billed_audio_seconds": 123,
"output_token_count": 123
},
"request_id": "<string>"
}Endpoints
Transcribe audio
Submit a pre-recorded audio file and receive a refined transcript with usage metadata.
POST
/
v1
/
transcribe
Transcribe audio
curl --request POST \
--url https://api.typelessapi.com/v1/transcribe \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"language": "<string>"
}
'import requests
url = "https://api.typelessapi.com/v1/transcribe"
payload = {
"model": "<string>",
"language": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({model: '<string>', language: '<string>'})
};
fetch('https://api.typelessapi.com/v1/transcribe', 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.typelessapi.com/v1/transcribe",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'model' => '<string>',
'language' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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.typelessapi.com/v1/transcribe"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"language\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
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.typelessapi.com/v1/transcribe")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"language\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.typelessapi.com/v1/transcribe")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"<string>\",\n \"language\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "<string>",
"result": {
"transcript": "<string>",
"detected_language": {},
"duration_seconds": 123
},
"usage": {
"billed_audio_seconds": 123,
"output_token_count": 123
},
"request_id": "<string>"
}Transcribe a single pre-recorded audio file. Request body is
For the full list of error codes and handling guidance, see Errors.
multipart/form-data.
Request
Audio file to transcribe. Supported formats:
wav, ogg, webm. Max size 50 MB; max duration 300 seconds (default).Model tier. One of
typeless-1.0-lite, typeless-1.0-pro, typeless-1.0-max. See Models & Pricing.Optional ISO 639-1 language hint (for example
en, zh). When omitted — or when an unsupported/unrecognized code is supplied — the language is detected automatically and reported in detected_language.Response
"success" on success.26-character ULID for support.
Example
curl -X POST https://api.typelessapi.com/v1/transcribe \
-H "Authorization: Token $TYPELESS_API_KEY" \
-F "audio=@meeting.wav" \
-F "model=typeless-1.0-pro"
import os
import requests
with open("meeting.wav", "rb") as f:
resp = requests.post(
"https://api.typelessapi.com/v1/transcribe",
headers={"Authorization": f"Token {os.environ['TYPELESS_API_KEY']}"},
files={"audio": f},
data={"model": "typeless-1.0-pro"},
)
print(resp.json())
import fs from "node:fs";
const form = new FormData();
form.append("audio", new Blob([fs.readFileSync("meeting.wav")]), "meeting.wav");
form.append("model", "typeless-1.0-pro");
const resp = await fetch("https://api.typelessapi.com/v1/transcribe", {
method: "POST",
headers: { Authorization: `Token ${process.env.TYPELESS_API_KEY}` },
body: form,
});
console.log(await resp.json());
200
{
"status": "success",
"result": {
"transcript": "Let's move the launch to next Thursday and loop in the design team early.",
"detected_language": "en",
"duration_seconds": 42.5
},
"usage": {
"billed_audio_seconds": 42.5,
"output_token_count": 128
},
"request_id": "01JXXXXXXXXXXXXXXXXXXXXXXX"
}
Endpoint-specific errors
| HTTP status | Error code | Description |
|---|---|---|
| 400 | INVALID_REQUEST | model field is missing or the value is not a recognized model identifier. |
| 400 | AUDIO_FORMAT_UNSUPPORTED | The uploaded file is not in a supported format (wav, ogg, webm). |
| 413 | AUDIO_TOO_LONG | Audio duration exceeds the 300-second limit. |
| 413 | FILE_TOO_LARGE | File size exceeds the 50 MB limit. |
400
{
"status": "error",
"error": {
"code": "INVALID_REQUEST",
"message": "model is required"
},
"request_id": "01JXXXXXXXXXXXXXXXXXXXXXXX"
}
⌘I