VoiceOrbit

API reference

Base URL https://voiceorbit.p.nextaweb.com/api/v1 · JSON in, JSON out · version 1.0.1

Authentication

Create a key in Settings → API keys, choose its scopes, and send it as a bearer token. Keys can be limited to IP addresses and given an expiry date.

curl https://voiceorbit.p.nextaweb.com/api/v1/me -H "Authorization: Bearer vk_live_XXXXXXXX_your-secret"

Errors, pagination & limits

  • Errors look like {"error":{"code":"validation_failed","message":"…"}} with a matching HTTP status (401, 402 out of credits, 403, 404, 409, 422, 429).
  • List endpoints use cursor pagination: ?limit=50&cursor=… → {"data":[…],"has_more":true,"next_cursor":"…"}.
  • Rate limits depend on your plan; every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; 429 responses include Retry-After.
  • Send Idempotency-Key on POST /calls and POST /campaigns so a retried request never dials twice.
  • Calls via the API follow the same credit, DND, calling-hours and concurrency rules as the dashboard.

Webhooks

Events: call.started, call.answered, call.completed, call.failed, call.analysis_ready, campaign.started, campaign.completed, lead.qualified, credits.low, task.triggered. Each POST has X-Webhook-Event, X-Webhook-Timestamp and X-Signature: sha256=HMAC(secret, timestamp + "." + body). Non-2xx responses are retried after 1 m, 5 m, 30 m, 2 h and 12 h.

// Node.js
const sig = 'sha256=' + crypto.createHmac('sha256', SECRET).update(req.headers['x-webhook-timestamp'] + '.' + rawBody).digest('hex');
const ok = crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(req.headers['x-signature']));

Calls

POST/calls— Start an outbound AI callcalls:write

Supports the Idempotency-Key header. Variables fill {{placeholders}} in the agent prompt and first message.

curl -X POST https://voiceorbit.p.nextaweb.com/api/v1/calls \
  -H "Authorization: Bearer $VO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"agent_id":12,"to":"+919876543210","variables":{"name":"Priya","amount":"2500"}}'
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/calls');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
  CURLOPT_POSTFIELDS => json_encode(array (
  'agent_id' => 12,
  'to' => '+919876543210',
  'variables' => 
  array (
    'name' => 'Priya',
    'amount' => '2500',
  ),
)),
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/calls', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "agent_id": 12,
    "to": "+919876543210",
    "variables": {
        "name": "Priya",
        "amount": "2500"
    }
}),
});
const data = await res.json();
import os, requests
r = requests.request("POST", "https://voiceorbit.p.nextaweb.com/api/v1/calls",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},
    json={
    "agent_id": 12,
    "to": "+919876543210",
    "variables": {
        "name": "Priya",
        "amount": "2500"
    }
},)
print(r.json())
GET/calls— List callscalls:read

Filters: status, direction, agent_id, campaign_id, created_after (ISO date). Cursor pagination: limit (max 100), cursor.

curl -X GET https://voiceorbit.p.nextaweb.com/api/v1/calls \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/calls');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/calls', {
  method: 'GET',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("GET", "https://voiceorbit.p.nextaweb.com/api/v1/calls",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())
GET/calls/{id}— Get a call with transcript and AI analysiscalls:read
curl -X GET https://voiceorbit.p.nextaweb.com/api/v1/calls/123 \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/calls/123');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/calls/123', {
  method: 'GET',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("GET", "https://voiceorbit.p.nextaweb.com/api/v1/calls/123",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())
POST/calls/{id}/hangup— End a live callcalls:write
curl -X POST https://voiceorbit.p.nextaweb.com/api/v1/calls/123/hangup \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/calls/123/hangup');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/calls/123/hangup', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("POST", "https://voiceorbit.p.nextaweb.com/api/v1/calls/123/hangup",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())

Campaigns

POST/campaigns— Create a campaign (optionally with contacts)campaigns:write

Supports Idempotency-Key. Without list_id a new contact list is created for the campaign.

curl -X POST https://voiceorbit.p.nextaweb.com/api/v1/campaigns \
  -H "Authorization: Bearer $VO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"October renewals","agent_id":12,"timezone":"Asia/Kolkata","window_start":"10:00","window_end":"19:00","concurrency":3,"max_attempts":2,"contacts":[{"phone":"+919876543210","name":"Priya","variables":{"amount":"2500"}}]}'
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/campaigns');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
  CURLOPT_POSTFIELDS => json_encode(array (
  'name' => 'October renewals',
  'agent_id' => 12,
  'timezone' => 'Asia/Kolkata',
  'window_start' => '10:00',
  'window_end' => '19:00',
  'concurrency' => 3,
  'max_attempts' => 2,
  'contacts' => 
  array (
    0 => 
    array (
      'phone' => '+919876543210',
      'name' => 'Priya',
      'variables' => 
      array (
        'amount' => '2500',
      ),
    ),
  ),
)),
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/campaigns', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "name": "October renewals",
    "agent_id": 12,
    "timezone": "Asia/Kolkata",
    "window_start": "10:00",
    "window_end": "19:00",
    "concurrency": 3,
    "max_attempts": 2,
    "contacts": [
        {
            "phone": "+919876543210",
            "name": "Priya",
            "variables": {
                "amount": "2500"
            }
        }
    ]
}),
});
const data = await res.json();
import os, requests
r = requests.request("POST", "https://voiceorbit.p.nextaweb.com/api/v1/campaigns",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},
    json={
    "name": "October renewals",
    "agent_id": 12,
    "timezone": "Asia/Kolkata",
    "window_start": "10:00",
    "window_end": "19:00",
    "concurrency": 3,
    "max_attempts": 2,
    "contacts": [
        {
            "phone": "+919876543210",
            "name": "Priya",
            "variables": {
                "amount": "2500"
            }
        }
    ]
},)
print(r.json())
GET/campaigns— List campaignscampaigns:read

Filter: status.

curl -X GET https://voiceorbit.p.nextaweb.com/api/v1/campaigns \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/campaigns');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/campaigns', {
  method: 'GET',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("GET", "https://voiceorbit.p.nextaweb.com/api/v1/campaigns",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())
GET/campaigns/{id}— Get a campaign with live progresscampaigns:read
curl -X GET https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123 \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123', {
  method: 'GET',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("GET", "https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())
PATCH/campaigns/{id}— Update name, window, concurrency or retriescampaigns:write
curl -X PATCH https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123 \
  -H "Authorization: Bearer $VO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"concurrency":5}'
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'PATCH',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
  CURLOPT_POSTFIELDS => json_encode(array (
  'concurrency' => 5,
)),
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123', {
  method: 'PATCH',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "concurrency": 5
}),
});
const data = await res.json();
import os, requests
r = requests.request("PATCH", "https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},
    json={
    "concurrency": 5
},)
print(r.json())
POST/campaigns/{id}/start— Start (or resume) a campaigncampaigns:write

Also /pause and /resume.

curl -X POST https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123/start \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123/start');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123/start', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("POST", "https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123/start",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())
POST/campaigns/{id}/contacts— Add contacts to a campaigncampaigns:write

Up to 1000 per request. Running campaigns dial them automatically.

curl -X POST https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123/contacts \
  -H "Authorization: Bearer $VO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contacts":[{"phone":"+919812345678","name":"Arjun"}]}'
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123/contacts');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
  CURLOPT_POSTFIELDS => json_encode(array (
  'contacts' => 
  array (
    0 => 
    array (
      'phone' => '+919812345678',
      'name' => 'Arjun',
    ),
  ),
)),
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123/contacts', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "contacts": [
        {
            "phone": "+919812345678",
            "name": "Arjun"
        }
    ]
}),
});
const data = await res.json();
import os, requests
r = requests.request("POST", "https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123/contacts",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},
    json={
    "contacts": [
        {
            "phone": "+919812345678",
            "name": "Arjun"
        }
    ]
},)
print(r.json())
DELETE/campaigns/{id}— Delete a campaigncampaigns:write
curl -X DELETE https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123 \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'DELETE',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123', {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("DELETE", "https://voiceorbit.p.nextaweb.com/api/v1/campaigns/123",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())

Agents

GET/agents— List agentsagents:read
curl -X GET https://voiceorbit.p.nextaweb.com/api/v1/agents \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/agents');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/agents', {
  method: 'GET',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("GET", "https://voiceorbit.p.nextaweb.com/api/v1/agents",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())
POST/agents— Create an agentagents:write
curl -X POST https://voiceorbit.p.nextaweb.com/api/v1/agents \
  -H "Authorization: Bearer $VO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Riya — Sales","language":"en-IN","system_prompt":"You are Riya…","first_message":"Hi {{name}}!"}'
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/agents');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
  CURLOPT_POSTFIELDS => json_encode(array (
  'name' => 'Riya — Sales',
  'language' => 'en-IN',
  'system_prompt' => 'You are Riya…',
  'first_message' => 'Hi {{name}}!',
)),
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/agents', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "name": "Riya — Sales",
    "language": "en-IN",
    "system_prompt": "You are Riya…",
    "first_message": "Hi {{name}}!"
}),
});
const data = await res.json();
import os, requests
r = requests.request("POST", "https://voiceorbit.p.nextaweb.com/api/v1/agents",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},
    json={
    "name": "Riya — Sales",
    "language": "en-IN",
    "system_prompt": "You are Riya…",
    "first_message": "Hi {{name}}!"
},)
print(r.json())
GET/agents/{id}— Get an agentagents:read
curl -X GET https://voiceorbit.p.nextaweb.com/api/v1/agents/123 \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/agents/123');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/agents/123', {
  method: 'GET',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("GET", "https://voiceorbit.p.nextaweb.com/api/v1/agents/123",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())
PATCH/agents/{id}— Update an agentagents:write
curl -X PATCH https://voiceorbit.p.nextaweb.com/api/v1/agents/123 \
  -H "Authorization: Bearer $VO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"first_message":"Hello {{name}}, this is Riya."}'
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/agents/123');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'PATCH',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
  CURLOPT_POSTFIELDS => json_encode(array (
  'first_message' => 'Hello {{name}}, this is Riya.',
)),
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/agents/123', {
  method: 'PATCH',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "first_message": "Hello {{name}}, this is Riya."
}),
});
const data = await res.json();
import os, requests
r = requests.request("PATCH", "https://voiceorbit.p.nextaweb.com/api/v1/agents/123",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},
    json={
    "first_message": "Hello {{name}}, this is Riya."
},)
print(r.json())
DELETE/agents/{id}— Delete an agentagents:write
curl -X DELETE https://voiceorbit.p.nextaweb.com/api/v1/agents/123 \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/agents/123');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'DELETE',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/agents/123', {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("DELETE", "https://voiceorbit.p.nextaweb.com/api/v1/agents/123",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())

Contacts

GET/contacts— List contactscontacts:read

Filters: phone, lead_status, tag.

curl -X GET https://voiceorbit.p.nextaweb.com/api/v1/contacts \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/contacts');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/contacts', {
  method: 'GET',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("GET", "https://voiceorbit.p.nextaweb.com/api/v1/contacts",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())
POST/contacts— Create or update a contact (dedupes by phone)contacts:write
curl -X POST https://voiceorbit.p.nextaweb.com/api/v1/contacts \
  -H "Authorization: Bearer $VO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"phone":"+919876543210","name":"Priya","tags":"website,hot","custom_fields":{"city":"Kolkata"},"list_id":3}'
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/contacts');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
  CURLOPT_POSTFIELDS => json_encode(array (
  'phone' => '+919876543210',
  'name' => 'Priya',
  'tags' => 'website,hot',
  'custom_fields' => 
  array (
    'city' => 'Kolkata',
  ),
  'list_id' => 3,
)),
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/contacts', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "phone": "+919876543210",
    "name": "Priya",
    "tags": "website,hot",
    "custom_fields": {
        "city": "Kolkata"
    },
    "list_id": 3
}),
});
const data = await res.json();
import os, requests
r = requests.request("POST", "https://voiceorbit.p.nextaweb.com/api/v1/contacts",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},
    json={
    "phone": "+919876543210",
    "name": "Priya",
    "tags": "website,hot",
    "custom_fields": {
        "city": "Kolkata"
    },
    "list_id": 3
},)
print(r.json())
GET/contacts/{id}— Get a contactcontacts:read
curl -X GET https://voiceorbit.p.nextaweb.com/api/v1/contacts/123 \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/contacts/123');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/contacts/123', {
  method: 'GET',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("GET", "https://voiceorbit.p.nextaweb.com/api/v1/contacts/123",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())
PATCH/contacts/{id}— Update a contactcontacts:write
curl -X PATCH https://voiceorbit.p.nextaweb.com/api/v1/contacts/123 \
  -H "Authorization: Bearer $VO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"lead_status":"qualified"}'
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/contacts/123');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'PATCH',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
  CURLOPT_POSTFIELDS => json_encode(array (
  'lead_status' => 'qualified',
)),
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/contacts/123', {
  method: 'PATCH',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "lead_status": "qualified"
}),
});
const data = await res.json();
import os, requests
r = requests.request("PATCH", "https://voiceorbit.p.nextaweb.com/api/v1/contacts/123",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},
    json={
    "lead_status": "qualified"
},)
print(r.json())
DELETE/contacts/{id}— Delete a contactcontacts:write
curl -X DELETE https://voiceorbit.p.nextaweb.com/api/v1/contacts/123 \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/contacts/123');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'DELETE',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/contacts/123', {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("DELETE", "https://voiceorbit.p.nextaweb.com/api/v1/contacts/123",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())

Account

GET/me— Workspace, plan and key info
curl -X GET https://voiceorbit.p.nextaweb.com/api/v1/me \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/me');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/me', {
  method: 'GET',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("GET", "https://voiceorbit.p.nextaweb.com/api/v1/me",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())
GET/credits/balance— Credit balancecredits:read
curl -X GET https://voiceorbit.p.nextaweb.com/api/v1/credits/balance \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/credits/balance');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/credits/balance', {
  method: 'GET',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("GET", "https://voiceorbit.p.nextaweb.com/api/v1/credits/balance",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())
GET/credits/usage— Credit ledgercredits:read
curl -X GET https://voiceorbit.p.nextaweb.com/api/v1/credits/usage \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/credits/usage');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/credits/usage', {
  method: 'GET',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("GET", "https://voiceorbit.p.nextaweb.com/api/v1/credits/usage",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())
GET/analytics/calls— Call analyticsanalytics:read

Query: days (1–365), direction (inbound|outbound|campaign).

curl -X GET https://voiceorbit.p.nextaweb.com/api/v1/analytics/calls \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/analytics/calls');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/analytics/calls', {
  method: 'GET',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("GET", "https://voiceorbit.p.nextaweb.com/api/v1/analytics/calls",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())
GET/numbers— Phone numbers available to younumbers:read
curl -X GET https://voiceorbit.p.nextaweb.com/api/v1/numbers \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/numbers');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/numbers', {
  method: 'GET',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("GET", "https://voiceorbit.p.nextaweb.com/api/v1/numbers",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())

Webhooks

GET/webhooks— List webhookswebhooks:read
curl -X GET https://voiceorbit.p.nextaweb.com/api/v1/webhooks \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/webhooks');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/webhooks', {
  method: 'GET',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("GET", "https://voiceorbit.p.nextaweb.com/api/v1/webhooks",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())
POST/webhooks— Create a webhook (returns its signing secret once)webhooks:write

Events: call.started, call.answered, call.completed, call.failed, call.analysis_ready, campaign.started, campaign.completed, lead.qualified, credits.low, task.triggered or "*".

curl -X POST https://voiceorbit.p.nextaweb.com/api/v1/webhooks \
  -H "Authorization: Bearer $VO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/hooks/voice","events":["call.completed","lead.qualified"]}'
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/webhooks');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
  CURLOPT_POSTFIELDS => json_encode(array (
  'url' => 'https://example.com/hooks/voice',
  'events' => 
  array (
    0 => 'call.completed',
    1 => 'lead.qualified',
  ),
)),
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/webhooks', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "url": "https://example.com/hooks/voice",
    "events": [
        "call.completed",
        "lead.qualified"
    ]
}),
});
const data = await res.json();
import os, requests
r = requests.request("POST", "https://voiceorbit.p.nextaweb.com/api/v1/webhooks",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},
    json={
    "url": "https://example.com/hooks/voice",
    "events": [
        "call.completed",
        "lead.qualified"
    ]
},)
print(r.json())
POST/webhooks/{id}/test— Send a test eventwebhooks:write
curl -X POST https://voiceorbit.p.nextaweb.com/api/v1/webhooks/123/test \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/webhooks/123/test');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/webhooks/123/test', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("POST", "https://voiceorbit.p.nextaweb.com/api/v1/webhooks/123/test",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())
DELETE/webhooks/{id}— Delete a webhookwebhooks:write
curl -X DELETE https://voiceorbit.p.nextaweb.com/api/v1/webhooks/123 \
  -H "Authorization: Bearer $VO_KEY"
$ch = curl_init('https://voiceorbit.p.nextaweb.com/api/v1/webhooks/123');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'DELETE',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VO_KEY'), 'Content-Type: application/json'],
]);
$response = json_decode(curl_exec($ch), true);
const res = await fetch('https://voiceorbit.p.nextaweb.com/api/v1/webhooks/123', {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${process.env.VO_KEY}`, 'Content-Type': 'application/json' },
});
const data = await res.json();
import os, requests
r = requests.request("DELETE", "https://voiceorbit.p.nextaweb.com/api/v1/webhooks/123",
    headers={"Authorization": f"Bearer {os.environ['VO_KEY']}"},)
print(r.json())