Mailbox User Performance
Per-user reply and close performance for a mailbox and date range. Async, paginated, supports field groups.
Returns user-level reply and close performance for a mailbox, grouped by time period. Mirrors the User Performance and User Closed Performance reports in Emailgistics Admin.
/ api/ v1/ reports/ mailboxUserPerformance- Auth
- Bearer API key — requires
reportingscope - Async
- Yes — see Result envelope and async polling
- Pagination
- Yes — see Pagination
Authorization
The API key must include the reporting scope and have the requested mailboxId in its mailbox allowlist. A missing scope returns 403; a mailboxId outside the allowlist returns 404.
Query parameters
fieldGroup?stringdefault replyDataComma-separated list of field groups to include in the result. Defaults to replyData. See Field groups.
includeDetails?booleandefault falseWhen true, includes user display name, email, and active flag with each result row. See Field groups and includeDetails.
max?integerdefault 50Maximum number of result rows per page. Capped at 500.
starting_after?stringCursor — return rows whose id is greater than this. Mutually exclusive with ending_before.
ending_before?stringCursor — return rows whose id is less than this. Mutually exclusive with starting_after.
Body parameters
mailboxIdstringThe mailbox to report on. Must be in the API key’s mailbox allowlist.
startstring (ISO 8601 datetime)Start of the report range, in the mailbox’s time zone. Any time-zone specifier is ignored.
endstring (ISO 8601 datetime)End of the report range, in the mailbox’s time zone.
period"hour" | "day" | "week" | "month"Time period to group results by. Results always start with the period containing start and end with the period containing end.
users?string[]Filter to specific users by ID. Users not in the mailbox are silently ignored. The reserved value "unknown" includes activity performed without an identifiable user (for example, when an Outlook user drags a message from the Inbox).
Only full periods are reported. With start = 2026-01-03T00:00:00, end = 2026-04-16T00:00:00, and period = month, you get four rows covering January through April.
Field groups
Two groups are supported. Request multiple by comma-separating: ?fieldGroup=replyData,closeData. Fields shared across groups appear once.
replyData (default)
Performance of replies sent by the user.
idstringCursor used by pagination.
startDateTimestring (ISO 8601 datetime)Start of the period this row covers.
userIdstringUser identifier.
assignedintegerNumber of messages assigned to the user.
reassignedintegerNumber of messages reassigned away from the user.
initiatedintegerOutgoing messages the user initiated (not replies).
initialRepliesintegerNumber of initial replies the user sent.
additionalRepliesintegerSubsequent replies on the same conversation.
averageUserInitialReplyTimenumberAverage user reply time, in minutes.
averageMailboxInitialReplyTimenumberAverage mailbox reply time, in minutes.
averageElapsedInitialReplyTimenumberAverage elapsed reply time, in minutes.
replyConversationsintegerDistinct conversations the user replied in.
activeConversationsintegerConversations the user touched (assigned, replied, or initiated).
closeData
Performance of message closes (archive, delete, junk, sent items).
idstringCursor used by pagination.
startDateTimestring (ISO 8601 datetime)Start of the period this row covers.
userIdstringUser identifier.
assignedintegerNumber of messages assigned to the user.
reassignedintegerNumber of messages reassigned away from the user.
closedArchivedintegerMessages closed by archiving.
closedDeletedintegerMessages closed by deletion.
closedJunkintegerMessages closed by being marked Junk.
closedSentItemsintegerMessages closed by being moved to Sent Items.
averageUserCloseTimenumberAverage user close time, in minutes.
Detail fields (with includeDetails=true)
When includeDetails is true, each row also includes:
userName?stringUser display name.
userEmail?stringUser email address.
userActive?booleanWhether the user is currently a member of the mailbox.
Request
curl -X POST 'https://c1.emailgistics.com/api/v1/reports/mailboxUserPerformance?fieldGroup=replyData,closeData&includeDetails=true&max=100' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"mailboxId": "af412a6c-657f-445b-892c-b6b1fa41ad1b",
"start": "2026-04-01T00:00:00",
"end": "2026-05-01T00:00:00",
"period": "week"
}'{
"mailboxId": "af412a6c-657f-445b-892c-b6b1fa41ad1b",
"start": "2026-04-01T00:00:00",
"end": "2026-05-01T00:00:00",
"period": "week",
"users": ["3f4a5b60-774a-43f5-afb9-dfe54eaf6c3f", "unknown"]
}Response
This endpoint is asynchronous. The first response often returns status: "running". Poll the URL in _links.self until status: "done". See Result envelope and async polling for the full lifecycle and recommended cadence.
Initial response — status: "running"
Returned immediately when the report is queued.
{
"_links": {
"self": {
"href": "https://c1.emailgistics.com/api/v1/reports/results/64cbb039-15be-4c88-b3f2-59a17e2880e4?max=100",
"method": "GET"
},
"origin": {
"href": "https://c1.emailgistics.com/api/v1/reports/mailboxUserPerformance",
"method": "POST",
"body": { "parameters": { "mailboxId": "af412a6c-...", "start": "2026-04-01T00:00:00", "end": "2026-05-01T00:00:00", "period": "week" } }
}
},
"status": "running",
"progress": 30,
"result": { "total": null, "data": [], "timeZone": "America/New_York" }
}Poll _links.self
Use exponential backoff starting at 2 seconds, capped at 30 seconds. Result IDs expire 24 hours after creation; calls to expired result IDs return 404.
Final response — status: "done"
{
"_links": {
"self": { "href": "https://c1.emailgistics.com/api/v1/reports/results/64cbb039-...?max=100", "method": "GET" },
"next": { "href": "https://c1.emailgistics.com/api/v1/reports/results/64cbb039-...?max=100&starting_after=10027", "method": "GET" },
"origin": { "href": "https://c1.emailgistics.com/api/v1/reports/mailboxUserPerformance", "method": "POST", "body": { "parameters": { "mailboxId": "af412a6c-...", "start": "2026-04-01T00:00:00", "end": "2026-05-01T00:00:00", "period": "week" } } }
},
"status": "done",
"progress": 100,
"result": {
"total": 412,
"dataCutoffTimestamp": "2026-05-01T08:14:00.0",
"timeZone": "America/New_York",
"data": [
{
"id": "10001",
"startDateTime": "2026-04-01T00:00:00",
"userId": "3f4a5b60-774a-43f5-afb9-dfe54eaf6c3f",
"userName": "Emily Johnson",
"userEmail": "emilyjohnson@company.com",
"userActive": true,
"assigned": 128,
"reassigned": 12,
"initialReplies": 64,
"additionalReplies": 31,
"averageUserInitialReplyTime": 42.7,
"averageMailboxInitialReplyTime": 71.3,
"closedArchived": 51,
"closedDeleted": 4
}
]
}
}More examples
Filter to specific users, closeData only, fetching the next page
Asks for close performance for two named users — plus the reserved unknown user — over April, week-grouped, and advances past the first page using a starting_after cursor returned in a previous call. includeDetails is omitted, so the response carries IDs only.
curl -X POST 'https://c1.emailgistics.com/api/v1/reports/mailboxUserPerformance?fieldGroup=closeData&max=50&starting_after=10027' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"mailboxId": "af412a6c-657f-445b-892c-b6b1fa41ad1b",
"start": "2026-04-01T00:00:00",
"end": "2026-05-01T00:00:00",
"period": "week",
"users": [
"3f4a5b60-774a-43f5-afb9-dfe54eaf6c3f",
"e142c23e-6800-4d9b-af7e-4078c0ff6e2a",
"unknown"
]
}'{
"_links": {
"self": { "href": "https://c1.emailgistics.com/api/v1/reports/results/9b21f4a3-...?max=50&starting_after=10027", "method": "GET" },
"prev": { "href": "https://c1.emailgistics.com/api/v1/reports/results/9b21f4a3-...?max=50&ending_before=10028", "method": "GET" },
"next": { "href": "https://c1.emailgistics.com/api/v1/reports/results/9b21f4a3-...?max=50&starting_after=10077", "method": "GET" },
"origin": {
"href": "https://c1.emailgistics.com/api/v1/reports/mailboxUserPerformance",
"method": "POST",
"body": { "parameters": { "mailboxId": "af412a6c-...", "start": "2026-04-01T00:00:00", "end": "2026-05-01T00:00:00", "period": "week", "users": ["3f4a5b60-...", "e142c23e-...", "unknown"] } }
}
},
"status": "done",
"progress": 100,
"result": {
"total": 12,
"dataCutoffTimestamp": "2026-05-01T08:14:00.0",
"timeZone": "America/New_York",
"data": [
{
"id": "10028",
"startDateTime": "2026-04-15T00:00:00",
"userId": "3f4a5b60-774a-43f5-afb9-dfe54eaf6c3f",
"assigned": 41,
"reassigned": 2,
"closedArchived": 18,
"closedDeleted": 1,
"closedJunk": 0,
"closedSentItems": 22,
"averageUserCloseTime": 33.4
}
]
}
}Pagination
If the result set spans multiple pages, the response includes _links.next and/or _links.prev. Follow them to retrieve adjacent pages — see Pagination for cursor semantics.
Errors
| Status | When |
|---|---|
400 | Body fails validation — missing required field, invalid period, or start after end. |
401 | API key missing, malformed, or expired. |
403 | Key is missing the reporting scope. |
404 | mailboxId is not in the key’s mailbox allowlist (or doesn’t exist — the two cases are indistinguishable). |
429 | Rate limit exceeded — see Rate limits. |
5xx | Transient server error. |
Error bodies follow the standard shape — see Errors.
Related
- Mailbox Performance — same data aggregated at the mailbox level
- Poll report results — the polling endpoint used here
- Result envelope and async polling
- Field groups and includeDetails