VoxParse API Reference
The VoxParse API provides audio transcription with AI-powered diarization, PCI compliance detection, financial extraction, and sentiment analysis - all in a single synchronous API call. $0.49/hr, everything included.
https://api.voxparse.com
application/json for most endpoints, multipart/form-data for file uploads
Authentication
All API requests (except /health) require authentication via an API key. Pass it using either method:
| Method | Header | Example |
|---|---|---|
| Custom Header | X-API-Key | X-API-Key: vxp_live_abc123... |
| Bearer Token | Authorization | Authorization: Bearer vxp_live_abc123... |
curl https://api.voxparse.com/v1/balance \
-H "X-API-Key: YOUR_API_KEY"
import requests
headers = {"X-API-Key": "YOUR_API_KEY"}
r = requests.get("https://api.voxparse.com/v1/balance", headers=headers)
print(r.json())
const res = await fetch("https://api.voxparse.com/v1/balance", {
headers: { "X-API-Key": "YOUR_API_KEY" }
});
const data = await res.json();
console.log(data);
Error Handling
All errors return a JSON object with an error field containing message and code:
{
"error": {
"message": "Invalid API key.",
"code": 401
}
}
| Code | Meaning | Common Causes |
|---|---|---|
400 | Bad Request | Missing required fields, invalid Content-Type |
401 | Unauthorized | Missing or invalid API key |
402 | Payment Required | Insufficient balance for the requested operation |
404 | Not Found | Job not found, result not available, invalid route |
500 | Server Error | Unexpected internal error |
502 | Bad Gateway | Upstream provider error (Stripe, LLM) |
503 | Service Unavailable | Backend not configured (e.g., LLM key missing) |
Create Transcription
/v1/transcribe
Upload an audio file for transcription. Returns a synchronous response with the full transcript, AI analysis, diarization, compliance flags, and financial data. No polling required - everything comes back in one request (~12 seconds for a 46-minute call).
Request
Content-Type must be multipart/form-data.
| Field | Type | Required | Description |
|---|---|---|---|
file | File | Yes | Audio file (mp3, wav, m4a, flac, ogg, webm). Max 25 MB. |
language | string | No | ISO 639-1 code (e.g. en, es). Auto-detected if omitted. |
instructions | string | No | Custom AI instructions appended to the analysis prompt. Max 2,000 characters. Use this to request additional data extraction, custom classifications, or industry-specific analysis. |
Response 200 OK
{
"job_id": "44e52a2f-55a3-4230-b682-14040716d1f5",
"status": "completed",
"duration_seconds": 1845.072,
"cost_cents": 250542,
"result_url": "/v1/jobs/44e52a2f-.../result",
"ai_analysis": {
"call_summary": "Customer called about a billing discrepancy on March invoice. Agent issued $75 credit and adjusted rate to $149.99/mo...",
"call_type": "billing",
"call_outcome": "resolved",
"customer": { "name": "James Rivera", "company": "Greenfield Dental Group", "email": "[email protected]" },
"agent": { "name": "Karen", "department": "Billing Support" },
"financial": { "credit_issued": "$75.00", "recurring_amount": "$149.99", "payment_method": "Visa ending in 8831" },
"compliance": { "recording_disclosure": true, "sensitive_data_shared": ["Credit card 4532 **** **** 8831"] },
"sentiment": { "customer_sentiment": "neutral", "agent_performance": "excellent" },
"key_issues": ["Double charge on March invoice", "Rate increase not communicated"],
"action_items": ["Issue $75 credit", "Adjust rate to $149.99/mo", "Send updated invoice"],
"transcript_cleaned": "Agent: Thank you for calling. How can I help you today?\nCustomer: Hi, I noticed a charge on my March invoice that doesn't look right...."
}
}
curl -X POST https://api.voxparse.com/v1/transcribe \
-H "X-API-Key: YOUR_API_KEY" \
-F "[email protected]" \
-F "instructions=Also extract any product SKUs and warranty terms discussed"
List Jobs
/v1/jobs
Returns your jobs in reverse chronological order.
Query Parameters
| Param | Type | Default | Description |
|---|---|---|---|
limit | integer | 20 | Max results per page (max 100) |
offset | integer | 0 | Number of results to skip |
Response 200 OK
{
"jobs": [
{
"id": "a1b2c3d4-...",
"status": "completed",
"type": "transcribe",
"model": "standard",
"duration_seconds": 3600,
"cost_cents": 30,
"created_at": "2026-04-19 19:13:18",
"completed_at": "2026-04-19 19:15:22"
}
],
"limit": 20,
"offset": 0
}
Get Job
/v1/jobs/{job_id}
Returns the full details of a single job. When status is completed and a result exists, a result_url field is included.
Response 200 OK
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "completed",
"type": "transcribe",
"model": "standard",
"duration_seconds": 3600,
"cost_cents": 30,
"created_at": "2026-04-19 19:13:18",
"completed_at": "2026-04-19 19:15:22",
"error": null,
"result_url": "/v1/jobs/a1b2c3d4-.../result"
}
queued -> processing -> completed or failed
Get Result
/v1/jobs/{job_id}/result
Downloads the transcription result as JSON. Only available for jobs with status completed.
Returns 404 if the job is not completed or the result file is not found.
Result Fields (Transcription + AI plan)
{
"transcript": "Full text of transcription...",
"duration_seconds": 3600,
"segments": [{"start": 0.0, "end": 2.5, "speaker": "SPEAKER_00", "text": "..."}],
"speakers": ["SPEAKER_00", "SPEAKER_01"],
"language": "en",
"word_timestamps": [{"word": "hello", "start": 0.1, "end": 0.4}],
"ai_analysis": "Summary, key topics, sentiment, action items..."
}
plan=transcription-ai. Contains a structured analysis with summary, key topics, sentiment assessment, and action items.
Get Pricing
/v1/pricing
Returns the available transcription plans and their per-hour rates. No authentication required.
Response 200 OK
{
"plans": [
{
"id": "pro",
"name": "VoxParse Pro",
"price_per_hour": 0.49,
"price_per_hour_display": "$0.49",
"includes": ["diarization", "ai_analysis", "compliance", "financial", "sentiment", "timestamps"]
}
]
}
AI Analysis Object
Every transcription response includes an ai_analysis object with the following fields:
| Field | Type | Description |
|---|---|---|
call_summary | string | Concise summary of the entire call |
call_type | string | Classification: retention, sales, support, billing, complaint |
call_outcome | string | Resolution: resolved, partial, escalated, unresolved |
customer | object | name, company, email, phone (when mentioned) |
agent | object | name, department, agent_id (when mentioned) |
financial | object | payment_today, recurring_amount, pending_balance, payment_method, billing_date |
compliance | object | recording_disclosure (bool), sensitive_data_shared (array of redacted PII) |
sentiment | object | customer_sentiment, agent_performance (positive/negative/neutral/good/poor) |
key_issues | array | List of main problems discussed |
action_items | array | Follow-up tasks identified in the call |
agreements | array | Commitments made by either party |
transcript_cleaned | string | Full diarized transcript with Agent: / Customer: labels |
sensitive_data_shared array. Full numbers like 4532 6789 0123 8831 become 4532 **** **** 8831.
Get Balance
/v1/balance
Response 200 OK
{
"balance_cents": 9998,
"balance_dollars": "99.98",
"expired": false,
"recent_topups": [
{
"amount_cents": 5000,
"bonus_cents": 0,
"created_at": "2026-04-19 18:00:00"
}
]
}
Billing Products
/billing/products
Lists available top-up amounts with bonus calculations. No authentication required.
Response 200 OK
{
"products": [
{"amount_cents":1000,"amount_dollars":"10.00","bonus_cents":0,"total_credit_dollars":"10.00"},
{"amount_cents":5000,"amount_dollars":"50.00","bonus_cents":0,"total_credit_dollars":"50.00"},
{"amount_cents":20000,"amount_dollars":"200.00","bonus_cents":1000,"total_credit_dollars":"210.00"},
{"amount_cents":50000,"amount_dollars":"500.00","bonus_cents":5000,"total_credit_dollars":"550.00"}
],
"currency": "usd",
"note": "Credits expire after 6 months of account inactivity."
}
Rate Limits
The VoxParse API uses Cloudflare's infrastructure and applies the following limits:
| Endpoint | Limit | Window |
|---|---|---|
| All authenticated endpoints | 1,000 requests | Per minute |
POST /v1/transcribe | 60 uploads | Per minute |
Rate-limited requests receive a 429 Too Many Requests response. Use exponential backoff for retries.
SDKs & Examples
Python
import requests
import time
API_KEY = "YOUR_API_KEY"
BASE = "https://api.voxparse.com"
headers = {"X-API-Key": API_KEY}
# 1. Upload audio
with open("recording.mp3", "rb") as f:
r = requests.post(f"{BASE}/v1/transcribe",
headers=headers,
files={"file": f},
data={"plan": "transcription-ai", "language": "en"})
job = r.json()
job_id = job["job_id"]
print(f"Job created: {job_id}")
# 2. Poll for completion
while True:
r = requests.get(f"{BASE}/v1/jobs/{job_id}", headers=headers)
status = r.json()["status"]
print(f"Status: {status}")
if status in ("completed", "failed"):
break
time.sleep(5)
# 3. Download result
if status == "completed":
r = requests.get(f"{BASE}/v1/jobs/{job_id}/result", headers=headers)
transcript = r.json()
print(transcript)
Node.js
const fs = require("fs");
const API_KEY = "YOUR_API_KEY";
const BASE = "https://api.voxparse.com";
const headers = { "X-API-Key": API_KEY };
async function transcribe(filePath) {
// 1. Upload
const form = new FormData();
form.append("file", new Blob([fs.readFileSync(filePath)]));
form.append("plan", "transcription-ai");
const { job_id } = await fetch(`${BASE}/v1/transcribe`, {
method: "POST", headers, body: form
}).then(r => r.json());
console.log(`Job: ${job_id}`);
// 2. Poll
let status;
do {
await new Promise(r => setTimeout(r, 5000));
const job = await fetch(`${BASE}/v1/jobs/${job_id}`, { headers })
.then(r => r.json());
status = job.status;
console.log(`Status: ${status}`);
} while (!["completed","failed"].includes(status));
// 3. Result
if (status === "completed") {
const result = await fetch(`${BASE}/v1/jobs/${job_id}/result`,
{ headers }).then(r => r.json());
return result;
}
}
transcribe("recording.mp3").then(console.log);
OpenAI SDK (Apex LLM)
from openai import OpenAI
# Point the OpenAI SDK at VoxParse
client = OpenAI(
base_url="https://api.voxparse.com/v1/apex",
api_key="YOUR_VOXPARSE_API_KEY"
)
# Works exactly like the OpenAI API
response = client.chat.completions.create(
model="apex-latest",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Summarize this transcript..."}
],
max_tokens=1000,
temperature=0.3
)
print(response.choices[0].message.content)
print(f"Tokens used: {response.usage.total_tokens}")