Skip to main content
Every list endpoint in the Topo API returns the same envelope structure so you can handle pagination consistently across all resources. Instead of cursor-based navigation, Topo uses classic page-and-size parameters — straightforward to implement, easy to restart, and safe to cache by page number.

Response envelope

All list responses wrap their records in a standard pagination envelope:
array
required
The records on the current page.
integer
required
Total number of records matching the current query (across all pages).
integer
required
Total number of pages given the current size value.
boolean
required
true if there are additional pages after the current one; false on the last page.
Example

Pagination parameters

Control which page of results you receive using these query parameters on any list endpoint:
integer
default:"1"
The page number to retrieve. Must be 1 or greater.
integer
default:"10"
Number of records to return per page. Must be between 1 and 100 inclusive.
size is capped at 100 records per request. To retrieve more than 100 records, increment page on successive requests until has_more is false.

Sorting

Most list endpoints accept sort_by and sort_order query parameters to control the order of results:
string
The field name to sort by (e.g. created_at, email). If omitted, the endpoint uses its default ordering. Refer to individual endpoint documentation for the supported sort fields.
string
default:"asc"
Sort direction. Accepted values: asc (ascending) or desc (descending).

Filtering

Most list endpoints accept additional query parameters to narrow results. Common filter parameters include: Filter parameters vary by resource — see each endpoint’s reference for the full list of supported filters.
All query parameters use snake_case naming. No aliasing or camelCase variants are accepted.

Example: paginated request with sorting and filtering

Retrieve the second page of contacts, 25 per page, sorted by most recently created, filtered to a specific email domain:
Iterate through all records To fetch every record matching a query, loop until has_more is false:

Envelope stability

The { items, total_count, total_pages, has_more } envelope shape is frozen — it will not change within /v1. You can safely build your deserialization logic against this structure.