Skip to main content

Filtering

Temba supports LHS bracket filtering on GET and DELETE collection requests by appending square-bracket operators to your field names in the query string. Every filter expression must start with the exact, lowercase filter prefix. String matching is case-insensitive. For example:

GET /items?filter.name[eq]=Alice&filter.status[neq]=archived

You can mix dots and brackets in any combination when specifying filters (e.g. filter.role.eq=admin, filter.role[eq]=admin, filter[role].eq=admin, filter[role][eq]=admin, etc.), but the recommended—and most common—style is to put the operator between brackets:

GET /users?filter.role[eq]=admin

Omitting the operator defaults to an [eq] operator, so both of these are equivalent:

GET /users?filter.role=admin
GET /users?filter.role[eq]=admin

Note on validation: Unknown field names are safely ignored (returning empty results). However, malformed expressions, incorrectly cased operators (e.g., [EQ]), or unsupported operators will return a 400 Bad Request.

The following operators are supported:

OperatorDescriptionExample
[eq]equals (case-insensitive)?filter.name[eq]=Alice (or ?filter.name=Alice)
[neq]not equals (case-insensitive)?filter.status[neq]=archived
[contains]substring match (case-insensitive, strings only)?filter.description[contains]=lorem
[startsWith]prefix match (case-insensitive, strings only)?filter.username[startsWith]=admin
[endsWith]suffix match (case-insensitive, strings only)?filter.email[endsWith]=@example.com
[gt]greater than?filter.age[gt]=18
[gte]greater than or equal?filter.price[gte]=10
[lt]less than?filter.score[lt]=100
[lte]less than or equal?filter.price[lte]=100
[in]one of a list of values?filter.age[in]=18,21,65
[nin]not in a list of values?filter.status[nin]=draft,pending
[exists]field is present (true) or absent (false)?filter.email[exists]=true
[regex]full regular-expression match (URL-encode special chars)?filter.name[regex]=^A.*e$%5EA.*e%24

[eq] and [neq] also work on booleans — use "true" or "false" as the filter value: ?filter.isActive[eq]=true.

[regex] matches string fields only (non-string fields return no results). The pattern is case-sensitive by default; use inline flags (e.g. (?i)) for case-insensitive matching. Special characters in the pattern must be URL-encoded (e.g. ^%5E, $%24). An invalid regular expression returns a 400 Bad Request.

The [gt], [gte], [lt], and [lte] operators work on both numbers (integers and decimals) and strings. String comparisons are lexicographic, which means ISO 8601 date strings (e.g. "2026-01-31") sort and compare correctly by date order. Multiple operators can be combined on the same field to express a range:

GET /users?filter.age[gte]=18&filter.age[lt]=65
GET /products?filter.price[gt]=9.99&filter.price[lte]=49.99
GET /events?filter.date[gte]=2026-01-01&filter.date[lt]=2027-01-01