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
}
}Metriques sortantes
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_READParametre extend
Utilisezextend=items avec un stage pour inclure la liste reelle des appels sortants derriere les chiffres de l’entonnoir dans la reponse.
| Valeur | Requis | Effet |
|---|---|---|
items | stage | Inclut un champ pagine items avec les appels pour l’etape d’entonnoir specifiee |
Etapes
| Etape | Appels inclus |
|---|---|
DIAL | Tous les appels sortants |
CONNECTED | Appels ou le destinataire a decroche |
CONVERSATION | Appels connectes de plus d’une minute |
CONVERSION | Appels tagges avec l’un des tags specifies |
Exemple avec detail
{
"date": { "from": "2026-04-14", "to": "2026-04-21" },
"tags": ["meeting_booked"],
"granularity": "DAY",
"extend": "items",
"stage": "CONVERSION",
"page": 1,
"size": 20
}
items avec la liste paginee des appels pour l’etape demandee.
Passer extend=items sans stage retourne une erreur 400 avec le code MISSING_PARAMETER.Autorisations
Corps
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 <= 100Réponse
Outbound analytics
Show child attributes
Show child attributes
Cette page vous a-t-elle été utile ?