VoxParse API Reference

The VoxParse API provides audio transcription with speaker diarization, an OpenAI-compatible LLM endpoint (Apex), and prepaid billing — all through a single API key.

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. The file is stored, a job is created with status queued, and processing begins asynchronously. Poll GET /v1/jobs/{id} for status updates.

Request

Content-Type must be multipart/form-data.

FieldTypeRequiredDescription
fileFileYesAudio file (mp3, wav, m4a, flac, ogg, webm)
modelstringNostandard (default) or premium
languagestringNoISO 639-1 code (e.g. en, es). Auto-detected if omitted.
promptstringNoOptional context hint to improve accuracy

Response 201 Created

Response
{
  "job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "status": "queued",
  "model": "standard",
  "message": "Job queued for processing."
}
curl
curl -X POST https://api.voxparse.com/v1/transcribe \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "[email protected]" \
  -F "model=standard" \
  -F "language=en"
Balance check: The API validates your balance before accepting the job. Standard model requires minimum $0.30, premium requires minimum $0.72. Returns 402 if insufficient.

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: queuedprocessingcompleted 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.

Chat Completions (Apex)

POST /v1/apex/chat/completions

OpenAI-compatible chat completions endpoint powered by DeepSeek V3.2. Drop-in replacement for OpenAI — use any compatible SDK by changing the base URL.

Request Body

FieldTypeDefaultDescription
modelstringUse apex-latest (maps to DeepSeek V3.2)
messagesarrayArray of {role, content} objects
max_tokensinteger4096Maximum tokens to generate
temperaturenumber0.7Sampling temperature (0–2)
streambooleanfalseEnable SSE streaming

Response 200 OK

Response
{
  "id": "a1300fb2...",
  "object": "chat.completion",
  "created": 1776625997,
  "model": "deepseek/deepseek-v3.2",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Hello! How can I help you today?"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 18,
    "completion_tokens": 10,
    "total_tokens": 28
  }
}
curl
curl -X POST https://api.voxparse.com/v1/apex/chat/completions \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "apex-latest",
    "messages": [{"role": "user", "content": "Hello"}],
    "max_tokens": 100,
    "temperature": 0.7
  }'
Python (OpenAI SDK)
from openai import OpenAI

client = OpenAI(
    base_url="https://api.voxparse.com/v1/apex",
    api_key="YOUR_API_KEY"
)

response = client.chat.completions.create(
    model="apex-latest",
    messages=[{"role": "user", "content": "Hello"}]
)
print(response.choices[0].message.content)
Pricing: ~$0.15 per million tokens. Each request costs a minimum of 1¢. Usage is metered and deducted from your prepaid balance.

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,"bonus_dollars":"0.00","total_credit_cents":1000,"total_credit_dollars":"10.00"},
    {"amount_cents":5000,"amount_dollars":"50.00","bonus_cents":0,"bonus_dollars":"0.00","total_credit_cents":5000,"total_credit_dollars":"50.00"},
    {"amount_cents":20000,"amount_dollars":"200.00","bonus_cents":1000,"bonus_dollars":"10.00","total_credit_cents":21000,"total_credit_dollars":"210.00"},
    {"amount_cents":50000,"amount_dollars":"500.00","bonus_cents":5000,"bonus_dollars":"50.00","total_credit_cents":55000,"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
POST /v1/apex/chat/completions500 requestsPer 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={"model": "standard", "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("model", "standard");

  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}")