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.

Base URL https://api.voxparse.com
Content Type 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:

MethodHeaderExample
Custom HeaderX-API-KeyX-API-Key: vxp_live_abc123...
Bearer TokenAuthorizationAuthorization: Bearer vxp_live_abc123...
curl
curl https://api.voxparse.com/v1/balance \
  -H "X-API-Key: YOUR_API_KEY"
Python
import requests

headers = {"X-API-Key": "YOUR_API_KEY"}
r = requests.get("https://api.voxparse.com/v1/balance", headers=headers)
print(r.json())
Node.js
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 Response Format
{
  "error": {
    "message": "Invalid API key.",
    "code": 401
  }
}
CodeMeaningCommon Causes
400Bad RequestMissing required fields, invalid Content-Type
401UnauthorizedMissing or invalid API key
402Payment RequiredInsufficient balance for the requested operation
404Not FoundJob not found, result not available, invalid route
500Server ErrorUnexpected internal error
502Bad GatewayUpstream provider error (Stripe, LLM)
503Service UnavailableBackend not configured (e.g., LLM key missing)

Create Transcription

POST /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.

FieldTypeRequiredDescription
fileFileYesAudio file (mp3, wav, m4a, flac, ogg, webm). Max 25 MB.
languagestringNoISO 639-1 code (e.g. en, es). Auto-detected if omitted.
instructionsstringNoCustom 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

Response (abbreviated)
{
  "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
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"
Pricing: $0.49 per audio hour. Everything included - diarization, AI analysis, compliance, financial extraction, sentiment. Balance minimum is checked before accepting.

List Jobs

GET /v1/jobs

Returns your jobs in reverse chronological order.

Query Parameters

ParamTypeDefaultDescription
limitinteger20Max results per page (max 100)
offsetinteger0Number of results to skip

Response 200 OK

Response
{
  "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

GET /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

Response
{
  "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"
}
Job statuses: queued -> processing -> completed or failed

Get Result

GET /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)

Response
{
  "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..."
}
AI analysis: Only included when the job was submitted with plan=transcription-ai. Contains a structured analysis with summary, key topics, sentiment assessment, and action items.

Get Pricing

GET /v1/pricing

Returns the available transcription plans and their per-hour rates. No authentication required.

Response 200 OK

Response
{
  "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:

FieldTypeDescription
call_summarystringConcise summary of the entire call
call_typestringClassification: retention, sales, support, billing, complaint
call_outcomestringResolution: resolved, partial, escalated, unresolved
customerobjectname, company, email, phone (when mentioned)
agentobjectname, department, agent_id (when mentioned)
financialobjectpayment_today, recurring_amount, pending_balance, payment_method, billing_date
complianceobjectrecording_disclosure (bool), sensitive_data_shared (array of redacted PII)
sentimentobjectcustomer_sentiment, agent_performance (positive/negative/neutral/good/poor)
key_issuesarrayList of main problems discussed
action_itemsarrayFollow-up tasks identified in the call
agreementsarrayCommitments made by either party
transcript_cleanedstringFull diarized transcript with Agent: / Customer: labels
PCI Compliance: Credit card numbers, CVVs, and expiration dates are automatically detected and masked in the sensitive_data_shared array. Full numbers like 4532 6789 0123 8831 become 4532 **** **** 8831.

Get Balance

GET /v1/balance

Response 200 OK

Response
{
  "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

GET /billing/products

Lists available top-up amounts with bonus calculations. No authentication required.

Response 200 OK

Response
{
  "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."
}
Bonus tiers: $200+ gets a flat $10 bonus. $500+ gets a 10% bonus. Credits expire after 6 months of account inactivity.

Rate Limits

The VoxParse API uses Cloudflare's infrastructure and applies the following limits:

EndpointLimitWindow
All authenticated endpoints1,000 requestsPer minute
POST /v1/transcribe60 uploadsPer minute

Rate-limited requests receive a 429 Too Many Requests response. Use exponential backoff for retries.

SDKs & Examples

Python

Python - Full Example
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

Node.js - Full Example
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)

Python - OpenAI SDK Compatible
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}")