Filters
Your team wants “published products in Kitchen, added last month”. Filters give them that, on the server, in the URL.
filters: [ filter.select('status', { draft: 'Draft', published: 'Published' }), filter.belongsTo('category'), filter.dateRange('createdAt'), filter.custom('Low stock', (q) => q.where('stock', '<', 10)), filter.boolean('isFeatured').label('Featured'),],Each filter is a URL query parameter named after it, so a filtered view can be bookmarked:
?status=published&category=3&createdAt=2026-10-01..2026-10-31&low-stock=1Filters combine with each other, with search, and with sort. Changing one goes back to page 1.
Filter kinds
Section titled “Filter kinds”filter.select(column, options)matches a column against one of the options.filter.boolean(column)matches a true or false column.filter.dateRange(column)takes whole days in the admin’s timezone (timezoneinconfig/azu.ts). Either end can be left open.filter.belongsTo(relation)picks a related record from a searchable list. It shows only to users who pass the related resource’sviewList, like abelongsTofield.filter.custom(label, query)is an on or off filter with your own query, typed against the model. Its parameter is the label in kebab case, so “Low stock” islow-stock.
Every filter takes .label(), as the demo’s filter.boolean('isFeatured').label('Featured') does.
Reserved names
Section titled “Reserved names”A filter can’t be named after the list’s own parameters: page, perPage, sort, direction, search, or columns. If one is, Azu refuses to boot.
Bad values
Section titled “Bad values”Values that don’t fit a filter are ignored rather than failing the page. A hand-edited or stale link still shows a list.