Filter DSL

Rekor uses a JSON-based filter DSL for querying records. Filters are passed as the filter parameter on query endpoints.

Simple Filter

{
  "field": "data.status",
  "op": "eq",
  "value": "active"
}

Compound Filter

{
  "and": [
    { "field": "data.status", "op": "eq", "value": "issued" },
    { "field": "data.amount", "op": "gt", "value": 5000 }
  ]
}

Operators

OperatorDescriptionExample
eqEqual{"field":"data.status","op":"eq","value":"active"}
neqNot equal{"field":"data.status","op":"neq","value":"deleted"}
gtGreater than{"field":"data.amount","op":"gt","value":100}
gteGreater than or equal{"field":"data.amount","op":"gte","value":100}
ltLess than{"field":"data.amount","op":"lt","value":100}
lteLess than or equal{"field":"data.amount","op":"lte","value":100}
inIn array{"field":"data.status","op":"in","value":["active","pending"]}
not_inNot in array{"field":"data.status","op":"not_in","value":["deleted"]}
likePattern match (case-sensitive){"field":"data.name","op":"like","value":"%Jane%"}
ilikePattern match (case-insensitive){"field":"data.name","op":"ilike","value":"%jane%"}
is_nullIs null{"field":"data.email","op":"is_null"}
is_not_nullIs not null{"field":"data.email","op":"is_not_null"}
hasArray contains{"field":"data.tags","op":"has","value":"urgent"}

Sorting

{
  "sort": [
    { "field": "data.created_at", "direction": "desc" },
    { "field": "data.name", "direction": "asc" }
  ]
}

Pagination

Use limit and offset query parameters:

GET /v1/{workspace}/records/{collection}?limit=20&offset=40

Field Selection

Return a subset of fields with the fields parameter:

GET /v1/{workspace}/records/{collection}?fields=id,data.name,data.status

Aggregation

Run analytics queries with count, sum, avg, min, max and optional grouping:

POST /v1/{workspace}/records/{collection}/aggregate
{
  "aggregations": [
    { "fn": "sum", "field": "data.amount", "alias": "total_amount" },
    { "fn": "count", "alias": "count" }
  ],
  "group_by": ["data.status"],
  "filter": { "field": "data.year", "op": "eq", "value": "2026" },
  "sort": [{ "field": "total_amount", "direction": "desc" }],
  "limit": 50
}

Aggregation Functions

FunctionField RequiredDescription
countNoCount rows (or non-null values if field provided)
sumYesSum of field values
avgYesAverage of field values
minYesMinimum field value
maxYesMaximum field value

Each aggregation requires an alias that names the output column. The same filter DSL applies as a WHERE clause before aggregation. Use group_by to group results by one or more fields.