Output data format
Every response body is JSON. This page describes what all responses have in common.
Single records
A request for one record, such as GET /users/:id/, returns the record itself as a JSON object. Responses are abridged here:
{
"id": 1924,
"user_key": "g7lvoickax9e",
"name": "Alex Doe",
"email": "johndoe@example.com",
"status": "visitor",
"created_at": "2026-11-10T14:20:02.361287Z"
}
Lists
A request for many records, such as GET /users/, returns the records in results, together with the fields used for pagination:
{"count": 1,"next": null,"previous": null,"results": [{"id": 1924,"user_key": "g7lvoickax9e","name": "Alex Doe","email": "johndoe@example.com","status": "visitor","created_at": "2026-11-10T14:20:02.361287Z"}]}Dates and times
Dates and times are strings in ISO 8601 format, in UTC, for example "2026-11-10T14:20:02.361287Z".
Empty values
A field without a value is usually returned as null. Endpoint pages mark the fields that can be null as nullable in their Response fields table.
Pagination
Lists use cursor-based pagination and return up to 100 results per page (the exact limit may vary by endpoint; each endpoint page says how many).
Page fields
| Field | Type | Description |
|---|---|---|
count | integer | Number of items across all pages. It can lag behind recent changes (see below). |
next | string/null | URL for the next page (null on last page) |
previous | string/null | URL for the previous page (null on first page) |
results | array | Array of objects for the current page |
Pagination examples
First page (no previous link):
{
"count": 664,
"next": "https://<your_app_subdomain>.user.com/api/public/users/?cursor=1971",
"previous": null,
"results": [
// 100 user objects...
]
}
Middle page (has both links):
{
"count": 664,
"next": "https://<your_app_subdomain>.user.com/api/public/users/?cursor=1525",
"previous": "https://<your_app_subdomain>.user.com/api/public/users/?cursor=1970&rev=1",
"results": [
// 100 user objects...
]
}
Last page (no next link, partial results):
{
"count": 664,
"next": null,
"previous": "https://<your_app_subdomain>.user.com/api/public/users/?cursor=1122&rev=1",
"results": [
// 64 user objects...
]
}
Navigation: Use the complete URLs from next/previous fields. Forward navigation uses ?cursor=VALUE, backward navigation uses ?cursor=VALUE&rev=1.
Important note about pagination
When the total number of records is exactly divisible by the page size, the next link may be present on the last page but will return a 404 error when accessed.
Example scenario:
- Total records: 300
- Page size: 100 records per page
- Pages 1-3: Each shows 100 records with
nextlink - Page 4: Does not exist and returns 404
This behavior is intentional for performance optimization. Always handle potential 404 responses when following next pagination links.
count is not updated right away when records are created or deleted, so it can differ from the number of records you get by following the pages. Don't use it to work out how many pages are left: keep following next until it is null or returns 404.