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.
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. 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.
| Field | Type | Required | Description |
|---|---|---|---|
file | File | Yes | Audio file (mp3, wav, m4a, flac, ogg, webm) |
model | string | No | standard (default) or premium |
language | string | No | ISO 639-1 code (e.g. en, es). Auto-detected if omitted. |
prompt | string | No | Optional context hint to improve accuracy |
Response 201 Created
{
"job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "queued",
"model": "standard",
"message": "Job queued for processing."
}
curl -X POST https://api.voxparse.com/v1/transcribe \
-H "X-API-Key: YOUR_API_KEY" \
-F "file=@recording.mp3" \
-F "model=standard" \
-F "language=en"
402 if insufficient.
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.
Chat Completions (Apex)
/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
| Field | Type | Default | Description |
|---|---|---|---|
model | string | — | Use apex-latest (maps to DeepSeek V3.2) |
messages | array | — | Array of {role, content} objects |
max_tokens | integer | 4096 | Maximum tokens to generate |
temperature | number | 0.7 | Sampling temperature (0–2) |
stream | boolean | false | Enable SSE streaming |
Response 200 OK
{
"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 -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
}'
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)
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,"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."
}
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 |
POST /v1/apex/chat/completions | 500 requests | 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={"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
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)
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}")