Querying
The feed supports these OData system query options. Anything else — $expand, $search, $apply — answers 501 Not Implemented rather than being silently ignored, so a response always means exactly what you asked for.
| Option | What it does | Example |
|---|---|---|
$filter | Keep only the rows matching an expression | $filter=visitDate ge 2026-01-01 |
$orderby | Sort by one or more properties, asc (default) or desc; empty values come first ascending and last descending, as OData specifies | $orderby=visitDate desc |
$top | Page size, at most 1000 (also the default) | $top=500 |
$skip | Rows to skip before the page | $skip=1000 |
$count | true adds @odata.count, the total matching rows | $count=true |
$select | Return only these properties (the key is always kept) | $select=id,visitDate,quantityTotal |
Each set also answers GET /<Set>/$count with the plain number of rows, $filter applied.
Filter expressions
Comparisons eq ne gt ge lt le, combined with and, or, not and parentheses, plus the text functions contains, startswith and endswith (these match case-insensitively).
Literals: 'strings' (double a quote to escape it: 'It''s'), numbers, true/false, null (with eq/ne only), GUIDs quoted or bare, dates (2026-01-01) and timestamps (2026-01-01T10:00:00Z, any offset).
$filter=visitDate ge 2026-01-01 and visitDate lt 2026-02-01 $filter=quantityTotal gt 2 or origin eq null $filter=contains(email, '@example.dk') and archived eq false $filter=type eq 'ORDER' and amount ge 100 $filter=ticketTypeId eq bd4a0997-39db-41d9-883a-cdfa83e2101f
A filter on a property the set does not have, a type mismatch (quantityTotal eq 'two'), or anything the grammar cannot read is a 400 with an error code — never a silently dropped condition.
Paging
Large results come in pages. When a page is full, the response carries @odata.nextLink: the same query with $skip advanced and every option — filter, order, selection, count — kept. Follow it until it disappears. OData clients (Power BI, Excel) do this on their own; rows are ordered stably, so pages never overlap.
Errors
Errors are OData JSON with a code:
{ "error": { "code": "UNKNOWN_FILTER_FIELD", "message": "Unknown property visitdate in $filter." } }
401 means no key reached the feed, 403 an invalid key or one without OData access, 400 a request the feed cannot read, 404 an unknown set or entity, 501 an OData option the feed does not implement.