Quickstart
This is the fastest path from zero to a working API call.
If you are an AI coding agent: copy the Python or cURL block exactly; only replace YOUR_API_KEY and the audio file path.
Prerequisites
You need three things before calling the API:
- An account on the Theta One API Console — see Sign Up.
- Credits on the account — see Top Up Prepaid Credits. The Free plan starts with
$0.20, which is enough for ~8 minutes of STT. - An API key beginning with
sk-theta-— see API Keys.
Make your first call
- cURL
- Python
- Node.js
curl -X POST \
'https://stt.thetaone-ai.com/transcribe' \
-H 'accept: application/json' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: multipart/form-data' \
-F 'file=@audio.wav;type=audio/wav'
import requests
url = "https://stt.thetaone-ai.com/transcribe"
headers = {"x-api-key": "YOUR_API_KEY"}
with open("audio.wav", "rb") as f:
files = {"file": ("audio.wav", f, "audio/wav")}
response = requests.post(url, headers=headers, files=files, timeout=30)
response.raise_for_status()
result = response.json()
print(result["text"])
import fs from "node:fs";
const form = new FormData();
form.append(
"file",
new Blob([fs.readFileSync("audio.wav")], { type: "audio/wav" }),
"audio.wav"
);
const res = await fetch("https://stt.thetaone-ai.com/transcribe", {
method: "POST",
headers: { "x-api-key": "YOUR_API_KEY" },
body: form,
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json();
console.log(data.text);
A successful response looks like:
{
"text": "Welcome to Theta One AI!",
"text_type": "en",
"metadata": {},
"response_time_in_sec": 0.42
}
What to do next
Decide your integration path:
- Transcription only → stay on
/transcribe. Add options via STT additional features. - Pronunciation scoring → follow Choosing an API to pick between
/pronunciation(with native reference) and/pronunciation-simple(text-only).
Before going to production, read:
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
401 Unauthorized | Key missing / wrong / deactivated | Check x-api-key and that the key is active in the console |
402 PAYMENT_REQUIRED | Out of credits, or plan doesn't include the endpoint | Top up or upgrade — see Pricing |
429 RATE_LIMIT_EXCEEDED | Exceeded per-key RPM | Retry with backoff — see Rate Limits |
400 Bad Request with pronunciation | options not a JSON string, or NotAllWordsSpokenError | See Error Reference |