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.aiAuthentication
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.
60 / minutePlan dependent5 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');
}/v1/agentsList agents
id as agent_id when triggering calls. Agent IDs are also shown in your dashboard under Agents.limitoffsetcurl https://api.vyora.ai/v1/agents \ -H "X-API-KEY: vya_live_your_key_here"
{
"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
}/v1/numbersList numbers
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"
{
"numbers": [
{ "id": "5d7f9a2b-...", "phone_number": "+918031137388", "display_name": "Vyora Line 1" },
{ "id": "12dcae4c-...", "phone_number": "+18085158398", "display_name": "US Line" }
]
}/v1/callsList calls
GET /v1/calls/:id.limitoffsetstatuscurl "https://api.vyora.ai/v1/calls?limit=20&status=completed" \ -H "X-API-KEY: vya_live_your_key_here"
{
"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
}/v1/calls/:call_idGet call
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"
{
"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"
}{ "error": "Call not found" }/v1/callsTrigger a call
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.phone_numberagent_idfrom_number_idcustom_argsagent_namecurl -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"
}
}'{
"call_id": "abc123xyz",
"status": "registered"
}{
"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-EventEvent name, e.g. call_completed
X-Vyora-SignatureHMAC-SHA256 signature for verification
User-AgentAlways 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 });
});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
{
"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_startedcall_completedall_processing_completedError codes
Ready to build?
Generate your API key from the dashboard and make your first call in under 2 minutes.