Authentication

Every request needs an Authorization header. Tokens start with vox_live_. Mint a key from Settings → Provider API keys; scope read or write decides which endpoints accept it.

Contacts
GET/api/v1/contacts?page=1&q=rahulread

List contacts in your org, newest first. Optional ?q substring matches name / phone / email.

Example
curl -H "Authorization: Bearer vox_live_xxx" \
  "https://your-dashboard.example.com/api/v1/contacts?page=1&q=rahul"
Response
{
  "contacts": [
    {
      "id": "8c4a…",
      "name": "Rahul Sharma",
      "phone": "+919876543210",
      "email": "rahul@example.com",
      "role": "Founder",
      "lifecycle_stage": "lead",
      "preferred_channel": "call",
      "dnc": false,
      "account_name": "Acme Corp",
      "created_at": "2026-05-28T09:00:00Z",
      "updated_at": "2026-05-28T09:00:00Z"
    }
  ],
  "page": 1,
  "page_size": 100,
  "total": 1
}
POST/api/v1/contactswrite

Create a contact, or update name/email/role on an existing match by phone.

Example
curl -X POST "https://your-dashboard.example.com/api/v1/contacts" \
  -H "Authorization: Bearer vox_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "+91 98765 43210",
    "name": "Rahul Sharma",
    "email": "rahul@example.com",
    "role": "Founder",
    "source": "zapier"
  }'
Response
{ "id": "8c4a…", "created": true }
GET/api/v1/contacts/{id}read

Full contact record by id.

Example
curl -H "Authorization: Bearer vox_live_xxx" \
  "https://your-dashboard.example.com/api/v1/contacts/8c4a…"
Response
{
  "id": "8c4a…",
  "name": "Rahul Sharma",
  "phone": "+919876543210",
  "lifecycle_stage": "engaged",
  …
}
PATCH/api/v1/contacts/{id}write

Update any subset of name / email / role / lifecycle_stage / preferred_channel / dnc / owner.

Example
curl -X PATCH "https://your-dashboard.example.com/api/v1/contacts/8c4a…" \
  -H "Authorization: Bearer vox_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{ "lifecycle_stage": "engaged", "dnc": false }'
Response
{ "ok": true }
Deals
GET/api/v1/deals?status=openread

List deals filtered by status (open / won / lost / all).

Example
curl -H "Authorization: Bearer vox_live_xxx" \
  "https://your-dashboard.example.com/api/v1/deals?status=open"
Response
{
  "deals": [
    {
      "id": "abc1…",
      "title": "DSA Sathi — Pro",
      "stage": "qualified",
      "status": "open",
      "value": 50000,
      "currency": "INR",
      "contact_id": "8c4a…",
      "contact_name": "Rahul Sharma",
      …
    }
  ],
  "page": 1,
  "page_size": 100
}
POST/api/v1/dealswrite

Create a deal under an existing contact.

Example
curl -X POST "https://your-dashboard.example.com/api/v1/deals" \
  -H "Authorization: Bearer vox_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "contact_id": "8c4a…",
    "title": "DSA Sathi — Pro",
    "value": 50000,
    "currency": "INR",
    "stage": "qualified",
    "source": "zapier"
  }'
Response
{ "id": "abc1…" }
Rate limits + errors
  • 401 — missing or invalid bearer token.
  • 403 — token is read-only but you hit a write endpoint.
  • 404 — id not found in your org.
  • 422 — payload validation failed; body has { error: "…" }.

No hard rate limit yet — abuse cases will land as 429 when the ops team observes them. Treat this as a fair-use API.