VyoraVyora
API Reference

Vyora API

Trigger AI voice calls and receive real-time events. One endpoint. Works with any backend, Zapier, or Make.

Connecting this to a CRM? See how Vyora integrates with Salesforce, HubSpot, and Zoho.

One endpoint

POST /v1/calls to trigger any call instantly

Real-time events

Receive transcripts and analysis via webhook

API key auth

Simple header-based auth, no OAuth complexity

Base URL

https://api.vyora.ai

Authentication

All requests require an X-API-KEY header. Generate your key from Settings, Integrations.

Keep your API key secret. Never expose it in client-side JavaScript or public repos. If compromised, revoke it immediately from Settings and generate a new one.

X-API-KEY: vya_live_your_key_here

Rate limits

When rate limited, the API returns 429 Too Many Requests. Use exponential backoff before retrying.

API requests · Per API key
60 / minute
Concurrent calls · Per workspace
Plan dependent
Webhook timeout · Per delivery attempt
5 seconds
// Exponential backoff, retry up to 3 times
async function callWithRetry(payload, retries = 3) {
  for (let i = 0; i < retries; i++) {
    const res = await fetch('https://api.vyora.ai/v1/calls', { ... });
    if (res.status !== 429) return res;
    await new Promise(r => setTimeout(r, Math.pow(2, i) * 1000));
  }
  throw new Error('Rate limit exceeded after retries');
}
GET/v1/agents

List agents

Returns all active agents in your workspace. Pass an agent's id as agent_id when triggering calls. Agent IDs are also shown in your dashboard under Agents.
Parameters
limit
integer · optional
Max agents to return. Default 50, max 100.
offset
integer · optional
Number of agents to skip. Default 0. Use with limit for pagination.
curl https://api.vyora.ai/v1/agents \
  -H "X-API-KEY: vya_live_your_key_here"
200 OK
{
  "agents": [
    { "id": "abc123-...", "name": "Home Loan Agent",   "language": "hi-IN", "agent_type": "outbound" },
    { "id": "def456-...", "name": "Admission Enquiry", "language": "en-IN", "agent_type": "outbound" }
  ],
  "total": 2,
  "limit": 50,
  "offset": 0
}
GET/v1/numbers

List numbers

Returns the caller-line numbers assigned to your workspace, each with its id. Pass that id as from_number_id when triggering a call to select which line places it. It is required on every call and must be an ID; raw phone numbers are not accepted.
curl https://api.vyora.ai/v1/numbers \
  -H "X-API-KEY: vya_live_your_key_here"
200 OK
{
  "numbers": [
    { "id": "5d7f9a2b-...", "phone_number": "+918031137388", "display_name": "Vyora Line 1" },
    { "id": "12dcae4c-...", "phone_number": "+18085158398",  "display_name": "US Line" }
  ]
}
GET/v1/calls

List calls

Returns calls in your workspace, most recent first. Paginated. Filter by status to fetch only completed, failed, or ongoing calls. For the full transcript and analysis of a single call, use GET /v1/calls/:id.
Parameters
limit
integer · optional
Max calls to return. Default 50, max 100.
offset
integer · optional
Number of calls to skip. Default 0. Use with limit for pagination.
status
string · optional
Filter by status, e.g. completed, failed, ongoing, registered.
curl "https://api.vyora.ai/v1/calls?limit=20&status=completed" \
  -H "X-API-KEY: vya_live_your_key_here"
200 OK
{
  "calls": [
    {
      "call_id": "abc123xyz",
      "agent_id": "def456-...",
      "agent_name": "Home Loan Agent",
      "contact_name": "Rahul Sharma",
      "phone_number": "+919876543210",
      "status": "completed",
      "direction": "outbound",
      "duration_seconds": 47,
      "recording_url": "https://.../abc123.mp3",
      "called_at": "2026-05-24T10:30:00Z"
    }
  ],
  "total": 134,
  "limit": 20,
  "offset": 0
}
GET/v1/calls/:call_id

Get call

Fetch the full record for a single call: status, transcript, recording URL, and AI analysis. Use the call_id returned by POST /v1/calls. Transcript and analysis are only available after all_processing_completed fires; poll with the snippet on the right if you are not using webhooks.
curl https://api.vyora.ai/v1/calls/abc123xyz \
  -H "X-API-KEY: vya_live_your_key_here"
200 OK
{
  "call_id": "abc123xyz",
  "agent_id": "def456-...",
  "agent_name": "Home Loan Agent",
  "contact_name": "Rahul Sharma",
  "phone_number": "+919876543210",
  "status": "completed",
  "direction": "outbound",
  "duration_seconds": 47,
  "recording_url": "https://cdn.vyora.ai/recordings/abc123.mp3",
  "transcript": [
    { "bot": "Hi Rahul, I'm calling about your home loan inquiry..." },
    { "user": "Yes, I was interested in learning more..." }
  ],
  "analysis": {
    "summary": "Lead expressed strong interest, asked about EMI options.",
    "classification": "Interested"
  },
  "called_at": "2026-05-24T10:30:00Z"
}
404
{ "error": "Call not found" }
POST/v1/calls

Trigger a call

Starts an outbound AI call immediately. Identify the agent with agent_id (from GET /v1/agents) and the caller line with from_number_id (from GET /v1/numbers); both required, both IDs. The agent calls the recipient, runs the conversation, and delivers results via webhook.
Parameters
phone_number
string · required
The number to call (the recipient). E.164 format, e.g. +919876543210
agent_id
string · required
Agent ID from GET /v1/agents. Identifies which agent runs the call.
from_number_id
string · required
Caller-line ID from GET /v1/numbers. Selects which of your assigned numbers places the call. Must be an ID.
custom_args
object · optional
Key-value pairs passed to the agent as context. Use name, product, intent, etc.
agent_name
string · optional
Legacy. Case-insensitive agent name, accepted as a fallback when agent_id is omitted. Prefer agent_id.
curl -X POST https://api.vyora.ai/v1/calls \
  -H "X-API-KEY: vya_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "phone_number": "+919876543210",
    "agent_id": "def456-...",
    "from_number_id": "5d7f9a2b-...",
    "custom_args": {
      "name": "Rahul Sharma",
      "product": "Home Loan"
    }
  }'
200 OK
{
  "call_id": "abc123xyz",
  "status": "registered"
}
4xx / 5xx
{
  "error": "Insufficient credits"
}

Webhooks

Register a webhook URL in Settings, Integrations. Vyora POSTs to that URL after each call event. Your endpoint must respond with 200 within 5 seconds.

X-Vyora-Event

Event name, e.g. call_completed

X-Vyora-Signature

HMAC-SHA256 signature for verification

User-Agent

Always Vyora-Webhooks/1.0

Signature verification

Every webhook includes an X-Vyora-Signature header, an HMAC-SHA256 of the raw request body signed with your webhook secret (format whsec_…). A secret is created the first time you save a webhook URL. Always verify it before processing to prevent spoofed requests, and use timing-safe comparison (never ===).

// Express.js, verify signature before processing
const crypto = require('crypto');

function verifySignature(rawBody, signature, secret) {
  const expected = 'sha256=' + crypto
    .createHmac('sha256', secret)
    .update(rawBody)
    .digest('hex');
  // Use timingSafeEqual to prevent timing attacks
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}

app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
  const sig    = req.headers['x-vyora-signature'];
  const secret = process.env.VYORA_WEBHOOK_SECRET;

  if (!sig || !verifySignature(req.body, sig, secret)) {
    return res.status(401).json({ error: 'Invalid signature' });
  }

  const body  = JSON.parse(req.body);
  const event = req.headers['x-vyora-event'];

  if (event === 'call_completed') {
    console.log(`Call ${body.call_id} ended, status: ${body.status}`);
  }

  if (event === 'all_processing_completed') {
    console.log('Analysis ready:', body.analysis?.summary);
  }

  res.status(200).json({ received: true });
});
Request headers
POST https://your-server.com/webhook
Content-Type: application/json
X-Vyora-Event: call_completed
X-Vyora-Signature: sha256=a4b3c2d1e0f9...
User-Agent: Vyora-Webhooks/1.0
Example payload
{
  "event": "call_completed",
  "call_id": "abc123xyz",
  "phone_number": "+919876543210",
  "contact_name": "Rahul Sharma",
  "agent_id": "your-agent-id",
  "agent_name": "Home Loan Agent",
  "status": "completed",
  "direction": "outbound",
  "duration_seconds": 47,
  "recording_url": "https://cdn.vyora.ai/recordings/abc123.mp3",
  "transcript": [
    { "bot": "Hi Rahul, I'm calling about your home loan inquiry..." },
    { "user": "Yes, I was interested in learning more..." }
  ],
  "analysis": {
    "summary": "Lead expressed strong interest, asked about EMI options.",
    "classification": "Interested"
  },
  "campaign_id": "campaign_456",
  "custom_args": { "name": "Rahul Sharma", "product": "Home Loan" },
  "called_at": "2026-05-24T10:30:00Z",
  "timestamp": "2026-05-24T10:31:15Z"
}

Event types

Select which events to receive in Settings, Integrations. Unsubscribed events are not delivered.

call_started
Call connects to the recipient
call_completed
Call ends. Includes duration, status, recording URL
all_processing_completed
Transcript + AI analysis ready (summary, classification)

Error codes

400
Bad Request
Missing or invalid field. Check phone_number format, agent_id / agent_name, or JSON body
401
Unauthorized
API key is missing, invalid, or revoked
402
Payment Required
Insufficient credits. Top up or upgrade your plan
403
Forbidden
Workspace is inactive or suspended
404
Not Found
No agent found matching agent_name, or call ID does not exist
429
Too Many Requests
Rate limit exceeded. Back off and retry with exponential delay
500
Internal Server Error
Something went wrong on our end. Retry with backoff
502
Bad Gateway
Webhook delivery failed. Your endpoint did not respond 200

Ready to build?

Generate your API key from the dashboard and make your first call in under 2 minutes.

Get API Key

We use cookies to improve your experience. By continuing to use this site, you agree to our Privacy Policy.