curl --request GET \
--url https://api.migration.powerdialer.ai/api/public/v1/analytics/summary \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.migration.powerdialer.ai/api/public/v1/analytics/summary"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.migration.powerdialer.ai/api/public/v1/analytics/summary', 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.migration.powerdialer.ai/api/public/v1/analytics/summary",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.migration.powerdialer.ai/api/public/v1/analytics/summary"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.migration.powerdialer.ai/api/public/v1/analytics/summary")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.migration.powerdialer.ai/api/public/v1/analytics/summary")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"userId": "user_2abc...",
"range": {
"startDate": "2026-10-01",
"endDate": "2026-10-07",
"timezone": "America/New_York",
"from": "2026-10-01T04:00:00.000Z",
"to": "2026-10-08T04:00:00.000Z"
},
"conversationThresholdSeconds": 120,
"calls": {
"total": 184,
"outbound": 181,
"inbound": 3,
"connected": 41,
"conversations": 12,
"voicemails": 57,
"noAnswer": 72,
"busy": 4,
"failed": 2,
"canceled": 1
},
"rates": {
"connectRate": 0.2228,
"conversationRate": 0.0652
},
"talkTimeSeconds": 5310,
"byStatus": {
"Accepted": 41,
"Voicemail": 57,
"No answer": 72,
"Busy": 4,
"Failed": 2,
"Canceled": 1,
"Completed": 7
},
"dispositions": {
"Positive": 9,
"Negative": 14,
"Callback": 6,
"NotDisposed": 155
}
}{
"error": "Invalid request",
"details": [
{
"path": "contacts.0.phoneNumber",
"message": "phoneNumber is required"
}
]
}{
"error": "Invalid API key"
}{
"error": "User not found"
}{
"error": "Rate limit exceeded"
}Analytics summary
Returns the acting user’s call counts for a range of calendar days. “Connected” and “conversation” use the same definitions as the PowerDialer dashboard. The range may cover at most 366 days; impossible dates answer 400.
curl --request GET \
--url https://api.migration.powerdialer.ai/api/public/v1/analytics/summary \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.migration.powerdialer.ai/api/public/v1/analytics/summary"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.migration.powerdialer.ai/api/public/v1/analytics/summary', 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.migration.powerdialer.ai/api/public/v1/analytics/summary",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.migration.powerdialer.ai/api/public/v1/analytics/summary"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.migration.powerdialer.ai/api/public/v1/analytics/summary")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.migration.powerdialer.ai/api/public/v1/analytics/summary")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"userId": "user_2abc...",
"range": {
"startDate": "2026-10-01",
"endDate": "2026-10-07",
"timezone": "America/New_York",
"from": "2026-10-01T04:00:00.000Z",
"to": "2026-10-08T04:00:00.000Z"
},
"conversationThresholdSeconds": 120,
"calls": {
"total": 184,
"outbound": 181,
"inbound": 3,
"connected": 41,
"conversations": 12,
"voicemails": 57,
"noAnswer": 72,
"busy": 4,
"failed": 2,
"canceled": 1
},
"rates": {
"connectRate": 0.2228,
"conversationRate": 0.0652
},
"talkTimeSeconds": 5310,
"byStatus": {
"Accepted": 41,
"Voicemail": 57,
"No answer": 72,
"Busy": 4,
"Failed": 2,
"Canceled": 1,
"Completed": 7
},
"dispositions": {
"Positive": 9,
"Negative": 14,
"Callback": 6,
"NotDisposed": 155
}
}{
"error": "Invalid request",
"details": [
{
"path": "contacts.0.phoneNumber",
"message": "phoneNumber is required"
}
]
}{
"error": "Invalid API key"
}{
"error": "User not found"
}{
"error": "Rate limit exceeded"
}Authorizations
Authorization: Bearer <api key>. The key is issued by PowerDialer and must stay on your server.
Headers
Login email of the PowerDialer user the request acts for. Send this or x-user-id; if both are sent, x-user-id wins.
Clerk user id of the PowerDialer user the request acts for. Send this or x-user-email.
"user_2abc..."
Query Parameters
Inclusive calendar day in timezone, YYYY-MM-DD. Default: 6 days before endDate.
"2026-10-01"
Inclusive calendar day in timezone, YYYY-MM-DD. Default: today in timezone. Must not be before startDate.
"2026-10-07"
IANA time zone used to count days. Default UTC.
"America/New_York"
Minimum talk time for a call to count as a conversation. Default: the user's saved setting (120 if none).
1 <= x <= 3600120
Response
Summary
"user_2abc..."
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Sum of talk time across all calls.
Raw count per provider status.
Show child attributes
Show child attributes
Count per disposition; NotDisposed for calls without one.
Show child attributes
Show child attributes