Get Campaign Status
curl --request GET \
--url https://api.vaanivoice.ai/api/campaigns/{campaign_id}/status \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.vaanivoice.ai/api/campaigns/{campaign_id}/status"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.vaanivoice.ai/api/campaigns/{campaign_id}/status', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.vaanivoice.ai/api/campaigns/{campaign_id}/status",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.vaanivoice.ai/api/campaigns/{campaign_id}/status"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.vaanivoice.ai/api/campaigns/{campaign_id}/status")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.vaanivoice.ai/api/campaigns/{campaign_id}/status")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"campaign_status": "<string>",
"time_range_from": "<string>",
"time_range_to": "<string>",
"stats": {}
}Campaigns
Get Campaign Status
Get current status and progress for a campaign
GET
/
api
/
campaigns
/
{campaign_id}
/
status
Get Campaign Status
curl --request GET \
--url https://api.vaanivoice.ai/api/campaigns/{campaign_id}/status \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.vaanivoice.ai/api/campaigns/{campaign_id}/status"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.vaanivoice.ai/api/campaigns/{campaign_id}/status', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.vaanivoice.ai/api/campaigns/{campaign_id}/status",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.vaanivoice.ai/api/campaigns/{campaign_id}/status"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.vaanivoice.ai/api/campaigns/{campaign_id}/status")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.vaanivoice.ai/api/campaigns/{campaign_id}/status")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"campaign_status": "<string>",
"time_range_from": "<string>",
"time_range_to": "<string>",
"stats": {}
}Get Campaign Status
Return the current status and progress counters for a campaign.Path Parameters
string
required
UUID of the campaign
Example Request
curl "https://api.vaani.ai/api/campaigns/abc-123-xyz/status" \
-H "X-API-Key: vaani_abc123..."
Response 200 OK
{
"id": "e8632ffe-ce38-4ae9-8185-72ef708aaa51",
"campaign_name": "campaing api ",
"client_id": "e3e5b338-937e-4672-a700-1a1f5817a385",
"client_name": "Nitish Mishra",
"agent_name": "nitishmishraragcheck-21-08",
"agent_display_name": "rag check - 21-08",
"agent_disposition": {
"enabled": true,
"prompt_based": [
{
"name": "Final Outcome",
"type": "string",
"prompt": "Evaluate the complete call transcript to determine the final resolution state based on the agent's Call Flow and Guardrails. Assign the single most accurate outcome that reflects how the call ended.",
"list_of_tags": {
"Successfully Resolved - Status Provided": "The user authenticated (via ID or Smart Fallback), received their status/delivery date in Step 3, agreed to the timing (Step 4, Path A), and the call concluded gracefully without requiring a ticket.",
"Escalated - Modification or Delay": "The user requested changes to the order, asked for a refund, or expressed dissatisfaction with a delay (Step 4, Path B), resulting in the agent verbally simulating a priority ticket for a senior specialist callback.",
"Escalated - Delivery Dispute": "The user claimed the package was marked delivered but not received, or demanded an urgent expedite for a gift, triggering an investigation ticket via the Objection Handling pivots.",
"Escalated - Authentication Failure": "The user provided the wrong Order ID, rejected the Smart Fallback suggestion, and the agent logged a ticket for a callback to locate the correct account.",
"Dropped - User Busy / Refused": "In Step 1, the user indicated they were busy, confused, or answered \"No\" to continuing the call, and the agent ended the call.",
"Dropped - Connection / Dead Air": "The call was terminated by the agent due to prolonged user silence or consistently garbled audio/ASR failure that could not be recovered.",
"Dropped - Hostile Caller": "The user became excessively angry or abusive, prompting the agent to trigger the Hostile/Angry guardrail, promise a logistics manager escalation, and immediately end the call.\n\n\n\n\nDefault End Conversation Phrase \n\n\nThanks so much for reaching out, really appreciate it. Have a great rest of your day!\n\n\n\n\nDescription:\n\nSanjay is an Order Support Assistant designed to sound warm, empathetic, and professionally casual. The objective is to assist inbound e-commerce customers with order status inquiries by securely verifying details, providing delivery updates, and escalating complex requests."
}
}
]
},
"agent_data_collection": {
"enabled": true,
"data_points": [
{
"name": "Caller Intent",
"prompt": "Analyze the user's statements in Step 1 and throughout the call to determine their primary reason for engaging with the agent. Output ONLY the exact value.",
"nullable": false,
"choices": [
"Status Check",
"Order Modification",
"Refund Request",
"Lost/Missing Package",
"Expedite Request",
"Other"
]
},
{
"name": "Spoken Order ID",
"prompt": "Extract the exact alphanumeric Order ID spoken by the customer during Step 2 of the flow. Output ONLY the exact alphanumeric string without conversational filler. If they did not provide one, output null.",
"nullable": true,
"choices": null
},
{
"name": "Authentication Path",
"prompt": "Identify how the agent successfully authenticated or attempted to authenticate the user's order in Step 2. Output ONLY the exact value.",
"nullable": false,
"choices": [
"ID Match",
"Smart Fallback Accepted",
"Authentication Failed"
]
},
{
"name": "Delivery Window Acceptance",
"prompt": "Evaluate the user's response in Step 3 when presented with the delivery date/timing. Did the timing work for them? Output ONLY the exact value.",
"nullable": true,
"choices": [
"Accepted",
"Rejected/Needs Change"
]
},
{
"name": "Escalation Reason",
"prompt": "If the agent verbally simulated logging a ticket for a callback, extract the core reason requested by the user (e.g., address change, gift urgency, marked delivered but missing). Output a concise 2-4 word summary.",
"nullable": true,
"choices": null
},
{
"name": "Confirmed Callback Number",
"prompt": "If the Smart Fallback failed or a ticket was generated, and the agent asked if the current number was the best way to reach them, extract the phone number if spoken, or output \"Caller ID Confirmed\" if they simply agreed. Output ONLY the exact value.",
"nullable": true,
"choices": null
},
{
"name": "Customer Sentiment",
"prompt": "Analyze the customer's tone, pacing, and word choice throughout the transcript to determine their overall emotional state. Output ONLY the exact value.",
"nullable": false,
"choices": [
"Positive",
"Neutral",
"Frustrated",
"Hostile"
]
}
]
},
"agent_outbound_numbers": [
"+918065481305"
],
"excel_blob_url": "https://vaani-uat-storage.s3.ap-south-1.amazonaws.com/campaigns/e3e5b338-937e-4672-a700-1a1f5817a385/d3c4c1dd-e52d-4b4e-92d1-fccf63b55dad_Untitled spreadsheet - Sheet1 (2) (1).csv",
"results_excel_blob_url": null,
"last_result_generated_at": null,
"campaign_status": "active",
"contact_source_type": "csv",
"gsheet_config": null,
"days_of_week": "tuesday",
"post_processing_status": "not_processed",
"time_range_from": "08:30:00Z",
"time_range_to": "14:29:00Z",
"max_retries": 1,
"retry_after_mins": 5,
"call_concurrency": 1,
"start_date": "2026-08-25T08:30:00",
"end_date": "2026-08-26T14:29:00",
"campaign_statistics": {
"total_calls": 1,
"total_ceiled_call_duration_seconds": 9,
"total_ceiled_call_duration_minutes": 1,
"call_eval_tag_counts": {},
"source": "calls.campaign_id",
"computed_at": "2026-08-25T10:27:42.949087"
},
"created_at": "2026-08-25T10:26:31.403625",
"updated_at": "2026-08-25T10:26:31.403634",
"stats": {
"total_calls": 2,
"completed": 0,
"pending": 1,
"in_progress": 1,
"failed": 0
},
"notification_emails": null,
"webhook_url": null,
"per_call_webhook_url": null,
"webhook_id": null,
"perform_dnd_check": false,
"orchestrator": "python"
}
Response Fields
string
Current status:
scheduled, active, paused, paused_out_of_range, completed, cancelledstring
Daily calling window start time (UTC with Z suffix)
string
Daily calling window end time (UTC with Z suffix)
object
Real-time call statistics for the campaign

