Skip to main content
GET
Get a campaign's statistics
The Dialer is a newly released product surface: depending on your account’s rollout stage, campaigns managed through this API may not yet be visible in your CloudTalk Dashboard.

Authorizations

Authorization
string
header
required

HTTP Basic Authentication. Use your API Access Key ID as the username and your API Access Key Secret as the password. Generate keys in the CloudTalk Dashboard under Account -> Settings -> API Keys (https://dashboard.cloudtalk.io/menu/account/settings/API-keys).

Path Parameters

campaignId
string
required

Dialer campaign ID.

Pattern: ^[1-9][0-9]*$

Query Parameters

dateFrom
string<date-time>

Inclusive lower bound of the statistics window (ISO 8601). Requires dateTo. Must not be older than the 13-month event retention horizon.

dateTo
string<date-time>

Exclusive upper bound of the statistics window (ISO 8601). Requires dateFrom. A date-only value is served inclusive of that day.

includeDurations
boolean
default:false

Set to true to include the call_durations block on an all-time read. Ignored on a ranged read, which always carries durations. Only the literal strings true and false are accepted — anything else is a 400.

Response

The campaign's statistics.

Aggregated campaign performance. range tells the basis apart: null means all-time (cumulative over the campaign's lifetime, updated_at set), non-null means the counters cover exactly that window (updated_at null). The membership-state blocks always describe the campaign's current state regardless of any window.

campaign_id
string

Campaign ID the statistics belong to.

Example:

"42"

contact_states
object

Contact counts per campaign-membership state.

contact_states_dialable
object

Per-state count of contacts that have at least one phone number — a breakout of contact_states, not a filter.

contact_states_repeated
object

Per-state count of contacts already attempted at least once — a breakout of contact_states, not a filter. Subtract it from contact_states for the never-attempted counts.

pending_by_category
object

Breakout of contact_states.pending by waterfall category — the four sum exactly to the pending total. Includes non-dialable pending contacts, so it is not an available-to-dial count.

total_contacts_at_range_end
integer

Contacts that were members of the campaign at the window's end (on an all-time read: the full current membership).

Example:

165

open_assignments
integer

Contacts currently held by agents. Always a current-state count, never narrowed by the window.

Example:

3

total_dialed
integer

Calls placed.

Example:

240

total_answered
integer

Calls answered.

Example:

150

answer_rate
number

total_answered / total_dialed, in the range 0–1.

Example:

0.625

num_rescheduled
integer

Calls dispositioned as rescheduled.

Example:

12

num_dropped
integer

Calls dropped before an agent could take them.

Example:

3

num_dispositioned
integer

Calls that received a disposition.

Example:

96

num_conversions
integer

Calls dispositioned with a positive outcome.

Example:

30

conversion_rate
number

num_conversions / num_dispositioned, in the range 0–1.

Example:

0.3125

num_reached_human
integer

Attempts that reached a human.

Example:

130

num_reached_voicemail
integer

Attempts that reached a voicemail.

Example:

15

num_reached_other_machine
integer

Attempts that reached another machine (IVR, queue, tone).

Example:

5

attempt_no_split
object

Attempts split by whether they were the contact's first attempt or a repeat.

distinct_called_contacts
integer | null

Distinct contacts dialed inside the window. Ranged-only — null on every all-time response.

Example:

null

distinct_answered_contacts
integer

Distinct contacts that answered. Never null; an all-time read counts contacts whose first answer is on record, a ranged read counts distinct answered contacts inside the window.

Example:

112

call_durations
object | null

Duration aggregate over the calls the basis covers; all values are whole seconds. Null means the block is not on the response — an all-time read without includeDurations=true, or a failed-open duration lookup. An all-zero block is a real answer: the window's calls simply carry no recorded duration yet (calls can trail the dialed count — duration records lag the dial). Zero and null must be treated as different states.

disposition_breakdown
object[]

Per-tag disposition counts.

updated_at
string<date-time> | null

Freshness of the all-time projection (ISO 8601, UTC). Null on every ranged response, and null on an all-time response whose projection has not materialized yet.

Example:

"2026-08-04T11:40:00.000Z"

range
object | null

The resolved statistics window — the field that tells you which basis the counters are on: null on an all-time response, set on a ranged one. to is exclusive; a date-only dateTo is echoed here already advanced to the following UTC midnight, so the echo may not equal the request literally.