Skip to main content
API reference sections

Schema

AttributeQuery

POST /v1/attributes/query.

Every filter is optional and absent means "no constraint". Filters compose with AND; the values inside tags compose with OR (any of). The base set is nodes carrying at least one attribute - a bare paragraph is never a row of an attribute query, even under missing.

Type object

Shape

FieldTypeDescription
workspacesarray of WorkspaceId

Which workspaces to search. Empty means every workspace this store holds.

Default []

hasstring or null

Only nodes carrying this attribute key (koru.due, or a custom definition's key).

Default null

missingstring or null

Only nodes not carrying this key. Combined with the base rule this reads "has some attribute, but not this one".

Default null

tagsarray of string

Only nodes carrying any of these tags, each a TagId in storage form. Ids, never names - the tag table owns names and rename must not change what a saved query matches.

Default []

prioritystring or null

Only nodes whose koru.priority equals this token (low | medium | high | urgent).

Default null

min_prioritystring or null

Only nodes whose koru.priority is this token or more important - the semantic order low < medium < high < urgent, never the alphabetic one.

Default null

dueDueFilter or null

Which koru.due values match, stated per temporal type.

Default null

sortstring or null

due, priority or modified. Absent means modified - newest first, which is what a surface with no opinion wants.

Default null

group_bystring or null

Ask for corpus-wide counts beside the page. tag is the only token; absent means no groups, and the response's groups is empty.

It is a separate question from paging, deliberately: a client can count a page itself, and what it cannot do is count the rows it did not fetch. So the counts come from their own statement over the same filter, and a group's count is the whole matching corpus rather than the page above it.

Default null

limitinteger (uint, >= 0) or null

Rows per page. Absent means the server default; the server also caps it, so a huge number is a full page rather than a full table.

Default null

offsetinteger (uint, >= 0) or null

Rows to skip. Page by increasing this until a short page comes back.

Default null

Example
{
  "workspaces": [],
  "has": "string",
  "missing": "string",
  "tags": [],
  "priority": "string",
  "min_priority": "string",
  "due": {
    "dates": {
      "after": "string",
      "before": "string"
    },
    "instants": {
      "after_ms": 0,
      "before_ms": 0
    }
  },
  "sort": "string",
  "group_by": "string",
  "limit": 0,
  "offset": 0
}

The contract has no example values, so example bodies are generated from each schema: every field is shown with a placeholder of its type.

Used by

Generated from contract version 1. Last updated .

Privacy choices

Choose which optional tools Koru may use on this site. Your choice is saved in a cookie in this browser for 12 months. Privacy policy

Privacy choices

Keep you signed in, protect forms and remember your language and this choice.

Always on

PostHog and Google Analytics 4 measure page views and actions such as downloads, using cookies or local storage.

PostHog records how pages are used, with form inputs masked and private pages excluded. Needs Analytics.

Ahrefs Web Analytics measures visits and where they come from, and Google Ads measures whether our ads led to a visit or download.