Four endpoints accept the same request body, so once you can query one of them you can query all four:
Each request returns only the records belonging to the subscriber the API key was issued to. There is no way to widen a query past your own data.
Start with the fields endpoint
Every dataset publishes its own catalog of fields. Read it once and use it to build your filters, rather than guessing field names:id is what you name in filters, sort and fields. The operators list is exactly what that field accepts — anything else is rejected with a 400.
Building a filter
A filter is a group of clauses joined byand (the default) or or. Each clause names a field, an operator and a value:
and with or. This matches tasks that are either overdue or unassigned, in both cases only on the Northern site:
filters entirely to list everything the key’s subscriber owns.
Operators
Which operators a field accepts depends on itstype:
in and notIn take an array. between needs an endValue and includes both ends. isEmpty and isNotEmpty take no value at all.
Values
- Dates are strings, either a plain date (
"2026-01-31") or a full timestamp. A plain date covers the whole day, soeqon"2026-01-31"matches anything that day. Dates with no time zone are read as UTC. - Status fields (
type: "enum") accept either the numeric code or the label from the catalog, so1and"Completed"are the same filter. Responses always return the code. - Text matches without regard to case. In
containsandstartsWith, a%or_in your value matches itself rather than acting as a wildcard. - Booleans are
trueorfalse.
isEmpty on a text field also matches an empty string, not just a missing value.Some older records store an unset date as a placeholder such as 1901-01-01 rather than leaving it empty, so treat a date at or before 1901 as “not set” rather than relying on isEmpty.Time range
timeRange is a shorthand for filtering on the dataset’s defaultDateFieldId, so you do not have to know which date field that is. Use a preset:
from and excludes to:
timeRange — filter on a field instead.
Sorting and paging
start by rows. rows defaults to 100 and caps at 1000; count in the response is the total number of matches, so you know when to stop.
Reading the response
items holds one object per record, keyed by the same field ids you filtered on. Ask for fields to keep the payload small; omit it to get every field in the catalog. A field with no value is null.
Errors
A rejected filter tells you what to change:
