Responses and pagination
Understand Management API responses, page and cursor pagination, and Send API responses.
Qboxmail APIs return different response formats depending on which API you use.
Management API responses
Most Management API responses look like this:
{
"resources": [],
"pagination": {}
}For list endpoints, resources contains the current page of items and pagination contains navigation metadata.
{
"resources": [
{
"code": "DD66042061",
"name": "example.com"
}
],
"pagination": {
"per": 25,
"page": 1,
"total_pages": 1,
"query": null,
"filter": null,
"status": null,
"sort_field": null,
"sort": null,
"total_records": 1
}
}For single-resource endpoints, resources usually contains one item. For delete operations, the response may be 204 No Content.
Pagination parameters
Common list endpoints support some or all of these query parameters:
| Parameter | Description |
|---|---|
page | Page number. Defaults to 1. |
per | Number of records per page. Defaults commonly to 25. |
query | Text search/filter, when supported by the endpoint. |
status | Status filter, when supported. |
sort_field | Field used for sorting, when supported. |
sort | Sort direction, usually asc or desc. |
pick | Optional field/resource selector on endpoints that support it. |
Always check the endpoint reference for the exact filters supported by each resource.
Cursor pagination for ETLive logs
The ETLive log endpoints (/api/etlive/accesses, /api/etlive/mailins, and /api/etlive/mailouts) do not use page and per. They use a cursor instead:
| Parameter | Description |
|---|---|
count | Number of entries per page. Defaults to 30. |
since | Cursor returned as pagination.last by the previous page. Omit it for the first page. |
sortby | create (default) or update. Other fields, such as login_at, are not supported. |
sortdir | desc (default, newest first) or asc. |
with_totals | Set to yes to include pagination.total_records. |
A response looks like this:
{
"resources": [],
"pagination": {
"count": "100",
"last": "<cursor>",
"total_records": 742
}
}To read every entry for a day:
- Call the endpoint without
since. - Read
pagination.lastfrom the response. - Call the endpoint again with the same parameters and
since=<pagination.last>. - Repeat until the API returns
404, which means there are no more entries.
curl "https://api.qboxmail.com/api/etlive/accesses?domain=D123456789&date=2026-10-09&action=all&count=100&since=<pagination.last>" \
-H "X-Api-Token: <MANAGEMENT_API_TOKEN>"Keep sortby, sortdir, and the filters unchanged between pages, otherwise the cursor no longer matches the result order.
Use cursor pagination with sortby=create, the default. With sortby=update, paging with since can skip or repeat entries.
Send API responses
The Send API does not paginate /v1/send or /v1/send/bulk responses. It returns the messages accepted in that request.
These responses require a Send API token from an existing Delivery account. If the Delivery account, sending domain, or token is missing, fix that setup before expecting accepted-message responses.
{
"error_code": 0,
"message": "OK",
"request_id": "f43eb659-beb4-4f8a-a737-2d403998f4cf",
"queued_messages": 1,
"messages": [
{
"error_code": 0,
"message": "OK",
"request_id": "f43eb659-beb4-4f8a-a737-2d403998f4cf",
"message_id": "8a16f3df-7f5f-4e53-a7e7-3e665ef57c51@example.test",
"submitted_at": "2026-04-16T08:41:13.225Z",
"to": "john@example.com"
}
],
"suppression_summary": {
"status": "checked",
"checked_recipients": 1,
"accepted_recipients": 1,
"suppressed_recipients": 0,
"suppressed_emails": []
}
}Field naming
Public request and response fields use snake_case.
Examples:
request_idmessage_idqueued_messagessuppression_summarytotal_records