Silo’s filter is a JSON AST, not a string language. You describe exactly what you want, and Silo validates the shape before touching storage. Fields are addressed using RFC 9535 JSONPath over a document ofDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/org-quicko/silo/llms.txt
Use this file to discover all available pages before exploring further.
{id, rev, created_at, updated_at, data} — your own fields always live under $.data, so a field named id in your schema can never shadow the envelope’s $.id.
JSONPath addressing
Every filter, sort, and search path is a JSONPath expression over the entry document.| Path | Selects |
|---|---|
$.id | Entry ULID |
$.rev | Current revision number |
$.created_at | Creation timestamp (RFC 3339 UTC) |
$.updated_at | Last-updated timestamp (RFC 3339 UTC) |
$.data.title | A top-level field in your schema |
$.data.author.name | A nested field |
$.data.tags[*] | All elements of an array |
$.data.tags[0] | First element of an array (negative indices work too) |
$), name selectors (.field), array indices ([n], negative included), and the child wildcard ([*]).
Not supported (actively refused): recursive descent (..), slices ([0:2]), unions ([a,b]), filter selectors ([?…]), and function extensions. Silo refuses these by name rather than silently ignoring them, so a typo or unsupported construct is an error, not a silent no-op.
Filter AST
A filter is a JSON object with anop field. Logical operators nest leaf conditions.
Compound example
Using a filter in a request
Pass the filter JSON as a URL-encodedfilter query parameter.
A filter may test at most 16 leaf conditions. Filters with more leaves are rejected with
400 validation_failed. Break large filters into multiple requests if needed.Sorting
Thesort parameter accepts a comma-separated list of JSONPath expressions. Prefix a path with - for descending order.
- Sort paths must select at most one node per entry. Array paths (
[*]) are not valid sort keys. - Multiple sort terms are applied left to right.
- When no
sortis given on a search request, results are ranked by relevance.
Pagination
| Parameter | Default | Maximum |
|---|---|---|
limit | 50 | 500 |
offset | 0 | — |
Response envelope
Every list and search response wraps results in a consistent envelope:total is the count of all matching entries, regardless of the current page. Use it to drive pagination UI.
Full-text search
Search takes the samefilter, sort, limit, and offset parameters, plus q for the search text. It is available at three reaches:
| Reach | Path |
|---|---|
| One collection | /api/projects/{project}/envs/{env}/collections/{name}/search?q=… |
| One environment | /api/projects/{project}/envs/{env}/search?q=… |
| Everything the key can read | /api/search?q=… |
TypeScript client
The@org-quicko/silo-client package ships a type-safe filter builder. The result is the same JSON AST described above.
posts.filter.field("status") addresses $.data.status. posts.filter.each("tags") addresses $.data.tags[*]. Sort.recentlyUpdated() expands to sort=-$.updated_at.