Skip to main content

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​

FieldTypeDescription
countintegerNumber of items across all pages. It can lag behind recent changes (see below).
nextstring/nullURL for the next page (null on last page)
previousstring/nullURL for the previous page (null on first page)
resultsarrayArray 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​

404 RESPONSE ON EMPTY PAGES

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 next link
  • 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 CAN LAG BEHIND

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.