Measure CSAT and response time
Read ticket response-time and satisfaction reports using an authenticated agent session.
Before you start
These dashboard APIs require a current agent-session JWT and ticket-report access. Verify, Messaging and iMessage API keys cannot authenticate these endpoints. Keep session tokens on your server, out of public scripts and source control. Results are restricted by the calling agent’s permissions.
Read response times
Use explicit ISO timestamps for a reproducible interval. The start is inclusive and the end exclusive. Values are seconds of elapsed time, including nights and weekends; business hours are not subtracted. Each row describes one agent. Null percentiles mean no qualifying samples. The example values below are illustrative.
curl 'https://app.message.com/api/v1/reports/tickets/response-times?from=2026-10-01T00:00:00Z&to=2026-10-31T00:00:00Z' \
-H "Authorization: Bearer $MESSAGE_AGENT_TOKEN"Response-time response
The endpoint returns the median (P50) and 95th percentile (P95), not P90 or P99. First-response time is measured from ticket creation to that agent’s first reply. Resolution time uses closed tickets assigned to the agent.
{
"rows": [
{
"agentId": "00000000-0000-4000-8000-000000000001",
"name": "Alex",
"firstResponseSecP50": 240,
"firstResponseSecP95": 1800,
"resolutionSecP50": 7200,
"resolutionSecP95": 86400,
"ticketsHandled": 20
}
],
"range": {
"to": "2026-10-31T00:00:00.000Z",
"label": "Custom range",
"days": 30,
"from": "2026-10-01T00:00:00.000Z"
}
}Read satisfaction
GET /api/v1/reports/tickets/satisfaction accepts the same range and departmentId/agentId filters. The response includes totalRated, positive, negative, avgCsat, satisfactionScore, comments (up to 100 latest), byDay and range. Satisfaction score is positive ratings divided by all rated tickets, multiplied by 100; unrated tickets are excluded. A CSAT rating of at least 4 or thumbs-up is positive; at most 2 or thumbs-down is negative. No ratings produces null scores, not zero satisfaction.
{
"totalRated": 20,
"positive": 16,
"negative": 2,
"avgCsat": 4.2,
"satisfactionScore": 80,
"comments": [],
"byDay": [],
"range": {
"to": "2026-10-31T00:00:00.000Z",
"label": "Custom range",
"days": 30,
"from": "2026-10-01T00:00:00.000Z"
}
}Build your dashboard
Check the HTTP status before parsing or displaying data. Use rows for agent response times, and keep null values distinct from zero. Poll at a reasonable interval; a snapshot does not guarantee the next call returns identical totals.
For alerts, compare firstResponseSecP95 with your chosen elapsed-time threshold. The API does not configure an SLA alert simply by reading the report. CSV downloads use /api/v1/reports/export; see the Reports reference for formats and permissions.