How to Build a Production-Ready Outbound AI Calling Campaign on Vobiz in Under 10 Minutes
Step-by-step guide to launching a production-ready outbound AI calling campaign on Vobiz — provision DIDs, configure AMD, write call flow XML, and handle hangup webhooks for CRM sync. Real code included.

How to Build a Production-Ready Outbound AI Calling Campaign on Vobiz in Under 10 Minutes
What Is an Outbound AI Calling Campaign?
An outbound AI calling campaign is a programmatically triggered sequence of phone calls — made by an AI voice agent or automated system — at scale, without manual dialing. The infrastructure layer handles number provisioning, call initiation, answering machine detection, dynamic call flow execution, and post-call data delivery to your CRM or data warehouse.
Most teams building this on legacy CPaaS platforms spend hours across dashboards, credential panels, and SDK setup before a single call fires. On Vobiz, the full stack — DID provisioning, AMD, XML call flow, and hangup webhooks — is configured through a single REST API with two auth headers on every request. This guide walks through all four steps with real code.
How Vobiz Handles Outbound Calls
Vobiz uses an event-driven webhook architecture for call flow control. The sequence works like this:
- Fire — Your backend fires a
POSTto the Vobiz Make Call API with afrom,to, andanswer_url. - Dial — Vobiz dials the destination number.
- Connect — When the call connects, Vobiz sends a
POSTto youranswer_url. Your server responds with Voice XML instructions — play audio, stream to an AI agent, collect DTMF input, or hang up. - AMD — If you've enabled AMD (Answering Machine Detection), Vobiz runs acoustic analysis in parallel and fires a callback to your
machine_detection_urlwith aMachine: true/falseflag. - Hangup — When the call ends, Vobiz fires your
hangup_urlwith full timestamps —StartTime,AnswerTime,EndTime— ready to write to your CRM.
Each webhook cycle is stateless. Your application tracks call state using the CallUUID Vobiz sends with every event.
What You Need Before You Start
- A Vobiz account — sign up and get ₹25 in free credit to start
- Your Auth ID and Auth Token from the Vobiz dashboard — required on every API request as
X-Auth-IDandX-Auth-Tokenheaders - A publicly reachable HTTPS endpoint for your
answer_url,machine_detection_url, andhangup_url(use ngrok locally during development) - A DID number in your target country (provisioned in Step 1 below)
Authentication model: Every request to https://api.vobiz.ai/api/v1 requires two headers:
X-Auth-ID: YOUR_AUTH_ID X-Auth-Token: YOUR_AUTH_TOKEN Content-Type: application/json
Step 1: Provision a DID via API
Before you can place a call, you need a caller ID — a DID number that Vobiz assigns to your account. Vobiz supports DID provisioning across 130+ countries, including India's 140, 1600, and 92 series numbers.
Browse available numbers first:
curl -X GET https://api.vobiz.ai/api/v1/Account/{auth_id}/inventory/numbers \
-H "X-Auth-ID: YOUR_AUTH_ID" \
-H "X-Auth-Token: YOUR_AUTH_TOKEN"Purchase the number:
curl -X POST https://api.vobiz.ai/api/v1/Account/{auth_id}/numbers/purchase-from-inventory \
-H "X-Auth-ID: YOUR_AUTH_ID" \
-H "X-Auth-Token: YOUR_AUTH_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"e164": "+919876543210"
}'Response (200 OK):
{
"message": "Number purchased successfully",
"number": {
"e164": "+919876543210",
"country": "IN",
"region": "Karnataka",
"status": "active",
"voice_enabled": true,
"monthly_fee": 1,
"currency": "INR"
}
}The number is active immediately. voice_enabled: true confirms it's ready for outbound calls — no waiting period, no support ticket.
Note for India outbound campaigns: If you're dialing Indian mobile numbers at scale, you will need a 140-series or 1600-series number and DLT registration for TRAI compliance.
Step 2: Fire the Outbound Call with AMD
This is the core API call. Everything — the caller ID, destination, call flow webhook, AMD config, and hangup callback — is set in a single POST request.
Endpoint: POST https://api.vobiz.ai/api/v1/Account/{auth_id}/Call/
Path casing matters: The URL requires a capital A in Account, a capital C in Call, and a trailing slash. Lowercase or missing slash returns a 401.
curl -X POST https://api.vobiz.ai/api/v1/Account/{auth_id}/Call/ \
-H "X-Auth-ID: YOUR_AUTH_ID" \
-H "X-Auth-Token: YOUR_AUTH_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"from": "+919876543210",
"to": "+919123456789",
"answer_url": "https://yourapp.com/answer",
"answer_method": "POST",
"hangup_url": "https://yourapp.com/hangup",
"hangup_method": "POST",
"machine_detection": "hangup",
"machine_detection_url": "https://yourapp.com/amd-callback",
"machine_detection_method": "POST",
"machine_detection_time": 5000,
"time_limit": 3600
}'Store the request_uuid from the response — this is your CallUUID and will appear in every subsequent webhook for this call.
AMD: Sync vs. Async Modes
Machine Detection is not a separate endpoint. It's configured via parameters on the same call request.
| Mode | Parameter | Behavior |
|---|---|---|
| Auto-hangup on machine | machine_detection: "hangup" | Vobiz detects voicemail and terminates the call automatically. Best for high-volume campaigns where you want zero wasted call time. |
| Continue on machine | machine_detection: "true" | Call continues regardless. Use when you want to leave a pre-recorded voicemail message. |
| Async callback | machine_detection_url: "https://yourapp.com/amd-callback" | Detection runs in background. Vobiz fires your callback with the result while the call proceeds — no delay to the caller experience. |
Recommended for campaigns: Use machine_detection: "hangup" with machine_detection_url together. Vobiz hangs up on machines and still fires your callback so you can log the outcome.
Step 3: Write Your answer_url XML Call Flow
When a human answers the call, Vobiz hits your answer_url and expects Voice XML back. Your server generates XML dynamically — personalize it per recipient using the From, To, and CallUUID params Vobiz sends with the webhook.
Option A: Spoken IVR with DTMF collection
Use <Speak> and <Gather> to deliver a message and collect a keypress:
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Gather numDigits="1" timeout="10" action="https://yourapp.com/gather-result" method="POST">
<Speak>Hi, this is a call from Acme. Press 1 to speak with our team, or press 2 to be removed from our list.</Speak>
</Gather>
<Speak>We didn't receive your input. We'll try again soon. Goodbye.</Speak>
<Hangup/>
</Response>Option B: Stream directly to an AI voice agent
Use <Stream> to fork live audio to a WebSocket server — your AI agent (Vapi, Retell AI, ElevenLabs, LiveKit, Pipecat) handles the conversation in real time:
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Stream streamTimeout="86400" keepCallAlive="true">
wss://your-ai-agent.com/audio-stream
</Stream>
</Response>Use the Vobiz XML Builder to compose and preview XML without writing it by hand.
Step 4: Handle the Hangup Webhook for CRM Sync
When the call ends, for any reason, Vobiz fires a POST to your hangup_url. No XML response is expected. This is your data capture event: write call outcome, duration, and timestamps directly to your CRM.
{
"From": "+919876543210",
"To": "+919123456789",
"CallUUID": "97ceeb52-58b6-11e1-86da-77300b68f8bb",
"Direction": "outbound",
"Event": "Hangup",
"CallStatus": "completed",
"StartTime": "2026-06-23 10:00:00",
"AnswerTime": "2026-06-23 10:00:06",
"EndTime": "2026-06-23 10:02:34",
"STIRAttestation": "A",
"stir_verification": "Verified"
}| Field | What to do with it |
|---|---|
| CallUUID | Primary key — join to your AMD callback log and contact record |
| StartTime | When the dial was initiated |
| AnswerTime | When a human (or machine) picked up — delta from StartTime gives you ring time |
| EndTime | Call end — delta from AnswerTime gives you actual conversation duration |
| CallStatus | Terminal call state: completed, busy, failed, no-answer, canceled. Always log the actual value. |
| STIRAttestation | STIR/SHAKEN attestation level — relevant for US regulatory reporting |
Minimal Python handler:
from flask import Flask, request
import your_crm_client as crm
app = Flask(__name__)
@app.route('/hangup', methods=['POST'])
def hangup():
data = request.form
crm.update_call_record(
call_uuid=data.get('CallUUID'),
status=data.get('CallStatus'),
start_time=data.get('StartTime'),
answer_time=data.get('AnswerTime'),
end_time=data.get('EndTime'),
direction=data.get('Direction')
)
return '', 200Return a 200 immediately — Vobiz does not wait for a response body, but a slow or failing response may cause retry behavior.
Scaling to Bulk: 1,000 Destinations in One Request
For campaign-scale outbound, Vobiz supports up to 1,000 destinations in a single API call. Separate numbers with <:
curl -X POST https://api.vobiz.ai/api/v1/Account/{auth_id}/Call/ \
-H "X-Auth-ID: YOUR_AUTH_ID" \
-H "X-Auth-Token: YOUR_AUTH_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"from": "+919876543210",
"to": "+919111111111<+919222222222<+919333333333",
"answer_url": "https://yourapp.com/answer",
"hangup_url": "https://yourapp.com/hangup",
"machine_detection": "hangup",
"machine_detection_url": "https://yourapp.com/amd-callback"
}'Each destination gets its own call leg, its own CallUUID, and independent webhook delivery. Make sure your server handles parallel webhook processing.
Vobiz also ships official SDKs for Python, Node.js, Ruby, Go, and C#.
India-Specific: DLT Compliance for Outbound Campaigns
If your campaign targets Indian mobile numbers, TRAI's DND and DLT regulations apply before you can dial at scale:
- 140-series numbers are required for transactional and service calls (OTP, reminders, alerts). See how to acquire 140/160-series numbers on Vobiz.
- DLT registration — your calling header and call flow template must be pre-approved on the DLT platform. Vobiz's DLT registration guide covers the submission process.
- Calling hours — TRAI restricts outbound calls to 9am–9pm in the recipient's local time. Full rules are in the India Compliance docs.
- KYC — Indian accounts require GST, PAN, and Aadhaar verification before production calling volumes are unlocked.
Vobiz bills in INR and issues GST-compliant invoices for Indian accounts.
Vobiz vs. Twilio: Setup Speed Comparison
| Step | Vobiz | Twilio |
|---|---|---|
| Provision a DID | 1 POST to /numbers/purchase-from-inventory | Console UI or API — additional DLT registration flow for India numbers |
| AMD configuration | Parameters on the make-call request, async callback included | MachineDetection parameter on the Create Call API — available on standard plans |
| Call flow scripting | Voice XML via webhook (answer_url) | TwiML via webhook — same pattern, different syntax |
| Hangup webhook | hangup_url param on make-call request | StatusCallback param — available but requires explicit setup |
| Bulk outbound | Up to 1,000 destinations in one request using < separator | No native bulk endpoint — requires loop in application code |
| Billing currency (India) | INR with GST invoices | USD — currency risk and GST filing complexity for Indian entities |
| India compliance docs | Vobiz India Compliance + DLT guide | Generic TRAI guidance — limited India-specific documentation |
The developer experience difference is primarily in three places: AMD is a first-class parameter on Vobiz (not an add-on), bulk dialing is native, and India compliance is documented explicitly rather than left to the developer to interpret TRAI rules.
FAQs
How long does it actually take to make a first outbound call on Vobiz?
From signup to first call: under 5 minutes according to the Vobiz Quick Start. For a production campaign including DID provisioning, AMD setup, and hangup webhook: under 10 minutes for the API configuration. India DLT registration adds time on the compliance side, typically 1–3 business days for TRAI approval of your calling header.
What is answering machine detection (AMD) and how accurate is it?
AMD analyzes the audio pattern immediately after call pickup to determine whether a human or a voicemail system answered. Vobiz's AMD uses acoustic analysis tuned to common greeting patterns. In India, voicemail greetings from Airtel, Jio, and Vi have distinct patterns that regional AMD tuning accounts for. The machine_detection_initial_silence and machine_detection_maximum_words parameters let you tune sensitivity for your specific market.
Can Vobiz handle high-concurrency outbound campaigns without call drops?
Yes. Vobiz's Automated Outbound Calling infrastructure is designed for high-concurrency dialing. Your account has a CPS (calls per second) limit and a concurrent channel limit visible in the console. Before running a large campaign, verify these limits and contact support to increase them if needed.
What happens if my answer_url is slow or returns an error?
Vobiz will invoke your fallback_url if configured — after 3 retries or a 60-second timeout on the answer_url. If no fallback is set, the call will end. Set a fallback_url on every production campaign.
Does Vobiz support connecting outbound calls to an AI voice agent like Vapi or Retell AI?
Yes. The <Stream> XML element forks live audio from the call to a WebSocket server, which is how Vapi, Retell AI, ElevenLabs, LiveKit, Pipecat, and Ultravox connect to Vobiz. Native integration guides are available for all major AI voice platforms.
Build Your First Campaign
The four-step flow covered in this guide — provision DID, fire outbound call with AMD, handle the answer_url, sync via hangup webhook — runs on two auth headers and four API interactions. No dashboard configuration required beyond signup.
More Related Articles

Mechanisms to Improve RTP Jitter
Learn how carrier-grade voice platforms manage RTP jitter with adaptive buffering, packet loss concealment, FEC, and smart routing for smooth Voice AI calls.
Read full article
Vikash Srivastava
What Latency, Drop Rates, and Audio Failures Are Costing Your Business
Learn how VoIP latency, packet drop rates, and audio failures silently erode revenue. Understand the thresholds, the numbers, and how telephony infrastructure quality determines business outcomes.
Read full article
Ishani SinghThe Telephony Layer Playbook for Voice AI Teams
Most voice AI failures don't start in the model. They start in the telephony layer. Download our 8-page playbook for voice AI teams.
Read full article