Skip to content
API PlatformDevelopers
GET/v1/reports/staffbeta

Staff report

Needs
Read your data (mcp:read)
Plan
Any plan with API access
Limits
300 a minute per key
Undo
Nothing to undo: this only reads.

Per staff member for a period: conversations handled, replies, closes, response and close times, and SLA breaches. Paged with cursor.

A metric this workspace cannot answer is null and listed in unavailable[] with the reason. Never read `null` as zero.

Try it

Query (6)

A named period. Default `last_7_days`. Weeks start on Monday.

First day, YYYY-MM-DD. Give `from` and `to` together; they override `preset`. Up to 186 days.

Last day (inclusive), YYYY-MM-DD.

IANA time zone, e.g. `Asia/Dubai`. Default: your workspace time zone.

How many items per page (1–100).

The `next_cursor` from the previous page. Cursors expire after 24 hours.

This only reads. It uses your real data and changes nothing.

Code and response

curl -X GET 'https://mcp.wa-api.cloud/v1/reports/staff' \
  -H "Authorization: Bearer $API_KEY"

The code reads your key from $API_KEY.

Parameters

Parameters
FieldTypeWhat it is
presetstring · queryA named period. Default last_7_days. Weeks start on Monday.one of: today, yesterday, last_7_days, last_14_days, last_30_days, this_month, last_month, this_week, last_week
fromstring · queryFirst day, YYYY-MM-DD. Give from and to together; they override preset. Up to 186 days.pattern ^\d{4}-\d{2}-\d{2}$
tostring · queryLast day (inclusive), YYYY-MM-DD.pattern ^\d{4}-\d{2}-\d{2}$
timezonestring · queryIANA time zone, e.g. Asia/Dubai. Default: your workspace time zone.1–64 characters
limitinteger · queryHow many items per page (1–100).1–100 · default 25
cursorstring · queryThe next_cursor from the previous page. Cursors expire after 24 hours.1–2048 characters

Headers

Headers
FieldTypeWhat it is
AuthorizationrequiredheaderBearer $API_KEY — your API key.
Api-VersionheaderThe API version to use, e.g. 2026-10-01. Default: the version your key is pinned to.one of: 2026-10-01 · pattern ^\d{4}-\d{2}-\d{2}$

Response 200

A page of staff rows.

Response fields
FieldTypeWhat it is
rangerequiredobjectThe range and timezone these numbers were counted in — always state it when reporting them.
fromrequiredstringFirst local day (YYYY-MM-DD), inclusive.
torequiredstringLast local day (YYYY-MM-DD), inclusive.
daysrequiredintegerNumber of local days in the range.-9007199254740991–9007199254740991
timezonerequiredstringIANA timezone the days were counted in.
started_atrequiredstringRange start as a UTC instant (ISO-8601).
ended_atrequiredstringRange end as a UTC instant (ISO-8601), exclusive.
presetrequiredstring or nullThe named range used, if any.
sourcerequiredstringWhere the per-staff numbers come from.one of: generated_report, live_closes
reportrequiredobject or nullThe generated report used, if any. coversMoreThanAsked = its period is wider than the range you asked for, so the numbers cover more days.
idrequiredstring
namerequiredstring or null
fromrequiredstring
torequiredstring
generated_atrequiredstring or null
timezonerequiredstring or null
covers_more_than_askedrequiredboolean
datarequiredarray of object
staff_idrequiredstring or nullnull = unassigned / system.
namerequiredstring or null
conversationsrequiredinteger or nullConversation episodes attributed to this staff member in the range.-9007199254740991–9007199254740991
handledrequiredinteger or nullEpisodes they actually held (assignment ledger), not just were assigned at the end.-9007199254740991–9007199254740991
closedrequiredinteger or null-9007199254740991–9007199254740991
repliedrequiredinteger or null-9007199254740991–9007199254740991
untouchedrequiredinteger or nullEpisodes that never got a reply from them.-9007199254740991–9007199254740991
messages_sentrequiredinteger or null-9007199254740991–9007199254740991
avg_first_response_secondsrequirednumber or nullAssignment → their first human reply (a bot reply does not stop the clock).
avg_time_to_close_secondsrequirednumber or null
reopenedrequiredinteger or null-9007199254740991–9007199254740991
sla_breachesrequiredobject or nullNull when the source cannot say (live fallback, or SLA not configured).
first_responserequiredinteger or null-9007199254740991–9007199254740991
next_responserequiredinteger or null-9007199254740991–9007199254740991
resolutionrequiredinteger or null-9007199254740991–9007199254740991
totalrequiredinteger or null-9007199254740991–9007199254740991
sla_compliance_raterequirednumber or nullMet / (met + breached) over resolved clocks, 0-1. Not comparable with the per-policy compliance rate.
reason_coveragerequirednumber or nullLive source only: fraction of their closes that recorded a reason.
populationrequiredobjectHow many staff the source ranked, and whether it cut the list.
totalrequiredinteger or null-9007199254740991–9007199254740991
cappedrequiredboolean
noterequiredstring or null
workload_nowrequiredarray of objectLive snapshot, most waiting first. Empty when unavailable.
staff_idrequiredstring or null
namerequiredstring or null
waitingrequiredinteger or null-9007199254740991–9007199254740991
oldest_wait_secondsrequirednumber or null
assigned_openrequiredinteger or null-9007199254740991–9007199254740991
window_expiredrequiredinteger or null-9007199254740991–9007199254740991
notesrequiredarray of string
next_cursorrequiredstring or null
unavailablerequiredarray of objectMetrics that are UNKNOWN (missing data source), not zero. Say so when reporting; do not fill them in with 0.
metricrequiredstringWhich metric or section is missing, e.g. "messages.read".
reasonrequiredstringWhy it is missing (not supported by this server version, service not configured, forbidden, temporarily unavailable…).

Errors

Errors are application/problem+json. Branch on code.

StatusCodeWhen
400invalid_input

A field is missing or has the wrong format. errors[] points at each field. The range is reversed, in the future, longer than 186 days, or the time zone is unknown.

401unauthenticated

The Authorization header is missing, the key is unknown, expired or revoked.

403entitlement_required

The workspace's plan does not include API access (api_access).

403forbidden

The key owner has no report permission.

403insufficient_scope

The key does not have the permission this operation needs.

429rate_limited

The key or workspace went over its rate limit. Wait for Retry-After seconds.

503upstream_unavailable

A service behind the API is briefly unavailable. Safe to retry with backoff.

Examples

Last 7 days

Response 200

{
  "data": [
    {
      "staff_id": "1203",
      "name": "Priya Nair",
      "conversations": 120,
      "closed": 98,
      "replied": 410,
      "avg_first_response_seconds": 95,
      "avg_time_to_close_seconds": 5200,
      "sla_breaches": null,
      "handled": null,
      "untouched": null,
      "messages_sent": null,
      "reopened": null,
      "sla_compliance_rate": null,
      "reason_coverage": null
    }
  ],
  "next_cursor": null,
  "range": {
    "from": "2026-09-17",
    "to": "2026-09-23",
    "days": 7,
    "timezone": "Asia/Dubai",
    "started_at": "2026-09-16T20:00:00Z",
    "ended_at": "2026-09-23T20:00:00Z",
    "preset": "last_7_days"
  },
  "unavailable": [],
  "source": "generated_report",
  "report": null,
  "population": {
    "total": null,
    "capped": false,
    "note": null
  },
  "workload_now": [],
  "notes": []
}

Operation path

The same operation is also at POST /v1/ops/reports_staff, with every field in the JSON body.