Transcribe an audio file in three steps. You need an account on the platform app and an audio file to send.
Create an API key
Sign in at platform.navana.ai, open API Keys in the sidebar, and click Create API Key. The key is shown in full exactly once, at creation, so copy it now.
export BODHI_API_KEY="bd_xxxxxxxxxxxx.xxxxxxxx…"Keys look like bd_<prefix>.<secret>. Only a hash of the secret is stored,
so a lost key cannot be recovered and you create a new one instead. See
API keys for the full lifecycle.
Transcribe a file
Post the file to the transcription endpoint with your key in the
X-Api-Key header. Pick a model that matches your audio’s language. The
full list is in Models and languages.
curl -X POST https://stt.navana.ai/api/transcribe \
-H "X-Api-Key: $BODHI_API_KEY" \
-F "model=hi-banking-v2-8khz" \
-F "transaction_id=$(uuidgen)" \
-F "aux=true" \
-F "audio_file=@recording.wav"import os, uuid, requests
response = requests.post(
"https://stt.navana.ai/api/transcribe",
headers={"X-Api-Key": os.environ["BODHI_API_KEY"]},
data={
"model": "hi-banking-v2-8khz",
"transaction_id": str(uuid.uuid4()),
"aux": "true",
},
files={"audio_file": ("recording.wav", open("recording.wav", "rb"), "audio/wav")},
timeout=120,
)
response.raise_for_status()
print(response.json()["text"])import { openAsBlob } from 'node:fs'
const form = new FormData()
form.set('model', 'hi-banking-v2-8khz')
form.set('transaction_id', crypto.randomUUID())
form.set('aux', 'true')
form.set('audio_file', await openAsBlob('recording.wav'), 'recording.wav')
const res = await fetch('https://stt.navana.ai/api/transcribe', {
method: 'POST',
headers: { 'X-Api-Key': process.env.BODHI_API_KEY! },
body: form,
})
if (!res.ok) throw new Error(await res.text())
const { text } = await res.json()
console.log(text)package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"mime/multipart"
"net/http"
"os"
"github.com/google/uuid"
)
func main() {
file, err := os.Open("recording.wav")
if err != nil {
panic(err)
}
defer file.Close()
var body bytes.Buffer
form := multipart.NewWriter(&body)
form.WriteField("model", "hi-banking-v2-8khz")
form.WriteField("transaction_id", uuid.NewString())
form.WriteField("aux", "true")
part, _ := form.CreateFormFile("audio_file", "recording.wav")
io.Copy(part, file)
form.Close()
req, _ := http.NewRequest(http.MethodPost,
"https://stt.navana.ai/api/transcribe", &body)
req.Header.Set("X-Api-Key", os.Getenv("BODHI_API_KEY"))
req.Header.Set("Content-Type", form.FormDataContentType())
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var out struct {
Text string `json:"text"`
CallID string `json:"call_id"`
}
json.NewDecoder(resp.Body).Decode(&out)
fmt.Println(out.Text)
}transaction_id is yours to generate and has to be a valid UUID. It is how
you tie this request to your own logs.
Read the response
{
"text": "बिल्कुल आपकी पूरी सहायता की जाएगी",
"call_id": "f99e79ca-6a2b-42f1-8d6b-fd0855e791de",
"status": "success"
}text is the full transcript and status is success or error. Because
the request set aux=true, the response also carries an aux_info object
with per-segment timings, tokens, and confidence scores. Those are what you
use to align a transcript against playback, or to flag low-confidence spans
for review. See the API reference for every
field.
What you were charged
The call drew down your account’s credit balance, metered on the audio’s duration. Your balance and per-request usage are on the Usage & Analytics and Billing pages in the platform.