Skip to content

Search

Every generated resource exposes one search route instead of a detail route: there is no GET /blog-posts/:id — asking for one record is a filter on id that happens to return a single row, not a separate contract to learn.

POST /blog-posts/search
Authorization: Bearer <token>
Content-Type: application/json

{
  "filters": [
    {
      "field": "title",
      "operator": "like",
      "value": "hello"
    }
  ]
}

search, describe and the relation search routes answer with an ETag and Cache-Control: private, no-cache, with Vary: Authorization, Cookie. The ETag hashes the response body together with the caller’s tenant, user and impersonator, so two callers never share an entry even when a capability-scoped response happens to be identical. Send it back as If-None-Match and an unchanged response comes back as 304 with no body.