Voice APIs for developers
IVR Solutions gives developers simple REST APIs for calls, dialers, agents and logs — clean JSON over HTTPS, with ready-to-run code samples. Add voice to your product in an afternoon.
# Bridge an agent and a customer in one request curl -X POST https://api.ivrsolutions.in/api/c2c_post \ -H "Authorization: Bearer ••••••••" \ -F "did=+911143104567" \ -F "ext_no=2101" \ -F "phone=09876543210" → 200 OK { "status": 200, "message": "Call connecting. Please wait...", "logid": 123456 }
Bridge a rider and a driver, a buyer and a seller, a patient and a clinic — over your DID, so neither party ever sees the other’s real number. The mapping lives only inside the session, so once the job’s done the link is gone. It’s the privacy layer behind Uber- and Ola-style “contact the driver” calling.
Authenticate with your token, then pick a starting point. Each call is documented with copy-paste examples.
Bridge an agent and a customer instantly with click-to-call.
Open → POST /api/create_text_dialerSpin up an outbound auto-dialer from a text-to-speech template.
Open → GET /api/call_logsPull complete call history and reconcile results in JSON.
Open → POST /ivrappv2/buy_didSearch availability by region and purchase a virtual number.
Open →Ten capability groups across 66 endpoints — composable into anything from a “call me” button to an AI-driven outbound campaign.
Instantly bridge an agent and a customer over GET or POST. Perfect for callbacks and “call me” buttons.
Connect two people through your DID so neither sees the other’s real number — the privacy layer behind Uber-style calling.
Fire outbound calls from text-to-speech templates or pre-built IVR flows, one at a time or in bulk.
Start, stop and add numbers to dialer campaigns on the fly, and track every result.
Stream live call audio to your WebSocket bot via the WSS Telephony Bridge — real-time speech-to-text, system prompts, DTMF and in-call transfers.
Create, list and check the status of text-to-speech templates for your dialers.
Add, edit and deactivate agents and extensions, set expiry and assign DID numbers.
Pull complete history across click-to-call, dialer and inbound. Filter, check status, add notes.
List, search and provision virtual numbers, and manage contacts and call variables.
Register webhook URLs to receive real-time call events — rings, answers, hangups and DTMF.
A few endpoints compose into complete voice journeys. Here’s how teams wire them together.
/api/dial_by_text — “Press 1 to confirm, 2 to cancel.”/api/dialer_logs./api/c2c_post./api/get_call_status using the logid./api/create_text_dialer./api/add_to_ivrdialerbulk./api/change_dialer_status./api/dialer_logs./api/dial_by_aivoicebot, pointing wss_url at your bot.start and media audio events over the WebSocket.response.audio.delta to speak; handle dtmf keypresses.session.transfer or end with session.hangup.64 REST endpoints, grouped by capability. Expand any call for its parameters and example payloads, or test them live in Postman.
Settings → API token — or Integrations → API documentation — and send it as a Bearer token in the Authorization header.
No endpoints match .
Instantly bridge an agent and a customer. The platform calls the agent first, then the customer, and connects them — ideal for support callbacks, sales follow-ups and "call me" buttons. Available as GET (query params) or POST (JSON).
Bridge an agent and a customer with a single GET request — ideal for links and webhooks that can only fire a URL.
How it works: Pass your token, the did to show as caller ID, the agent's ext_no and the customer's phone as query parameters. The platform rings the agent first, then dials the customer and bridges both legs.
Use it for click-to-call links, no-code tools and webhook actions that can only call a URL.
| tokenrequired | string · query | Bearer token for authentication |
| didrequired | string · query | DID number (your virtual number) |
| ext_norequired | string · query | Agent extension number |
| phonerequired | string · query | Customer phone number to call |
{
"status": 200,
"message": "Call connecting. Please wait...",
"logid": 123456
}
Bridge an agent and a customer with a POST request — the standard way to trigger click-to-call from your backend.
How it works: Send the did (caller ID), the agent ext_no and the customer phone. The platform calls the agent, then the customer, and connects the two legs in about a second.
Use it for “call me” buttons, CRM click-to-dial, support callbacks and sales follow-ups.
| didrequired | string | DID number (your virtual number) |
| ext_norequired | string | Agent extension number |
| phonerequired | string | Customer phone number to call |
{
"did": "+911143104567",
"ext_no": "2101",
"phone": "09876543210"
}
{
"status": 200,
"message": "Call connecting. Please wait...",
"logid": 123456
}
Bridge two numbers with extra control — a spoken intro, scheduling and explicit first/second legs.
How it works: Pass the did, first_phone and second_phone (and optional body message, schedule_datetime/timezone). The platform calls the first leg, optionally plays the message, then dials and bridges the second.
Use it for scheduled callbacks, whisper announcements before connect and custom two-party bridges.
| body | string | |
| didrequired | string | |
| first_phonerequired | string | |
| schedule_datetime | string | |
| second_phonerequired | string | |
| timezone | string |
{
"body": "Hello, connecting your call",
"did": "+911143104567",
"first_phone": "+919876543210",
"schedule_datetime": "2025-12-31 13:00:00",
"second_phone": "+919123456789",
"timezone": "Asia/Kolkata"
}
Retrieve recordings for click-to-call calls.
How it works: Call the endpoint to get recording references for bridged click-to-call calls.
Use it for QA, training and compliance review of callbacks.
Connect two people through your DID so neither party ever sees the other's real phone number — the privacy layer behind Uber/Ola-style "contact the driver" calling. Both legs ring from your DID, the platform bridges them, and you can update or cancel a live session and pull per-session logs. Use it for marketplaces, ride-hailing, deliveries, classifieds, real-estate and healthcare, where buyers and sellers must talk without exchanging personal numbers.
Bridge two people through your DID without revealing either party's real phone number — the same call-masking pattern Uber and Ola use to connect riders and drivers.
How it works: you pass both real numbers and a did. The platform calls the first party, then the second, and connects the two legs. Each party sees only your DID on their handset — never the other person's number. The mapping lives only inside the session, so once the call (or job) is over the link is gone and the numbers can never be harvested.
Use it for marketplaces, ride-hailing and deliveries, classifieds, real estate and healthcare — anywhere a buyer and seller must talk while keeping personal numbers private. Manage a live session with /api/click_connect_update (e.g. cancel it) and pull per-session records with /api/click_connect_logs.
| first_phonerequired | string | First party's phone number |
| second_phonerequired | string | Second party's phone number |
| didrequired | string | DID number to use as caller ID |
{
"first_phone": "+919876543210",
"second_phone": "+919123456789",
"did": "+911143104567"
}
{
"status": 200,
"message": "Call connecting. Please wait...",
"logid": 123457
}
Update or cancel a live number-masking (Click-Connect) session.
How it works: Identify the session with did and first_number, then pass an action (e.g. cancel) and optional body message to change or drop the connection.
Use it for ending a masked call early or adjusting a session in flight.
| actionrequired | string | |
| body | string | |
| didrequired | string | |
| first_numberrequired | string |
{
"action": "cancel",
"body": "Hello, connecting your call",
"did": "+911143104567",
"first_number": "+919876543210"
}
Fetch logs for your number-masking (Click-Connect) sessions.
How it works: Pass an optional did and from_date/to_date range; the API returns who connected, when and for how long.
Use it for auditing privacy-masked conversations and reconciling marketplace calls.
| did | string | |
| from_date | string | |
| orderby | string | |
| to_date | string |
{
"did": "+911143104567",
"from_date": "2025-08-01",
"orderby": "desc",
"to_date": "2025-08-31"
}
Run outbound voice campaigns at scale. Schedule and send calls from text-to-speech templates or pre-built IVR call flows, add numbers (single or bulk) to a campaign, and start/stop dialers on the fly.
List every call flow (IVR) configured in your account, with its ID and name.
How it works: Send your token; the API returns all saved call flows so you can pick a flow_id to play on outbound calls.
Use it for populating a flow picker, or looking up a flow_id before calling dial_by_flow.
{
"status": 200,
"data": [
{
"id": 1001,
"name": "Welcome IVR",
"description": "Main welcome menu"
},
{
"id": 1002,
"name": "Order Confirmation",
"description": "COD order confirmation flow"
},
{
"id": 1003,
"name": "Feedback Survey",
"description": "Post-call feedback collection"
}
]
}
Place an outbound call and play a pre-built IVR call flow to the customer.
How it works: Pass the did_no, the flow_id to play and the customer_no. The platform dials the customer and runs the flow, capturing the keypresses defined in it; add schedule_datetime and timezone to send it later.
Use it for order confirmations, reminders, surveys and any menu-driven outbound call.
| did_norequired | string | Your DID Number |
| flow_idrequired | string | Your Call Flow ID |
| customer_norequired | string | Phone number to call (with 0 prefix) |
| schedule_datetime | string | Schedule call for later (format: YYYY-MM-DD HH:mm:ss) |
| timezone | string | Timezone for scheduled call |
{
"did_no": "+911143104567",
"flow_id": "1001",
"customer_no": "09871234567",
"schedule_datetime": "2024-12-31 13:00:00",
"timezone": "Asia/Kolkata"
}
Place an outbound call that speaks a text-to-speech message built from a template.
How it works: Pass the did_no, customer_no and a template_name, filling any Variable placeholders. The platform dials the customer and reads out the rendered message; schedule it with schedule_datetime.
Use it for OTP and voice alerts, personalized reminders and confirmations without recording audio.
| did_norequired | string | Your DID Number |
| flow_id | string | Call Flow ID for context and options (optional) |
| customer_norequired | string | Phone number to call (with 0 prefix) |
| template_namerequired | string | Name of the text template |
| Variable | string | Variables as per text template (comma-separated) |
| schedule_datetime | string | Schedule call for later (format: YYYY-MM-DD HH:mm:ss) |
| timezone | string | Timezone for scheduled call |
{
"did_no": "+911143104567",
"flow_id": "1701",
"customer_no": "09354123456",
"template_name": "api_order_confirm",
"Variable": "John,ORD12345,1500",
"schedule_datetime": "2024-12-31 13:00:00",
"timezone": "Asia/Kolkata"
}
{
"status": 200,
"message": "Call initiated successfully",
"call_id": "call_txt_abc123"
}
List your auto-dialer campaigns with their IDs and status.
How it works: Send your token to get every dialer you've created, so you can pick a dialerid to load numbers into or start and stop.
Use it for showing a campaign dashboard, or looking up a dialerid before adding numbers.
{
"status": 200,
"data": [
{
"id": 101,
"name": "Order Confirmation Campaign",
"did_no": "+911143104567",
"status": "on",
"start_time": "09:00",
"end_time": "18:00",
"no_of_calls": 5,
"total_numbers": 1250,
"completed": 890,
"pending": 360
},
{
"id": 102,
"name": "Feedback Survey",
"did_no": "+911143104568",
"status": "off",
"start_time": "10:00",
"end_time": "17:00",
"no_of_calls": 3,
"total_numbers": 500,
"completed": 500,
"pending": 0
}
]
}
Add a single contact to an existing auto-dialer campaign.
How it works: Pass the dialerid with the number (and optional name / order_id). The contact joins the campaign's queue and is called when the dialer runs.
Use it for dripping new leads or COD orders into a running campaign one at a time.
| dialeridrequired | integer | Dialer ID |
| numberrequired | string | Phone number to add |
| name | string | Customer name (variable) |
| order_id | string | Order ID (variable) |
{
"dialerid": 101,
"number": "09876543210",
"name": "John Doe",
"order_id": "ORD12345"
}
{
"status": true,
"message": "Number added to dialer successfully"
}
Add many contacts to an auto-dialer campaign in one request.
How it works: Pass the dialerid and an array of numbers; all are queued for the campaign at once.
Use it for loading a full contact list or daily batch before starting a campaign.
| dialeridrequired | integer | Dialer ID |
| numbersrequired | array | Array of numbers with variables (max 100) |
{
"dialerid": 101,
"numbers": [
{
"number": "09876543210",
"name": "John Doe",
"order_id": "ORD001"
},
{
"number": "09876543211",
"name": "Jane Smith",
"order_id": "ORD002"
},
{
"number": "09876543212",
"name": "Bob Wilson",
"order_id": "ORD003"
}
]
}
{
"status": true,
"message": "3 numbers added to dialer successfully"
}
Start, pause or stop an auto-dialer campaign.
How it works: Pass the dialerid and the new status; the platform begins or halts dialing immediately.
Use it for launching a campaign, pausing during off-hours or stopping once a target is met.
| dialeridrequired | integer | Dialer ID |
| statusrequired | string | Status to set |
{
"dialerid": 101,
"status": "on"
}
{
"status": true,
"message": "Dialer status changed to on"
}
List the saved customer/contact lists in your account.
How it works: Send your token to retrieve every contact list with its name and ID.
Use it for choosing an audience when building a campaign.
{
"status": 200,
"data": [
{
"id": 1,
"name": "December Leads",
"count": 1500,
"created_at": "2024-12-01 10:00:00"
},
{
"id": 2,
"name": "Premium Customers",
"count": 350,
"created_at": "2024-11-15 14:30:00"
}
]
}
Create a new named customer list to group contacts.
How it works: Pass a listname; the API creates an empty list you can then fill with contacts.
Use it for segmenting audiences — by city, product or campaign — before dialing.
| listnamerequired | string | Name for the customer list |
{
"listname": "January Campaign 2025"
}
{
"status": true,
"message": "Customer list created successfully",
"list_id": 15
}
Create an outbound text-to-speech dialer campaign.
How it works: Define the name, did_no, calls-per-attempt (no_of_call), calling window (start_time/end_time) and the text_template_id to speak. The campaign is created ready for numbers.
Use it for setting up recurring TTS broadcasts — reminders, offers or alerts.
| namerequired | string | Dialer campaign name |
| did_norequired | string | DID number to use |
| no_of_callrequired | integer | Number of concurrent calls |
| start_timerequired | string | Start time (24Hr format HH:mm) |
| end_timerequired | string | End time (24Hr format HH:mm) |
| text_template_idrequired | integer | Text template ID to use |
| send_call_flow_id | integer | Call flow ID for language (Kannada: 5421, Tamil: 5422, English: 102, Telugu: 5423) |
{
"name": "Order Confirmation Dialer",
"did_no": "+911143104567",
"no_of_call": 5,
"start_time": "09:00",
"end_time": "18:00",
"text_template_id": 101,
"send_call_flow_id": 102
}
{
"status": true,
"message": "Text dialer created successfully",
"dialer_id": 105
}
Update the settings of an existing text-to-speech dialer.
How it works: Pass the dialer id with any fields to change — name, did_no, calling window or text_template_id.
Use it for retuning a campaign's hours, message or pace without recreating it.
| idrequired | integer | Dialer ID to edit |
| name | string | Dialer campaign name |
| did_no | string | DID number to use |
| no_of_call | integer | Number of concurrent calls |
| start_time | string | Start time (24Hr format HH:mm) |
| end_time | string | End time (24Hr format HH:mm) |
| text_template_id | integer | Text template ID to use |
{
"id": 105,
"name": null,
"did_no": null,
"no_of_call": null,
"start_time": null,
"end_time": null,
"text_template_id": null
}
{
"status": true,
"message": "Dialer updated successfully"
}
Add a batch of records to a dialer campaign.
How it works: Pass a recordList array of contacts; all are queued for dialing in one call.
Use it for bulk-loading leads from a form, sheet or nightly export.
| recordList | array | List of records to dial |
{
"recordList": [
{
"number": "09876543210",
"name": "John Doe"
}
]
}
Trigger a flow-based outbound call with simple query parameters.
How it works: Pass your token, did, flow and phone (with optional body); the platform dials the number and plays the flow.
Use it for webhook actions and links that can only send query parameters.
| tokenrequired | string | API token |
| didrequired | string | Your DID number |
| flowrequired | string | Call flow id |
| phonerequired | string | Customer number |
| body | string | Optional call body |
{
"token": "YOUR_API_TOKEN",
"did": "+911143104567",
"flow": "1001",
"phone": "09876543210",
"body": ""
}
Manage who can take and make calls. Enable or disable agent extensions, add new agents, and assign DID numbers to agents.
Turn an agent extension on or off.
How it works: Pass the ext_no and the desired status; a disabled agent can't make or receive calls until re-enabled.
Use it for suspending agents who've left a shift, are offboarding or are temporarily blocked.
| ext_norequired | string | Agent extension number |
| statusrequired | string | 0 for disable, 1 for enable |
{
"ext_no": "2101",
"status": "1"
}
Create a new agent with a login and extension.
How it works: Pass name, email, phonenumber and password; the agent is provisioned and can sign in to take calls.
Use it for onboarding new team members programmatically from your HR or admin tool.
| namerequired | string | Agent's full name |
| emailrequired | string | Agent's email address |
| phonenumberrequired | string | Agent's phone number (10 digits) |
| passwordrequired | string | Agent's login password (must contain uppercase, lowercase, number, special char) |
{
"name": "John Doe",
"email": "john.doe@company.com",
"phonenumber": "9876543210",
"password": "SecurePass@123"
}
{
"status": true,
"message": "Agent added successfully",
"data": {
"agent_id": 456,
"ext_no": "2105",
"name": "John Doe",
"email": "john.doe@company.com"
}
}
Assign or change the DID number tied to an agent.
How it works: Pass the agent_ext and the did_num; outbound calls from that agent then show the new DID.
Use it for giving agents local caller IDs or moving numbers between team members.
| agent_extrequired | string | Agent extension number |
| did_numrequired | string | DID number to assign |
{
"agent_ext": "2101",
"did_num": "+911143104567"
}
{
"status": true,
"message": "Agent DID updated successfully"
}
List the agents in your account.
How it works: Send your token to retrieve all agents with their extensions and status.
Use it for team dashboards and looking up an extension before assigning calls.
| token | string · query | API token (alternative to Bearer header) |
List all extensions configured in your account.
How it works: Call the endpoint to get every extension with its owner and state.
Use it for mapping extensions to agents and building routing UIs.
Get the full configuration of a single extension.
How it works: Pass the ext_no to retrieve its settings, owner and assigned DID.
Use it for showing or editing one extension's setup.
| ext_no | string |
{
"ext_no": "2101"
}
Deactivate the user on a group extension.
How it works: Pass the ext_no; that user can no longer use the extension until reactivated.
Use it for revoking access when someone leaves a shared line or team.
| ext_no | string |
{
"ext_no": "2101"
}
Set an expiry date on an extension.
How it works: Pass the ext_no and expiry_date; the extension auto-disables after that date.
Use it for temporary agents, trials and contractor access.
| expiry_date | string | |
| ext_no | string |
{
"expiry_date": "2025-12-31",
"ext_no": "2101"
}
Create a new group extension with its user and call settings.
How it works: Pass name, extn_no, password and options like did_no, call_forwarding, expiry_date and kyc_required; the extension is provisioned ready to take calls.
Use it for onboarding team members onto shared DIDs with the right routing.
| call_forwardingrequired | string | Flag: "0" or "1" |
| connectionrequired | string | Flag: "0" or "1" |
| did_norequired | string | |
| string | ||
| expiry_date | string | |
| extn_no | string | |
| kyc_required | string | Flag: "0" or "1" |
| name | string | |
| passwordrequired | string | |
| phone | string | |
| recording_idrequired | string |
{
"call_forwarding": "1",
"connection": "1",
"did_no": "+911143104567",
"email": "user@company.com",
"expiry_date": "2025-12-31",
"extn_no": "2101",
"kyc_required": "0",
"name": "John Doe",
"password": "SecurePass@123",
"phone": "09876543210",
"recording_id": "2207"
}
Audit and reconcile every interaction. Fetch complete call history — click-to-call, auto-dialer and inbound — filter by number or type, check live call status and attach notes to records.
Fetch your full call history for a date range.
How it works: Pass from_date and to_date; the API returns calls across click-to-call, dialer and inbound with status and timing.
Use it for reporting, reconciliation and syncing call activity into your CRM.
| from_date | string | Start date (YYYY-MM-DD) |
| to_date | string | End date (YYYY-MM-DD) |
{
"from_date": "2024-12-01",
"to_date": "2024-12-31"
}
{
"status": 200,
"data": [
{
"recordid": 12345,
"did_no": "+911143104567",
"client_no": "9876543210",
"agent_no": "9123456789",
"attended_by": "John Doe",
"ext_no": "2101",
"call_time": "2024-12-15 10:30:45",
"call_duration": 185,
"call_status": "answered",
"call_type": "inbound",
"recording_url": "https://calls.ivrsolutions.in/monitor/2024/12/15/rec_12345.mp3",
"dtmf_input": "1"
},
{
"recordid": 12346,
"did_no": "+911143104567",
"client_no": "9876543211",
"agent_no": "9123456788",
"attended_by": "Jane Smith",
"ext_no": "2102",
"call_time": "2024-12-15 11:15:22",
"call_duration": 92,
"call_status": "answered",
"call_type": "inbound",
"recording_url": "https://calls.ivrsolutions.in/monitor/2024/12/15/rec_12346.mp3",
"dtmf_input": ""
}
]
}
Look up all calls involving a specific phone number.
How it works: Pass your token and the phone; the API returns every log entry for that number.
Use it for showing a contact's call history on their profile screen.
| tokenrequired | string · query | |
| phonerequired | string · query | Phone number to search |
{
"status": 200,
"data": [
{
"recordid": 12345,
"did_no": "+911143104567",
"client_no": "9876543210",
"attended_by": "John Doe",
"call_time": "2024-12-15 10:30:45",
"call_duration": 185,
"call_type": "inbound",
"recording_url": "https://calls.ivrsolutions.in/monitor/2024/12/15/rec_12345.mp3"
}
]
}
Fetch logs specific to click-to-call (agent↔customer bridge) calls.
How it works: Call the endpoint to get click-to-call records with connection status and duration.
Use it for measuring callback success and agent response on click-to-call.
{
"status": 200,
"data": [
{
"recordid": 56789,
"did_no": "+911143104567",
"agent_no": "9123456789",
"client_no": "9876543210",
"agent_name": "John Doe",
"call_time": "2024-12-15 14:22:10",
"call_duration": 245,
"call_status": "answered",
"recording_url": "https://calls.ivrsolutions.in/monitor/c2c/2024/12/15/c2c_56789.mp3"
}
]
}
Look up click-to-call records for one phone number.
How it works: Pass your token and the phone to get that number's click-to-call history.
Use it for tracing a specific customer's callback attempts.
| tokenrequired | string · query | |
| phonerequired | string · query | Phone number to search |
{
"status": 200,
"data": [
{
"recordid": 56789,
"did_no": "+911143104567",
"agent_no": "9123456789",
"client_no": "9876543210",
"call_time": "2024-12-15 14:22:10",
"call_duration": 245,
"recording_url": "https://calls.ivrsolutions.in/monitor/c2c/2024/12/15/c2c_56789.mp3"
}
]
}
Fetch the results of an auto-dialer campaign.
How it works: Pass the dialerid to get every attempted call with answer status, keypresses and outcome.
Use it for reconciling campaign delivery and acting on customer responses.
| dialerid | integer | Filter by specific dialer ID (optional) |
{
"dialerid": 101
}
{
"status": 200,
"data": [
{
"id": 78901,
"dialer_id": 101,
"dialer_name": "Order Confirmation Campaign",
"customer_no": "9876543210",
"call_time": "2024-12-15 10:05:30",
"call_duration": 45,
"call_status": "answered",
"dtmf_input": "1",
"attempts": 1
},
{
"id": 78902,
"dialer_id": 101,
"dialer_name": "Order Confirmation Campaign",
"customer_no": "9876543211",
"call_time": "2024-12-15 10:06:15",
"call_duration": 0,
"call_status": "no_answer",
"dtmf_input": "",
"attempts": 2
}
]
}
Get the list of call status values you can filter by or set on records.
How it works: Send your token to retrieve the supported status labels (e.g. answered, missed, busy).
Use it for building status filters and dropdowns in your dashboard.
{
"status": true,
"data": [
{
"id": 1,
"name": "Interested"
},
{
"id": 2,
"name": "Not Interested"
},
{
"id": 3,
"name": "Call Back Later"
},
{
"id": 4,
"name": "Wrong Number"
},
{
"id": 5,
"name": "DND"
},
{
"id": 6,
"name": "Converted"
},
{
"id": 7,
"name": "Follow Up Required"
}
]
}
Attach a status and note to a call record.
How it works: Pass the record_id with call_status, call_type and call_remark; the record is updated for reporting.
Use it for logging dispositions — interested, callback, wrong number — against each call.
| record_idrequired | string | Record ID from call_log API or webhook |
| call_statusrequired | integer | Status ID from get_call_status API |
| call_typerequired | string | Type of call |
| call_remark | string | Remark or note for the call (optional) |
{
"record_id": "12345",
"call_status": 1,
"call_type": "incoming",
"call_remark": "Customer interested in premium plan. Follow up next week."
}
{
"status": true,
"message": "Call note updated successfully"
}
Pull new call logs since your last sync, across all call types.
How it works: Pass the last seen IDs (last_c2c_log_id, last_call_log_id, last_dialer_log_id); the API returns only newer records so you never refetch.
Use it for efficient incremental syncs into a data warehouse or CRM.
| last_c2c_log_id | string | Last click-to-call log id you have |
| last_call_log_id | string | Last call log id you have |
| last_dialer_log_id | string | Last dialer log id you have |
{
"last_c2c_log_id": "0",
"last_call_log_id": "0",
"last_dialer_log_id": "0"
}
Attach a note and status to a specific call.
How it works: Pass the sip_call_id with the note, call_type and status to annotate that call.
Use it for logging dispositions and context against individual calls.
| sip_call_idrequired | string | SIP call id of the call |
| noterequired | string | Note text |
| call_type | string | incoming | outgoing | c2c | dialer |
| status | string | Call status code |
{
"sip_call_id": "abc123.45@sip",
"note": "Customer requested a callback",
"call_type": "c2c",
"status": "1"
}
Manage your virtual (DID) numbers. List the numbers you own, search availability by region, and purchase new DID numbers programmatically.
List the DID (virtual) numbers linked to your account.
How it works: Call the endpoint to retrieve every DID you own with its details.
Use it for populating caller-ID pickers and auditing your number inventory.
{
"status": true,
"data": [
{
"did_number": "+911143104567",
"region": "Delhi",
"status": "active",
"type": "landline"
},
{
"did_number": "+918043104568",
"region": "Bangalore",
"status": "active",
"type": "landline"
},
{
"did_number": "+911onal60123",
"region": "Toll-Free",
"status": "active",
"type": "tollfree"
}
]
}
List the regions where DID numbers are available to buy.
How it works: Send your token to get the regions you can search and purchase numbers in.
Use it for driving a region selector before searching for a number.
{
"status": true,
"message": "Region found successfully",
"data": [
{
"id": 1,
"name": "Delhi",
"code": "011"
},
{
"id": 2,
"name": "Bangalore",
"code": "080"
},
{
"id": 3,
"name": "Mumbai",
"code": "022"
},
{
"id": 4,
"name": "Chennai",
"code": "044"
},
{
"id": 5,
"name": "Hyderabad",
"code": "040"
},
{
"id": 6,
"name": "Faridabad",
"code": "0129"
}
]
}
Search for DID numbers available to purchase.
How it works: Pass country_code, region and an optional search_pattern; the API returns matching available numbers.
Use it for letting customers pick a local or vanity number to buy.
| country_coderequired | string | Country code |
| regionrequired | string | Region ID (1: Delhi, 2: Bangalore, 6: Faridabad) |
| search_pattern | string | Search pattern type (optional) |
| pattern | string | Pattern to search (optional) |
{
"country_code": "IN",
"region": "1",
"search_pattern": null,
"pattern": "4310"
}
{
"status": true,
"message": "Numbers found",
"cost": "500",
"currency": "INR",
"data": [
"+911143104501",
"+911143104502",
"+911143104503",
"+911143104504",
"+911143104505"
]
}
Purchase a DID number and add it to your account.
How it works: Pass the country and the chosen number; the platform provisions it and links it to you.
Use it for self-serving new local presence or campaign numbers.
| countryrequired | string | Country code |
| numberrequired | string | DID number to purchase |
{
"country": "IN",
"number": "+911143104501"
}
{
"status": true,
"message": "Did added to your account",
"data": "+911143104501"
}
List the DID numbers linked to your account.
How it works: Call the endpoint to retrieve every DID with its status and assignment.
Use it for auditing numbers and choosing caller IDs.
Search for purchasable DID numbers by region and pattern.
How it works: Pass did_region, availabilty_level, pattern_last_digits and size to get matching available numbers.
Use it for offering customers a choice of local or memorable numbers.
| availabilty_level | string | |
| did_region | string | |
| pattern_last_digits | string | |
| size | string |
{
"availabilty_level": "1",
"did_region": "1",
"pattern_last_digits": "4310",
"size": "20"
}
Provision and configure a DID — routing, owner and options — in one call.
How it works: Pass did_no with settings like extn_no, call_forwarding, connection, expiry_date and kyc_required to set up or update the number.
Use it for fully automating number onboarding and routing changes.
| call_forwardingrequired | string | Flag: "0" or "1" |
| connectionrequired | string | Flag: "0" or "1" |
| did_no | string | |
| string | ||
| expiry_date | string | |
| extn_no | string | |
| kyc_required | string | Flag: "0" or "1" |
| name | string | |
| passwordrequired | string | |
| phone | string | |
| recording_idrequired | string |
{
"call_forwarding": "1",
"connection": "1",
"did_no": "+911143104567",
"email": "user@company.com",
"expiry_date": "2025-12-31",
"extn_no": "2101",
"kyc_required": "0",
"name": "John Doe",
"password": "SecurePass@123",
"phone": "09876543210",
"recording_id": "2207"
}
Configure a DID shared by a group or team.
How it works: Pass did_no with the group's settings — call_forwarding, connection, expiry_date and kyc_required — to manage the shared number.
Use it for running a team hotline or department line by API.
| call_forwardingrequired | string | Flag: "0" or "1" |
| connectionrequired | string | Flag: "0" or "1" |
| did_no | string | |
| expiry_date | string | |
| extn_no | string | |
| kyc_requiredrequired | string | Flag: "0" or "1" |
| name | string | |
| passwordrequired | string | |
| recording_idrequired | string |
{
"call_forwarding": "1",
"connection": "1",
"did_no": "+911143104567",
"expiry_date": "2025-12-31",
"extn_no": "2101",
"kyc_required": "0",
"name": "John Doe",
"password": "SecurePass@123",
"recording_id": "2207"
}
Configure a group DID for a SIP / softphone user.
How it works: Pass did_no with the SIP user's details (email, phone) and routing options to provision them on the shared number.
Use it for putting softphone or WebRTC agents on a shared DID.
| call_forwardingrequired | string | Flag: "0" or "1" |
| connectionrequired | string | Flag: "0" or "1" |
| did_no | string | |
| string | ||
| expiry_date | string | |
| extn_no | string | |
| kyc_requiredrequired | string | Flag: "0" or "1" |
| name | string | |
| passwordrequired | string | |
| phone | string | |
| recording_idrequired | string |
{
"call_forwarding": "1",
"connection": "1",
"did_no": "+911143104567",
"email": "user@company.com",
"expiry_date": "2025-12-31",
"extn_no": "2101",
"kyc_required": "0",
"name": "John Doe",
"password": "SecurePass@123",
"phone": "09876543210",
"recording_id": "2207"
}
Check the live status of your DID numbers.
How it works: Send your token to see which DIDs are active and reachable right now.
Use it for uptime dashboards and routing health checks.
| token | string | API token (alternative to the Bearer header) |
{
"token": "YOUR_API_TOKEN"
}
Check live DID status in the agent's context.
How it works: Send your token to get the agent's DIDs and their current state.
Use it for showing agents whether their lines are live.
| token | string | API token (alternative to the Bearer header) |
{
"token": "YOUR_API_TOKEN"
}
Place outbound calls answered by AI / WSS voice bots. Calls bridge to your WebSocket server for real-time, bidirectional audio via the WSS Telephony Bridge.
List the AI voice bots configured in your account.
How it works: Call the endpoint to get each bot with its ID, so you can reference one when placing AI calls.
Use it for populating a bot selector before dialing with an AI agent.
Place an outbound call answered by an AI voice bot over your WebSocket bridge.
How it works: Pass the customer_no and a wss_url (plus optional system_msg, sttlanguage_code and wss_header). The call connects to your WebSocket for real-time, two-way audio — speech-to-text in, audio out, with in-call transfers and DTMF.
Use it for AI receptionists, lead qualification calls and conversational reminders.
| Voicechat_id | string | ID of the configured voice bot to use |
| ai_agent_ext | string | Agent extension to bridge for hybrid (bot + human) routing |
| connect_ws_after_answer | string | Connect the WebSocket only after the call is answered ("0" or "1") |
| customer_no | string | Customer phone number to call (prefix 0 or use country code) |
| schedule_datetime | string | Optional schedule time, format "YYYY-mm-dd H:i:s" |
| sip_url | string | SIP target the bot can transfer/bridge to |
| sttlanguage_code | string | Speech-to-text language code, e.g. en-IN, hi-IN |
| system_msg | string | System prompt that defines the AI agent’s behaviour |
| text | string | Optional opening line the bot speaks when the call connects |
| timezone | string | Timezone for scheduling, e.g. Asia/Kolkata |
| wss_header | string | Header sent when the bridge connects to your WSS endpoint, e.g. "Authorization: Bearer YOUR_TOKEN" |
| wss_url | string | Your WebSocket Secure (WSS) endpoint the call audio streams to/from, e.g. wss://your-bot.example.com/voice |
{
"Voicechat_id": "4821",
"ai_agent_ext": "2101",
"connect_ws_after_answer": "1",
"customer_no": "09876543210",
"schedule_datetime": "2025-12-31 13:00:00",
"sip_url": "sip:bot@example.com",
"sttlanguage_code": "en-IN",
"system_msg": "You are a helpful assistant.",
"text": "Hi, this is an automated call.",
"timezone": "Asia/Kolkata",
"wss_header": "Authorization: Bearer xyz",
"wss_url": "wss://example.com/stream"
}
Place an outbound call handled by a pre-built voice bot.
How it works: Pass the customer_no, did_num and the Voicechat_id (with optional system_msg/text). The platform dials and runs the chosen bot.
Use it for running a saved conversational bot without wiring up your own WebSocket.
| Voicechat_id | string | ID of the configured voice bot to use |
| customer_no | string | Customer phone number to call (prefix 0 or use country code) |
| did_num | string | Your DID number to place the call from |
| schedule_datetime | string | Optional schedule time, format "YYYY-mm-dd H:i:s" |
| system_msg | string | System prompt that defines the AI agent’s behaviour |
| text | string | Optional opening line the bot speaks when the call connects |
| timezone | string | Timezone for scheduling, e.g. Asia/Kolkata |
{
"Voicechat_id": "4821",
"customer_no": "09876543210",
"did_num": "+911143104567",
"schedule_datetime": "2025-12-31 13:00:00",
"system_msg": "You are a helpful assistant.",
"text": "Hi, this is an automated call.",
"timezone": "Asia/Kolkata"
}
List your AI voice bots.
How it works: Call the endpoint to get each bot with its ID and metadata.
Use it for choosing a bot when configuring AI calls.
Get a voice bot's configuration and training data.
How it works: Pass the voicebot_id (and the aitraingdata flag) to retrieve its setup and knowledge.
Use it for inspecting or syncing a bot's training before deploying it.
| voicebot_idrequired | string | Voice bot id |
| aitraingdata | string | Include AI training data (0|1) |
{
"voicebot_id": "4821",
"aitraingdata": "1"
}
Create and manage text-to-speech templates for dialers.
Create a reusable text-to-speech template.
How it works: Pass a template_name and the text_content (with variable placeholders); it's saved for use by TTS dialers.
Use it for standardizing OTP, reminder and alert scripts across campaigns.
| template_name | string | |
| text_content | string |
{
"template_name": "api_order_confirm",
"text_content": "Press 1 to confirm your order."
}
Check whether a text template is approved and ready to use.
How it works: Pass the template_name to get its current status.
Use it for confirming a template is live before launching a dependent campaign.
| template_name | string |
{
"template_name": "api_order_confirm"
}
List your text-to-speech templates.
How it works: Send your token to retrieve every template with its name and status.
Use it for showing a template picker when building TTS dialers.
| token | string · query | API token (alternative to Bearer header) |
Save and look up contacts, and list call variables.
Save a contact to your address book.
How it works: Pass name, number and country_code; the contact is stored for lookups and screen-pops.
Use it for syncing CRM contacts so agents see names on incoming calls.
| country_code | string | |
| name | string | |
| number | string |
{
"country_code": "+91",
"name": "John Doe",
"number": "09876543210"
}
Look up a saved contact by phone number.
How it works: Pass the phone to get the matching contact's stored details.
Use it for caller-ID screen-pops and click-to-dial lookups.
| phone | string |
{
"phone": "09876543210"
}
Look up a contact in the calling agent's context.
How it works: Pass the phone to resolve the contact as visible to the agent handling the call.
Use it for powering agent screen-pops scoped to their own contacts.
| phone | string |
{
"phone": "09876543210"
}
List the variables available for call flows and text templates.
How it works: Send your token to get the variable keys you can insert into messages and flows.
Use it for showing available merge fields when authoring templates.
| token | string · query | API token (alternative to Bearer header) |
Resolve details about an inbound caller.
How it works: Pass the caller_number to get any stored contact and history for that caller.
Use it for instant screen-pops the moment a call rings.
| caller_numberrequired | string | Phone number to look up |
{
"caller_number": "09876543210"
}
Register webhook URLs to receive real-time call events.
Register a URL to receive real-time call events.
How it works: Pass your webhookurl and a secret_key; the platform POSTs events — rings, answers, hangups, DTMF — to that URL, signed with your key.
Use it for syncing call state into your app, triggering automations and verifying payloads.
| secret_key | string | |
| webhookurl | string |
{
"secret_key": "whsec_abc123",
"webhookurl": "https://yourapp.com/webhooks/ivr"
}
Helper endpoints for CRM and lead integrations.
Fetch lead data formatted for CRM integration.
How it works: Call the endpoint to pull lead and call data ready to push into your CRM.
Use it for feeding leads and call outcomes into your sales pipeline.
These endpoints are a starting point, not a ceiling. Tell us your requirement — new endpoints, custom payloads, bespoke call flows — and our team will build it to fit how you work.