curl "https://api.telzino.com/v1/metrics?startDate=2025-01-01T00:00:00.000Z&endDate=2025-12-31T23:59:59.000Z" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
# Filter by organization
curl "https://api.telzino.com/v1/metrics?startDate=2025-01-01T00:00:00.000Z&endDate=2025-12-31T23:59:59.000Z&organizationId=123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
# Filter by reseller
curl "https://api.telzino.com/v1/metrics?startDate=2025-01-01T00:00:00.000Z&endDate=2025-12-31T23:59:59.000Z&resellerId=123e4567-e89b-12d3-a456-426614174999" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
const params = new URLSearchParams({
startDate: '2025-01-01T00:00:00.000Z',
endDate: '2025-12-31T23:59:59.000Z',
resellerId: '123e4567-e89b-12d3-a456-426614174999'
});
const response = await fetch(`https://api.telzino.com/v1/metrics?${params}`, {
headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN' }
});
const { data } = await response.json();
console.log(data.metrics.totalCalls);
import requests
response = requests.get(
'https://api.telzino.com/v1/metrics',
params={
'startDate': '2025-01-01T00:00:00.000Z',
'endDate': '2025-12-31T23:59:59.000Z',
'resellerId': '123e4567-e89b-12d3-a456-426614174999'
},
headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'}
)
metrics = response.json()['data']
{
"data": {
"metrics": {
"totalCalls": 1250,
"totalMinutes": 3420.5,
"resolutionRate": 78,
"avgDuration": 164,
"activeAgents": 12,
"responseTime": 842,
"sentimentPercent": 71,
"escalationRate": 12
},
"dailyVolume": [
{ "date": "2024-01-01", "totalCalls": 45, "resolvedCalls": 35 }
],
"resolutionBreakdown": {
"resolved": 975,
"transferred": 150,
"abandoned": 75,
"other": 50
},
"hourlyDistribution": [
{ "hour": "09:00", "calls": 120, "minutes": 320 }
],
"agentPerformance": [
{
"agentId": "123e4567-e89b-12d3-a456-426614174000",
"agentName": "Customer Support Agent",
"totalCalls": 450,
"resolved": 360,
"transferred": 50,
"abandoned": 25,
"other": 15,
"resolvedPercent": 80,
"transferredPercent": 11,
"abandonedPercent": 6,
"otherPercent": 3,
"avgDuration": 158,
"sentimentPercent": 74,
"status": "active"
}
],
"aiInsights": {
"intentAccuracy": 87,
"contextRetention": 62,
"speechRecognition": 94,
"entityExtraction": 91,
"responseLatency": 842,
"trainingSessions": 1250
},
"turnLatency": {
"overall": { "p50Ms": 2100, "p95Ms": 5200, "maxMs": 14270, "turns": 431 },
"daily": [
{ "date": "2026-09-16", "p50Ms": 2000, "p95Ms": 5100, "maxMs": 8000, "turns": 57 }
],
"byAgent": [
{ "agentId": "123e4567-e89b-12d3-a456-426614174000", "agentName": "Front Desk", "p50Ms": 3900, "p95Ms": 9100, "maxMs": 14270, "turns": 55 }
]
},
"escalationReasons": [
{
"reason": "billing dispute",
"count": 45,
"percentOfTotal": 30,
"avgTimeBeforeEscalation": 124
},
{
"reason": "technical issue requiring specialist",
"count": 38,
"percentOfTotal": 25,
"avgTimeBeforeEscalation": 98
}
]
}
}
{
"error": "invalid_token",
"error_description": "Missing or invalid authorization token"
}
Metrics
Get Metrics
Returns usage metrics including call volume, resolution rates, hourly distribution, and per-agent performance
GET
/
v1
/
metrics
curl "https://api.telzino.com/v1/metrics?startDate=2025-01-01T00:00:00.000Z&endDate=2025-12-31T23:59:59.000Z" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
# Filter by organization
curl "https://api.telzino.com/v1/metrics?startDate=2025-01-01T00:00:00.000Z&endDate=2025-12-31T23:59:59.000Z&organizationId=123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
# Filter by reseller
curl "https://api.telzino.com/v1/metrics?startDate=2025-01-01T00:00:00.000Z&endDate=2025-12-31T23:59:59.000Z&resellerId=123e4567-e89b-12d3-a456-426614174999" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
const params = new URLSearchParams({
startDate: '2025-01-01T00:00:00.000Z',
endDate: '2025-12-31T23:59:59.000Z',
resellerId: '123e4567-e89b-12d3-a456-426614174999'
});
const response = await fetch(`https://api.telzino.com/v1/metrics?${params}`, {
headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN' }
});
const { data } = await response.json();
console.log(data.metrics.totalCalls);
import requests
response = requests.get(
'https://api.telzino.com/v1/metrics',
params={
'startDate': '2025-01-01T00:00:00.000Z',
'endDate': '2025-12-31T23:59:59.000Z',
'resellerId': '123e4567-e89b-12d3-a456-426614174999'
},
headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'}
)
metrics = response.json()['data']
{
"data": {
"metrics": {
"totalCalls": 1250,
"totalMinutes": 3420.5,
"resolutionRate": 78,
"avgDuration": 164,
"activeAgents": 12,
"responseTime": 842,
"sentimentPercent": 71,
"escalationRate": 12
},
"dailyVolume": [
{ "date": "2024-01-01", "totalCalls": 45, "resolvedCalls": 35 }
],
"resolutionBreakdown": {
"resolved": 975,
"transferred": 150,
"abandoned": 75,
"other": 50
},
"hourlyDistribution": [
{ "hour": "09:00", "calls": 120, "minutes": 320 }
],
"agentPerformance": [
{
"agentId": "123e4567-e89b-12d3-a456-426614174000",
"agentName": "Customer Support Agent",
"totalCalls": 450,
"resolved": 360,
"transferred": 50,
"abandoned": 25,
"other": 15,
"resolvedPercent": 80,
"transferredPercent": 11,
"abandonedPercent": 6,
"otherPercent": 3,
"avgDuration": 158,
"sentimentPercent": 74,
"status": "active"
}
],
"aiInsights": {
"intentAccuracy": 87,
"contextRetention": 62,
"speechRecognition": 94,
"entityExtraction": 91,
"responseLatency": 842,
"trainingSessions": 1250
},
"turnLatency": {
"overall": { "p50Ms": 2100, "p95Ms": 5200, "maxMs": 14270, "turns": 431 },
"daily": [
{ "date": "2026-09-16", "p50Ms": 2000, "p95Ms": 5100, "maxMs": 8000, "turns": 57 }
],
"byAgent": [
{ "agentId": "123e4567-e89b-12d3-a456-426614174000", "agentName": "Front Desk", "p50Ms": 3900, "p95Ms": 9100, "maxMs": 14270, "turns": 55 }
]
},
"escalationReasons": [
{
"reason": "billing dispute",
"count": 45,
"percentOfTotal": 30,
"avgTimeBeforeEscalation": 124
},
{
"reason": "technical issue requiring specialist",
"count": 38,
"percentOfTotal": 25,
"avgTimeBeforeEscalation": 98
}
]
}
}
{
"error": "invalid_token",
"error_description": "Missing or invalid authorization token"
}
Query Parameters
string
required
Start of the date range in ISO 8601 format (e.g.,
2025-01-01T00:00:00.000Z)string
required
End of the date range in ISO 8601 format (e.g.,
2025-12-31T23:59:59.000Z)string
Filter metrics by organization ID (UUID format). If omitted, returns metrics across all accessible organizations.
string
Filter metrics by reseller ID (UUID format). Returns the same metrics fields, structure, and data types as the organization response, aggregated across all organizations under that reseller.
curl "https://api.telzino.com/v1/metrics?startDate=2025-01-01T00:00:00.000Z&endDate=2025-12-31T23:59:59.000Z" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
# Filter by organization
curl "https://api.telzino.com/v1/metrics?startDate=2025-01-01T00:00:00.000Z&endDate=2025-12-31T23:59:59.000Z&organizationId=123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
# Filter by reseller
curl "https://api.telzino.com/v1/metrics?startDate=2025-01-01T00:00:00.000Z&endDate=2025-12-31T23:59:59.000Z&resellerId=123e4567-e89b-12d3-a456-426614174999" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
const params = new URLSearchParams({
startDate: '2025-01-01T00:00:00.000Z',
endDate: '2025-12-31T23:59:59.000Z',
resellerId: '123e4567-e89b-12d3-a456-426614174999'
});
const response = await fetch(`https://api.telzino.com/v1/metrics?${params}`, {
headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN' }
});
const { data } = await response.json();
console.log(data.metrics.totalCalls);
import requests
response = requests.get(
'https://api.telzino.com/v1/metrics',
params={
'startDate': '2025-01-01T00:00:00.000Z',
'endDate': '2025-12-31T23:59:59.000Z',
'resellerId': '123e4567-e89b-12d3-a456-426614174999'
},
headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'}
)
metrics = response.json()['data']
{
"data": {
"metrics": {
"totalCalls": 1250,
"totalMinutes": 3420.5,
"resolutionRate": 78,
"avgDuration": 164,
"activeAgents": 12,
"responseTime": 842,
"sentimentPercent": 71,
"escalationRate": 12
},
"dailyVolume": [
{ "date": "2024-01-01", "totalCalls": 45, "resolvedCalls": 35 }
],
"resolutionBreakdown": {
"resolved": 975,
"transferred": 150,
"abandoned": 75,
"other": 50
},
"hourlyDistribution": [
{ "hour": "09:00", "calls": 120, "minutes": 320 }
],
"agentPerformance": [
{
"agentId": "123e4567-e89b-12d3-a456-426614174000",
"agentName": "Customer Support Agent",
"totalCalls": 450,
"resolved": 360,
"transferred": 50,
"abandoned": 25,
"other": 15,
"resolvedPercent": 80,
"transferredPercent": 11,
"abandonedPercent": 6,
"otherPercent": 3,
"avgDuration": 158,
"sentimentPercent": 74,
"status": "active"
}
],
"aiInsights": {
"intentAccuracy": 87,
"contextRetention": 62,
"speechRecognition": 94,
"entityExtraction": 91,
"responseLatency": 842,
"trainingSessions": 1250
},
"turnLatency": {
"overall": { "p50Ms": 2100, "p95Ms": 5200, "maxMs": 14270, "turns": 431 },
"daily": [
{ "date": "2026-09-16", "p50Ms": 2000, "p95Ms": 5100, "maxMs": 8000, "turns": 57 }
],
"byAgent": [
{ "agentId": "123e4567-e89b-12d3-a456-426614174000", "agentName": "Front Desk", "p50Ms": 3900, "p95Ms": 9100, "maxMs": 14270, "turns": 55 }
]
},
"escalationReasons": [
{
"reason": "billing dispute",
"count": 45,
"percentOfTotal": 30,
"avgTimeBeforeEscalation": 124
},
{
"reason": "technical issue requiring specialist",
"count": 38,
"percentOfTotal": 25,
"avgTimeBeforeEscalation": 98
}
]
}
}
{
"error": "invalid_token",
"error_description": "Missing or invalid authorization token"
}
Response Fields
metrics
| Field | Type | Description |
|---|---|---|
totalCalls | number | Total number of calls in the date range |
totalMinutes | number | Total call minutes |
resolutionRate | number | Percentage of calls resolved (0–100) |
avgDuration | number | Average call duration in seconds |
activeAgents | number | Number of agents that handled calls |
responseTime | number | null | Average time until the AI model’s first token, in milliseconds. Not how long callers wait — use turnLatency for that. null if telemetry data is unavailable |
sentimentPercent | number | null | Percentage of calls with Positive sentiment (0–100). null if no sentiment data |
escalationRate | number | null | Percentage of calls transferred or escalated (0–100) |
dailyVolume
Array of daily call counts:
| Field | Type | Description |
|---|---|---|
date | string | Date in YYYY-MM-DD format |
totalCalls | number | Total calls on this date |
resolvedCalls | number | Calls resolved on this date |
hourlyDistribution
Array of 24 entries (one per hour of the day):
| Field | Type | Description |
|---|---|---|
hour | string | Hour in HH:00 format (e.g., "09:00") |
calls | number | Number of calls during this hour |
minutes | number | Total minutes during this hour |
resolutionBreakdown
| Field | Type | Description |
|---|---|---|
resolved | number | Calls successfully resolved by the agent |
transferred | number | Calls transferred to a human |
abandoned | number | Calls abandoned by the caller |
other | number | Calls with other outcomes |
agentPerformance
Array of per-agent metrics:
| Field | Type | Description |
|---|---|---|
agentId | string | Agent UUID |
agentName | string | Agent display name |
totalCalls | number | Total calls handled |
resolved | number | Calls resolved |
transferred | number | Calls transferred |
abandoned | number | Calls abandoned |
other | number | Other outcomes |
resolvedPercent | number | Percentage resolved |
transferredPercent | number | Percentage transferred |
abandonedPercent | number | Percentage abandoned |
otherPercent | number | Percentage other |
avgDuration | number | Average call duration in seconds for this agent |
sentimentPercent | number | null | Percentage of positive-sentiment calls for this agent. null if no sentiment data |
status | string | Agent status: active, inactive, cancelled, pending, or deleted (hard-deleted from DB) |
aiInsights
AI model quality and operational metrics for the period:
| Field | Type | Description |
|---|---|---|
intentAccuracy | number | null | Percentage of calls where the agent required zero user corrections (0–100). null if no correction data |
contextRetention | number | null | Average ratio of cached LLM tokens to total tokens, as a percentage (0–100). Measures how effectively conversation context is preserved. null if telemetry unavailable |
speechRecognition | number | null | Average STT transcript confidence score as a percentage (0–100). null if telemetry unavailable |
entityExtraction | number | null | Percentage of AI function tool calls that completed without error (0–100). null if telemetry unavailable |
responseLatency | number | null | Average time until the AI model’s first token, in milliseconds. Not how long callers wait — use turnLatency for that. Same source as metrics.responseTime. null if telemetry unavailable |
trainingSessions | number | Total number of call sessions in the date range |
turnLatency
How long callers waited: from the moment the caller stopped talking to the moment the agent’s
audio started. Percentiles are exact over the measured replies.
| Field | Type | Description |
|---|---|---|
overall | object | null | p50Ms (typical wait), p95Ms (slow waits), maxMs (longest wait) and turns (replies measured). null when nothing in the range was measured |
daily | array | One entry per UTC day that has data, oldest first, with the same four fields plus date |
byAgent | array | One entry per agent, slowest p95Ms first, with the same four fields plus agentId and agentName |
Data starts from the release of reply timing and is kept for 90 days. Replies the platform does
not measure this way — the greeting, messages a tool speaks itself, and replies interrupted before
any audio — are not counted, and agents using a single speech-to-speech model never appear here at
all. All three parts are empty when analytics are unavailable.
abandonRate
An FCC-style abandon rate over fixed rolling windows — 24h, 7d and 30d — for the whole organization and per agent. The windows are fixed: startDate and endDate do not scope them, and every accessible agent is included even if it had no calls in the requested range.
The denominator counts only calls that Answering Machine Detection classified as answered by a person (answer_type: human), which is how the FCC defines its 3% limit. A window with no such calls reports null (“not measurable”), never 0, so an agent with detection off is never mistaken for a compliant one. See Outbound Compliance.
| Field | Type | Description |
|---|---|---|
org | object | rates (24h, 7d, 30d, each a number 0–1 or null), threshold (always 0.03 — the per-agent threshold is a per-agent setting), and breached (true when any measurable window is strictly above the threshold). A roll-up over the pooled calls of every agent, not an average of their rates |
byAgent | array | The same shape per agent, plus agentId and agentName, using that agent’s own contactPolicy.abandon_rate_alert_threshold (default 0.03) |
escalationReasons
Array of reasons why calls were transferred or escalated, sorted by count descending. Empty array if no escalated calls have a recorded reason.
| Field | Type | Description |
|---|---|---|
reason | string | AI-extracted reason phrase (e.g., "billing dispute", "technical issue requiring specialist") |
count | number | Number of calls with this reason |
percentOfTotal | number | Percentage of all escalated calls with this reason (0–100) |
avgTimeBeforeEscalation | number | Average call duration in seconds before escalation occurred |
