The API base URL is https://api.p99lab.com (streaming: wss://api.p99lab.com). Your key is in the
console.
Get a key
Sign up in the console (every new account starts with $100 of free credit, no card needed) and create a key under API keys. A key is shown once, so copy it somewhere safe straight away. Keep it in an environment variable:
export P99LAB_API_KEY="YOUR_API_KEY"
Check the endpoint
curl https://api.p99lab.com/healthz
{"ok": true, "model": "audrey-0.7"}
Send a recording
Send the audio file as the request body, or as a multipart form with a file part. The response is
JSON with the transcript in text.
curl
# The file as the request body
curl https://api.p99lab.com/v1/transcribe \
-H "Authorization: Bearer $P99LAB_API_KEY" \
--data-binary @call.wav
# Or as a multipart form, with options as fields
curl https://api.p99lab.com/v1/transcribe \
-H "Authorization: Bearer $P99LAB_API_KEY" \
-F file=@call.wav \
-F language=en \
-F format=truePython
import os
import requests
with open("call.wav", "rb") as f:
r = requests.post(
"https://api.p99lab.com/v1/transcribe",
headers={"Authorization": f"Bearer {os.environ['P99LAB_API_KEY']}"},
files={"file": f},
data={"language": "en", "format": "true"},
timeout=900,
)
body = r.json()
if not r.ok:
detail = body["detail"]
raise SystemExit(detail if isinstance(detail, str) else detail["message"])
print(body["text"])Node.js
import { readFile } from "node:fs/promises";
const form = new FormData();
form.append("file", new Blob([await readFile("call.wav")]), "call.wav");
form.append("language", "en");
form.append("format", "true");
const res = await fetch("https://api.p99lab.com/v1/transcribe", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.P99LAB_API_KEY}` },
body: form,
});
const body = await res.json();
if (!res.ok) {
throw new Error(typeof body.detail === "string" ? body.detail : body.detail.message);
}
console.log(body.text);Response:
{
"text": "Thanks for calling. How can I help you today?",
"audio_seconds": 12.84,
"model": "audrey-0.7",
"formatted": true
}
Stream live audio
For live calls, open a WebSocket, send one JSON configuration message, then 16-bit PCM audio. Finals arrive as each utterance ends. A complete client is on live streaming.
Next steps
- Transcribe files Options, long recordings and the context prompt.
- Live streaming Partials, finals, flush and turn detection.
- Written forms Numbers, amounts and times as people write them.
- Errors and limits What each error means and what to do about it.