HCC Docs

Reports

How reps, queues, outbound dialing and campaigns performed, computed from your calls when you ask (no rollups to wait for), in your workspace's time zone. The API key picks the environment: a test key reports test calls only.

const range = { from: '2026-10-01T00:00:00-04:00', to: '2026-11-01T00:00:00-04:00' };

const { data: queues, totals } = await hcc.reports.queues(range);
// [{ queue: 'sales', offered: 412, answered: 380, abandoned: 25, overflowed: 7,
//    serviceLevel: 0.81, serviceLevelSeconds: 20, asaSeconds: 14.2, longestWaitSeconds: 190, ... }]

const reps = await hcc.reports.reps({ ...range, repId: ['rep_…', 'rep_…'] });
// handled, talkSeconds, ahtSeconds, avgWrapUpSeconds, missedOffers, occupancy, states

const outbound = await hcc.reports.outbound(range); // dials, connects, connectRate, blockedDnc
const dispositions = await hcc.reports.dispositions({ ...range, queue: 'sales' });

const { data: campaigns } = await hcc.reports.campaigns({ ...range, campaign: 'renewals' });
// [{ campaign: 'renewals', dials: 900, connects: 210, connectRate: 0.23, rightPartyConversations: 180,
//    machine: 300, voicemailsLeft: 250, noAnswer: 320, avgTalkSeconds: 94, dispositions: { meeting_booked: 40, ... },
//    leadsLeft: 400, conversions: 40, goalRate: 0.1,
//    exitReasons: { goal: 40, exit: 140, finished: 200, removed: 15, do_not_call: 5 } }]

const daily = await hcc.reports.timeseries({ ...range, metric: 'service_level', interval: 'day' });
const { data } = await hcc.reports.summary(range); // data.current vs data.previous (same length)

const csv = await hcc.reports.exportCsv('reps', range); // RFC 4180, header row first
  • Filters: from and to (default: the last 7 days; at most 92 days, hourly buckets at most 31), repId and queue (one or a list), direction (inbound or outbound). The queues report ignores repId; outbound ignores queue and direction. The campaigns report takes campaign (one or a list, by name) and ignores the other three.
  • metric for timeseries: calls, service_level (with the queues' lowest target), wait_time, handled, dials or states. Every bucket of the range is present, empty ones included.
  • Without the SDK, send Accept: text/csv or ?format=csv to any of /v1/reports/{reps,queues,outbound,campaigns,dispositions}.
  • Talk includes hold. Rep states (occupancy, time per state) are workspace-wide: a rep is one person in live and test.
  • In the campaigns report, dials, talk and dispositions go by when the dial was placed, and leads by when they left, so a conversion can land in a later range than its calls. A late goal counts when it was reached.
  • rightPartyConversations are answered calls the carrier didn't call a machine, leaving out a lead who found no rep, so a flow with no onVoicemail counts a machine too.
  • voicemailsLeft is the part of machine that onVoicemail left a message on.
  • The campaigns report has no breakdown by sequence step: dials don't record their step.