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
    Ishani SinghIshani Singh
    8 min read23 June 2026

    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:

    1. Fire — Your backend fires a POST to the Vobiz Make Call API with a from, to, and answer_url.
    2. Dial — Vobiz dials the destination number.
    3. Connect — When the call connects, Vobiz sends a POST to your answer_url. Your server responds with Voice XML instructions — play audio, stream to an AI agent, collect DTMF input, or hang up.
    4. AMD — If you've enabled AMD (Answering Machine Detection), Vobiz runs acoustic analysis in parallel and fires a callback to your machine_detection_url with a Machine: true/false flag.
    5. Hangup — When the call ends, Vobiz fires your hangup_url with 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-ID and X-Auth-Token headers
    • A publicly reachable HTTPS endpoint for your answer_url, machine_detection_url, and hangup_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.

    ModeParameterBehavior
    Auto-hangup on machinemachine_detection: "hangup"Vobiz detects voicemail and terminates the call automatically. Best for high-volume campaigns where you want zero wasted call time.
    Continue on machinemachine_detection: "true"Call continues regardless. Use when you want to leave a pre-recorded voicemail message.
    Async callbackmachine_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"
    }
    FieldWhat to do with it
    CallUUIDPrimary key — join to your AMD callback log and contact record
    StartTimeWhen the dial was initiated
    AnswerTimeWhen a human (or machine) picked up — delta from StartTime gives you ring time
    EndTimeCall end — delta from AnswerTime gives you actual conversation duration
    CallStatusTerminal call state: completed, busy, failed, no-answer, canceled. Always log the actual value.
    STIRAttestationSTIR/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 '', 200

    Return 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:

    Vobiz bills in INR and issues GST-compliant invoices for Indian accounts.

    Vobiz vs. Twilio: Setup Speed Comparison

    StepVobizTwilio
    Provision a DID1 POST to /numbers/purchase-from-inventoryConsole UI or API — additional DLT registration flow for India numbers
    AMD configurationParameters on the make-call request, async callback includedMachineDetection parameter on the Create Call API — available on standard plans
    Call flow scriptingVoice XML via webhook (answer_url)TwiML via webhook — same pattern, different syntax
    Hangup webhookhangup_url param on make-call requestStatusCallback param — available but requires explicit setup
    Bulk outboundUp to 1,000 destinations in one request using < separatorNo native bulk endpoint — requires loop in application code
    Billing currency (India)INR with GST invoicesUSD — currency risk and GST filing complexity for Indian entities
    India compliance docsVobiz India Compliance + DLT guideGeneric 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.