Authentication
All requests require a bearer token in the Authorization header.
Authorization: Bearer ct_live_••••••••
Generate keys in your dashboard after signing in. Keys are bcrypt-hashed at rest and shown only once at creation.
Rate limits
30 requests per minute and 1000 requests per day per key. Exceeding either returns 429.
POST /api/v1/runs
Submit an audio file for transcription + insight extraction.
POST /api/v1/runs
Content-Type: multipart/form-data
Authorization: Bearer $KEY
Fields:
audio binary required (mp3, wav, m4a, webm; max 200 MB)
template_slug string required (e.g. "sales-discovery")
→ 202 Accepted
{
"run_id": "uuid",
"status": "queued",
"created_at": "2026-06-15T12:00:00Z"
}GET /api/v1/runs/:id
Poll for status and results. When status === "done", transcript, executive summary, and insights are populated.
GET /api/v1/runs/{run_id}
Authorization: Bearer $KEY
→ 200 OK
{
"run": { "id", "status", "duration_sec", "language", "templates": { "slug", "name" } },
"transcript": { "full_text", "segments": [{ "speaker", "start", "end", "text" }], "language" },
"executive_summary": { "summary", "key_takeaways": [], "recommended_actions": [], "risk_flags": [], "sentiment" },
"insights": [
{ "category", "key", "label", "value", "confidence", "evidence_quote", "evidence_timestamp" }
]
}GET /api/v1/templates
List all built-in templates and their insight schemas.
GET /api/v1/templates
Authorization: Bearer $KEY
→ 200 OK
{ "templates": [{ "slug", "name", "category", "short_description", "insight_schema" }] }Errors
All errors return { error: { code, message } } with appropriate HTTP status.
401 missing_bearer / invalid_key400 invalid_body / missing_audio / missing_template404 template_not_found / not_found413 file_too_large429 rate_limited_minute / rate_limited_day