Use this API to get statistics about the current queue, your account, your agents, or their activity.

The timeframe of the data returned by all endpoints is the current day, from midnight in your account's timezone to the moment you make the request.

For example, if your account is set to Pacific Time (GMT-7) and you make a request at 07:02 a.m. in that timezone, then the timeframe of the data is as follows:

from: Mon, 11 Jun 2018 00:00:00 PDT -07:00to:   Mon, 11 Jun 2018 07:02:43 PDT -07:00

Show Account Overview

  • GET /api/v2/channels/voice/stats/account_overview

Optionally, you can filter the results by phone numbers.

Allowed For

  • Agents

JSON Format

Account overview statistics are represented by a JSON object with the following properties:

NameTypeDescription
average_call_durationintegerAverage time of call across all calls
average_queue_wait_timeintegerAverage time caller spent in queue waiting to be routed to an agent
average_wrap_up_timeintegerAverage wrap-up time across all calls
max_calls_waitingintegerMaximum number of calls waiting for an agent in the queue, including caller on the line and callback requests
max_queue_wait_timeintegerMaximum time caller spent in queue waiting to be routed to an agent
total_call_durationintegerTotal duration of all calls
total_callsintegerTotal number of inbound and outbound calls
total_voicemailsintegerTotal number of calls that went to voicemail for any reason
total_wrap_up_timeintegerTotal wrap-up time across all calls

Example

{  "average_call_duration":   33,  "average_queue_wait_time": 1,  "average_wrap_up_time":    1,  "max_calls_waiting":       1,  "max_queue_wait_time":     10,  "total_call_duration":     41,  "total_calls":             39,  "total_voicemails":        12,  "total_wrap_up_time":      11}

JSON Format (Professional plan and above)

On the Professional plan and above, the JSON object has the following additional properties:

NameTypeDescription
average_callback_wait_timeintegerAverage callback time a customer has been waiting for an agent in the queue. Excludes Available agents greeting
average_hold_timeintegerAverage time caller spent on hold per call
average_time_to_answerintegerAverage time between system answering a call and customer being connected with an agent. Includes greetings and other recordings played
total_callback_callsintegerTotal number of callback requests (successful or not)
total_calls_abandoned_in_queueintegerTotal number of calls where customer hung up while waiting in the queue
total_calls_outside_business_hoursintegerTotal number of calls received outside business hours
total_calls_with_exceeded_queue_wait_timeintegerTotal number of calls sent to voicemail after exceeding the max wait time in the queue
total_calls_with_requested_voicemailintegerTotal number of calls where customer requested to be put through to voicemail by dialing 1
total_hold_timeintegerTotal hold time across all calls
total_inbound_callsintegerTotal number of inbound calls
total_outbound_callsintegerTotal number of outbound calls
total_textback_requestsintegerTotal number of textback messages sent from IVR
total_embeddable_callback_callsintegerTotal number of callback calls requested via Web Widget (successful or not)

Example

{  "average_call_duration":                     33,  "average_queue_wait_time":                   1,  "average_wrap_up_time":                      1,  "max_calls_waiting":                         1,  "max_queue_wait_time":                       10,  "total_call_duration":                       41,  "total_calls":                               39,  "total_voicemails":                          12,  "total_wrap_up_time":                        11,  "average_callback_wait_time":                0,  "average_hold_time":                         0,  "average_time_to_answer":                    2,  "total_callback_calls":                      0,  "total_calls_abandoned_in_queue":            2,  "total_calls_outside_business_hours":        0,  "total_calls_with_exceeded_queue_wait_time": 0,  "total_calls_with_requested_voicemail":      0,  "total_hold_time":                           0,  "total_inbound_calls":                       34,  "total_outbound_calls":                      5,  "total_textback_requests":                   0,  "total_embeddable_callback_calls":           1,}

Parameters

NameTypeInRequiredDescription
phone_number_idsarrayQueryfalseIds of phone numbers to filter results with. Accepts a comma-separated list of up to 100 phone number ids.

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/channels/voice/stats/account_overview.json \  -v -u {email_address}:{password}
curl
curl https://{subdomain}.zendesk.com/api/v2/channels/voice/stats/current_queue_activity.json?phone_number_ids=1,2,3 \  -v -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/channels/voice/stats/account_overview?phone_number_ids="	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Content-Type", "application/json")	req.Header.Add("Authorization", "Basic <auth-value>") // Base64 encoded "username:password"
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://support.zendesk.com/api/v2/channels/voice/stats/account_overview")		.newBuilder()		.addQueryParameter("phone_number_ids", "");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://support.zendesk.com/api/v2/channels/voice/stats/account_overview',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },  params: {    'phone_number_ids': '',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/channels/voice/stats/account_overview?phone_number_ids="headers = {	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/channels/voice/stats/account_overview")uri.query = URI.encode_www_form("phone_number_ids": "")request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "account_overview": {    "average_call_duration": 33,    "average_callback_wait_time": 0,    "average_hold_time": 0,    "average_queue_wait_time": 1,    "average_time_to_answer": 2,    "average_wrap_up_time": 1,    "max_calls_waiting": 1,    "max_queue_wait_time": 10,    "total_call_duration": 41,    "total_callback_calls": 0,    "total_calls": 39,    "total_calls_abandoned_in_queue": 2,    "total_calls_outside_business_hours": 0,    "total_calls_with_exceeded_queue_wait_time": 0,    "total_calls_with_requested_voicemail": 0,    "total_embeddable_callback_calls": 0,    "total_hold_time": 0,    "total_inbound_calls": 34,    "total_outbound_calls": 5,    "total_textback_requests": 0,    "total_voicemails": 12,    "total_wrap_up_time": 11  }}

List Agents Activity

  • GET /api/v2/channels/voice/stats/agents_activity

Allowed For

  • Agents

Agents activity is represented by a JSON object with the following properties:

NameTypeDescription
agent_idstringThe agent's id
agent_statestringThe agent's state. Allowed values are "online", "offline", "away", or "transfers_only"
available_timeintegerTotal time agent was available to answer calls and set to "online". Does not include time on calls or in wrap-up mode
avatar_urlstringThe URL to agent's avatar
away_timeintegerTotal time agent's status was set to "away"
call_statusstringThe agent's call status. Allowed values are "on_call", "wrap_up", or "null"
calls_acceptedintegerThe total number of phone calls the agent has accepted
calls_deniedintegerThe total number of times the agent has declined an incoming call
calls_missedintegerThe total number of times an agent has not answered their phone and the call was routed to the next available agent
forwarding_numberstringThe forwarding number set up by the agent, or null if the agent has no forwarding number
namestringThe agent's name
online_timeintegerTotal time agent's status was set to "online", "away", or "transfers_only"
transfers_only_timeintegerTotal time agent's status was set to "transfers_only"
total_call_durationintegerTotal time the agent was on call across all calls
total_talk_timeintegerTotal talk time (excludes hold time and consultation)
total_wrap_up_timeintegerTotal time spent in wrap-up across all calls
viastringThe channel (client/phone) the agent is registered on

Example

{  "agent_id":             1,  "agent_state":          "online",  "available_time":       3600,  "avatar_url":           "https://path_to_avatar.png",  "away_time":            250,  "call_status":          null,  "calls_accepted":       5,  "calls_denied":         1,  "calls_missed":         1,  "forwarding_number":    "+1234567890",  "name":                 "Johnny Agent",  "online_time":          5600,  "transfers_only_time":  123,  "total_call_duration":  121,  "total_talk_time":      87,  "total_wrap_up_time":   68,  "via":                  "phone"}

On the Professional plan and above, the JSON object has the following additional properties:

NameTypeDescription
accepted_third_party_conferencesintegerThe average number of conference calls accepted, the number accepted by the selected agent, and the percentage difference between the two
accepted_transfersintegerTotal numbers of transfers the agent accepted
average_hold_timeintegerAverage time the agent spent on hold per call
average_talk_timeintegerAverage talk time across all calls (excludes hold time and consultation)
average_wrap_up_timeintegerAverage wrap-up time across all calls
calls_put_on_holdintegerTotal number of calls the agent placed on hold
started_third_party_conferencesintegerThe average number of conference calls initiated, the number initiated by the selected agent, and the percentage difference between the two
started_transfersintegerTotal numbers of transfers the agent started
total_hold_timeintegerTotal time the agent was on hold across all calls

Example

{  "accepted_third_party_conferences":  0,  "accepted_transfers":                5,  "agent_id":                          1,  "available_time":                    3600,  "avatar_url":                        "https://path_to_avatar.png",  "average_hold_time":                 10,  "average_talk_time":                 25,  "average_wrap_up_time":              39,  "calls_accepted":                    5,  "calls_denied":                      1,  "calls_missed":                      1,  "calls_put_on_hold":                 8,  "forwarding_number":                 "+1234567890",  "name":                              "Johnny Agent",  "online_time":                       5600,  "transfers_only_time":               123,  "started_third_party_conferences":   0,  "started_transfers":                 2,  "total_call_duration":               121,  "total_hold_time":                   27,  "total_talk_time":                   87,  "total_wrap_up_time":                68,  "via":                              "phone"}

Parameters

NameTypeInRequiredDescription
group_idsarrayQueryfalseThe ids of groups to filter results with. Accepts a comma-separated list of up to 100 group ids.

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/channels/voice/stats/agents_activity.json \  -v -u {email_address}:{password}
curl
curl https://{subdomain}.zendesk.com/api/v2/channels/voice/stats/agents_activity.json?group_ids=1,2,3 \  -v -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/channels/voice/stats/agents_activity?group_ids=%5B1%2C2%5D"	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Content-Type", "application/json")	req.Header.Add("Authorization", "Basic <auth-value>") // Base64 encoded "username:password"
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://support.zendesk.com/api/v2/channels/voice/stats/agents_activity")		.newBuilder()		.addQueryParameter("group_ids", "[1,2]");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://support.zendesk.com/api/v2/channels/voice/stats/agents_activity',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },  params: {    'group_ids': '%5B1%2C2%5D',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/channels/voice/stats/agents_activity?group_ids=%5B1%2C2%5D"headers = {	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/channels/voice/stats/agents_activity")uri.query = URI.encode_www_form("group_ids": "[1,2]")request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "agents_activity": [    {      "agent_id": 1,      "available_time": 3600,      "avatar_url": "https://path_to_avatar.png",      "calls_accepted": 5,      "calls_denied": 1,      "calls_missed": 1,      "forwarding_number": "+1234567890",      "name": "Johnny Agent",      "online_time": 5600,      "total_call_duration": 121,      "total_talk_time": 87,      "total_wrap_up_time": 68,      "transfers_only_time": 123,      "via": "phone"    }  ],  "count": 1,  "next_page": null,  "previous_page": null}

Show Agents Overview

  • GET /api/v2/channels/voice/stats/agents_overview

Allowed For

  • Agents

Agents overview statistics are represented by a JSON object with the following properties:

NameTypeDescription
average_wrap_up_timeintegerAverage wrap-up time across all calls
total_calls_acceptedintegerTotal number of calls agents answered
total_calls_deniedintegerTotal number of calls agents denied
total_calls_missedintegerTotal number of calls agents missed
total_talk_timeintegerTotal talk time across all calls (excludes hold time and consultation)
total_wrap_up_timeintegerTotal wrap-up time across all calls

Note: Metrics like total_calls_accepted, total_calls_denied, total_calls_missed, and total_calls_put_on_hold can be greater than total_inbound_calls. Example: One inbound call is missed by two agents or denied by two agents.

Example

{  "average_wrap_up_time":  120,  "total_calls_accepted":  41,  "total_calls_denied":    39,  "total_calls_missed":    12,  "total_talk_time":       31,  "total_wrap_up_time":    13}

On the Professional plan and above, the JSON object has the following additional properties:

NameTypeDescription
average_accepted_transfersintegerAverage number of transfers agents accepted
average_available_timeintegerAverage time an agent was available to answer calls and set to "online". Does not include time on calls or in wrap-up mode
average_away_timeintegerAverage time agent's status was set to "away"
average_calls_acceptedintegerAverage number of calls agents answered
average_calls_deniedintegerAverage number of calls agents denied
average_calls_missedintegerAverage number of calls agents missed
average_calls_put_on_holdintegerAverage number of calls an agent placed on hold
average_hold_timeintegerAverage time caller spent on hold per call
average_online_timeintegerAverage time agent's status was set to "online", "away", or "transfers_only"
average_transfers_only_timeintegerAverage time agent's status was set to "transfers only"
average_started_transfersintegerAverage number of transfers agents started
average_talk_timeintegerAverage agent talk time across all calls (excludes hold time and consultation)
total_accepted_transfersintegerTotal number of transfers agents started
total_calls_put_on_holdintegerTotal number of calls agents placed on hold
total_hold_timeintegerTotal hold time across all calls
total_started_transfersintegerTotal number of transfers agents started

Example

{  "average_accepted_transfers": 8,  "average_available_time":     2100,  "average_away_time":          4438,  "average_calls_accepted":     14,  "average_calls_denied":       4,  "average_calls_missed":       3,  "average_calls_put_on_hold":  14,  "average_hold_time":          35,  "average_online_time":        3600,  "average_transfers_only_time":123,  "average_started_transfers":  12,  "average_talk_time":          67,  "average_wrap_up_time":       120,  "total_accepted_transfers":   12,  "total_calls_accepted":       41,  "total_calls_denied":         39,  "total_calls_missed":         12,  "total_calls_put_on_hold":    5,  "total_hold_time":            120,  "total_started_transfers":    17,  "total_talk_time":            31,  "total_wrap_up_time":         13}

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/channels/voice/stats/agents_overview.json \  -v -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/channels/voice/stats/agents_overview"	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Content-Type", "application/json")	req.Header.Add("Authorization", "Basic <auth-value>") // Base64 encoded "username:password"
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://support.zendesk.com/api/v2/channels/voice/stats/agents_overview")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://support.zendesk.com/api/v2/channels/voice/stats/agents_overview',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/channels/voice/stats/agents_overview"headers = {	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/channels/voice/stats/agents_overview")request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "agents_overview": {    "average_accepted_transfers": 8,    "average_available_time": 2100,    "average_away_time": 210,    "average_calls_accepted": 14,    "average_calls_denied": 4,    "average_calls_missed": 3,    "average_calls_put_on_hold": 14,    "average_hold_time": 35,    "average_online_time": 3600,    "average_started_transfers": 12,    "average_talk_time": 67,    "average_transfers_only_time": 123,    "average_wrap_up_time": 120,    "total_accepted_transfers": 12,    "total_calls_accepted": 41,    "total_calls_denied": 39,    "total_calls_missed": 12,    "total_calls_put_on_hold": 5,    "total_hold_time": 120,    "total_started_transfers": 17,    "total_talk_time": 31,    "total_wrap_up_time": 13  }}

Show Current Queue Activity

  • GET /api/v2/channels/voice/stats/current_queue_activity

Optionally or if you notice inconsistencies with the returned values, you can filter the results by phone numbers.

Allowed For

  • Agents

Rate Limit

You can make up to 2,500 requests every 5 minutes to this endpoint.

NameTypeDescription
agents_onlineintegerThe current number of agents online or away, including those on call and on wrap up
average_wait_timeintegerThe average wait time for all callers who are waiting for an available agent (in seconds)
callbacks_waitingintegerThe current number of callers in the callback queue waiting for the next available support agent
calls_waitingintegerThe current number of callers in the queue waiting for the next available support agent
embeddable_callbacks_waitingintegerThe current number of callback requests from Web Widget in the queue waiting for the next available support agent
longest_wait_timeintegerThe longest wait time for any caller in the queue (in seconds)

Example

{  "agents_online":     1,  "average_wait_time": 5,  "calls_waiting":     1,  "callbacks_waiting": 3,  "embeddable_callbacks_waiting": 1,  "longest_wait_time": 10,}

Parameters

NameTypeInRequiredDescription
phone_number_idsarrayQueryfalseIds of phone numbers to filter results with. Accepts a comma-separated list of up to 100 phone number ids.

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/channels/voice/stats/current_queue_activity.json \  -v -u {email_address}:{password}
curl
curl https://{subdomain}.zendesk.com/api/v2/channels/voice/stats/current_queue_activity.json?phone_number_ids=1,2,3 \  -v -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/channels/voice/stats/current_queue_activity?phone_number_ids="	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Content-Type", "application/json")	req.Header.Add("Authorization", "Basic <auth-value>") // Base64 encoded "username:password"
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://support.zendesk.com/api/v2/channels/voice/stats/current_queue_activity")		.newBuilder()		.addQueryParameter("phone_number_ids", "");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://support.zendesk.com/api/v2/channels/voice/stats/current_queue_activity',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },  params: {    'phone_number_ids': '',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/channels/voice/stats/current_queue_activity?phone_number_ids="headers = {	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/channels/voice/stats/current_queue_activity")uri.query = URI.encode_www_form("phone_number_ids": "")request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "current_queue_activity": {    "agents_online": 2,    "average_wait_time": 5,    "callbacks_waiting": 1,    "calls_waiting": 1,    "embeddable_callbacks_waiting": 1,    "longest_wait_time": 10  }}