curl --request POST \
--url https://api.withallo.com/v2/api/analytics/outbound \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"date": {
"from": "2026-03-25",
"to": "2026-04-21"
},
"compare_date": {
"from": "2026-02-25",
"to": "2026-03-24"
},
"tags": [
"meeting_booked"
],
"granularity": "DAY"
}
'import requests
url = "https://api.withallo.com/v2/api/analytics/outbound"
payload = {
"date": {
"from": "2026-03-25",
"to": "2026-04-21"
},
"compare_date": {
"from": "2026-02-25",
"to": "2026-03-24"
},
"tags": ["meeting_booked"],
"granularity": "DAY"
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
date: {from: '2026-03-25', to: '2026-04-21'},
compare_date: {from: '2026-02-25', to: '2026-03-24'},
tags: ['meeting_booked'],
granularity: 'DAY'
})
};
fetch('https://api.withallo.com/v2/api/analytics/outbound', 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.withallo.com/v2/api/analytics/outbound",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'date' => [
'from' => '2026-03-25',
'to' => '2026-04-21'
],
'compare_date' => [
'from' => '2026-02-25',
'to' => '2026-03-24'
],
'tags' => [
'meeting_booked'
],
'granularity' => 'DAY'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.withallo.com/v2/api/analytics/outbound"
payload := strings.NewReader("{\n \"date\": {\n \"from\": \"2026-03-25\",\n \"to\": \"2026-04-21\"\n },\n \"compare_date\": {\n \"from\": \"2026-02-25\",\n \"to\": \"2026-03-24\"\n },\n \"tags\": [\n \"meeting_booked\"\n ],\n \"granularity\": \"DAY\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.withallo.com/v2/api/analytics/outbound")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"date\": {\n \"from\": \"2026-03-25\",\n \"to\": \"2026-04-21\"\n },\n \"compare_date\": {\n \"from\": \"2026-02-25\",\n \"to\": \"2026-03-24\"\n },\n \"tags\": [\n \"meeting_booked\"\n ],\n \"granularity\": \"DAY\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.withallo.com/v2/api/analytics/outbound")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"date\": {\n \"from\": \"2026-03-25\",\n \"to\": \"2026-04-21\"\n },\n \"compare_date\": {\n \"from\": \"2026-02-25\",\n \"to\": \"2026-03-24\"\n },\n \"tags\": [\n \"meeting_booked\"\n ],\n \"granularity\": \"DAY\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"date": {
"from": "2026-03-25",
"to": "2026-04-21"
},
"compare_date": {
"from": "2026-03-25",
"to": "2026-04-21"
},
"funnel": {
"dials": {
"count": {
"value": 123,
"previous": 123,
"change": 123
},
"rate": 123
},
"connected": {
"count": {
"value": 123,
"previous": 123,
"change": 123
},
"rate": 123
},
"conversations": {
"count": {
"value": 123,
"previous": 123,
"change": 123
},
"rate": 123
},
"conversions": {
"count": {
"value": 123,
"previous": 123,
"change": 123
},
"rate": 123
}
},
"time_series": {
"dials": [
{
"date": "2023-12-25",
"value": 123
}
],
"connected": [
{
"date": "2023-12-25",
"value": 123
}
],
"connection_rate": [
{
"date": "2023-12-25",
"value": 123
}
],
"conversions": [
{
"date": "2023-12-25",
"value": 123
}
]
},
"heatmap": {
"dials": [
{
"hour": 123,
"value": 123
}
],
"connected": [
{
"hour": 123,
"value": 123
}
],
"connection_rate": [
{
"hour": 123,
"value": 123
}
]
},
"leaderboard": [
{
"user": {
"id": "usr-abc123",
"name": "John",
"email": "[email protected]"
},
"connected": 123
}
],
"time_spent": {
"avg_ringing_time_seconds": {
"value": 123,
"previous": 123,
"change": 123
},
"avg_conversation_time_seconds": {
"value": 123,
"previous": 123,
"change": 123
},
"total_conversation_time_seconds": {
"value": 123,
"previous": 123,
"change": 123
}
},
"last_updated": "2023-11-07T05:31:56Z",
"items": {
"data": [
{
"id": "cll-abc123",
"user": {
"id": "usr-abc123",
"name": "John",
"email": "[email protected]"
},
"allo_number": "+14155550100",
"allo_number_label": "Sales US",
"contact_number": "+14155551234",
"voicemail": true,
"duration": 123,
"date": "2023-11-07T05:31:56Z"
}
],
"pagination": {
"page": 123,
"size": 123,
"total_count": 123,
"total_pages": 123,
"has_more": true
}
}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}Outbound metrics
Returns outbound call metrics: dial funnel (dials → connected → conversations → conversions), time series, heatmap, leaderboard, and time spent metrics.
curl --request POST \
--url https://api.withallo.com/v2/api/analytics/outbound \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"date": {
"from": "2026-03-25",
"to": "2026-04-21"
},
"compare_date": {
"from": "2026-02-25",
"to": "2026-03-24"
},
"tags": [
"meeting_booked"
],
"granularity": "DAY"
}
'import requests
url = "https://api.withallo.com/v2/api/analytics/outbound"
payload = {
"date": {
"from": "2026-03-25",
"to": "2026-04-21"
},
"compare_date": {
"from": "2026-02-25",
"to": "2026-03-24"
},
"tags": ["meeting_booked"],
"granularity": "DAY"
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
date: {from: '2026-03-25', to: '2026-04-21'},
compare_date: {from: '2026-02-25', to: '2026-03-24'},
tags: ['meeting_booked'],
granularity: 'DAY'
})
};
fetch('https://api.withallo.com/v2/api/analytics/outbound', 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.withallo.com/v2/api/analytics/outbound",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'date' => [
'from' => '2026-03-25',
'to' => '2026-04-21'
],
'compare_date' => [
'from' => '2026-02-25',
'to' => '2026-03-24'
],
'tags' => [
'meeting_booked'
],
'granularity' => 'DAY'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.withallo.com/v2/api/analytics/outbound"
payload := strings.NewReader("{\n \"date\": {\n \"from\": \"2026-03-25\",\n \"to\": \"2026-04-21\"\n },\n \"compare_date\": {\n \"from\": \"2026-02-25\",\n \"to\": \"2026-03-24\"\n },\n \"tags\": [\n \"meeting_booked\"\n ],\n \"granularity\": \"DAY\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.withallo.com/v2/api/analytics/outbound")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"date\": {\n \"from\": \"2026-03-25\",\n \"to\": \"2026-04-21\"\n },\n \"compare_date\": {\n \"from\": \"2026-02-25\",\n \"to\": \"2026-03-24\"\n },\n \"tags\": [\n \"meeting_booked\"\n ],\n \"granularity\": \"DAY\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.withallo.com/v2/api/analytics/outbound")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"date\": {\n \"from\": \"2026-03-25\",\n \"to\": \"2026-04-21\"\n },\n \"compare_date\": {\n \"from\": \"2026-02-25\",\n \"to\": \"2026-03-24\"\n },\n \"tags\": [\n \"meeting_booked\"\n ],\n \"granularity\": \"DAY\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"date": {
"from": "2026-03-25",
"to": "2026-04-21"
},
"compare_date": {
"from": "2026-03-25",
"to": "2026-04-21"
},
"funnel": {
"dials": {
"count": {
"value": 123,
"previous": 123,
"change": 123
},
"rate": 123
},
"connected": {
"count": {
"value": 123,
"previous": 123,
"change": 123
},
"rate": 123
},
"conversations": {
"count": {
"value": 123,
"previous": 123,
"change": 123
},
"rate": 123
},
"conversions": {
"count": {
"value": 123,
"previous": 123,
"change": 123
},
"rate": 123
}
},
"time_series": {
"dials": [
{
"date": "2023-12-25",
"value": 123
}
],
"connected": [
{
"date": "2023-12-25",
"value": 123
}
],
"connection_rate": [
{
"date": "2023-12-25",
"value": 123
}
],
"conversions": [
{
"date": "2023-12-25",
"value": 123
}
]
},
"heatmap": {
"dials": [
{
"hour": 123,
"value": 123
}
],
"connected": [
{
"hour": 123,
"value": 123
}
],
"connection_rate": [
{
"hour": 123,
"value": 123
}
]
},
"leaderboard": [
{
"user": {
"id": "usr-abc123",
"name": "John",
"email": "[email protected]"
},
"connected": 123
}
],
"time_spent": {
"avg_ringing_time_seconds": {
"value": 123,
"previous": 123,
"change": 123
},
"avg_conversation_time_seconds": {
"value": 123,
"previous": 123,
"change": 123
},
"total_conversation_time_seconds": {
"value": 123,
"previous": 123,
"change": 123
}
},
"last_updated": "2023-11-07T05:31:56Z",
"items": {
"data": [
{
"id": "cll-abc123",
"user": {
"id": "usr-abc123",
"name": "John",
"email": "[email protected]"
},
"allo_number": "+14155550100",
"allo_number_label": "Sales US",
"contact_number": "+14155551234",
"voicemail": true,
"duration": 123,
"date": "2023-11-07T05:31:56Z"
}
],
"pagination": {
"page": 123,
"size": 123,
"total_count": 123,
"total_pages": 123,
"has_more": true
}
}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}CONVERSATIONS_READExtend parameter
Useextend=items with a stage to include the actual list of outbound calls behind the funnel numbers in the response.
| Value | Requires | Effect |
|---|---|---|
items | stage | Includes a paginated items field with the calls for the specified funnel stage |
Stages
| Stage | Calls included |
|---|---|
DIAL | All outbound dials |
CONNECTED | Calls where the recipient picked up |
CONVERSATION | Connected calls longer than 1 minute |
CONVERSION | Calls tagged with one of the specified tags |
Example with drilldown
{
"date": { "from": "2026-04-14", "to": "2026-04-21" },
"tags": ["meeting_booked"],
"granularity": "DAY",
"extend": "items",
"stage": "CONVERSION",
"page": 1,
"size": 20
}
items field with the paginated call list for the requested stage.
Passing extend=items without stage returns a 400 error with code MISSING_PARAMETER.Authorizations
Body
Show child attributes
Show child attributes
Comparison period. Metrics will include change vs this period.
Show child attributes
Show child attributes
Filter by user IDs. Cannot be combined with allo_numbers.
Filter by Allo numbers (E.164). Cannot be combined with user_ids.
Tag keys that define a conversion (e.g. ['meeting_booked', 'demo_scheduled'])
Time series granularity
DAY, WEEK, MONTH Include the list of outbound calls behind the funnel numbers. Requires stage.
items Filter drilldown items by funnel stage. Only used when extend=items.
DIAL, CONNECTED, CONVERSATION, CONVERSION Page number for drilldown items. Only used when extend=items.
Page size for drilldown items. Only used when extend=items.
x <= 100Response
Outbound analytics
Show child attributes
Show child attributes
Was this page helpful?