Skip to main content
Structured key-value data stored alongside a page, not inside it. Changing a key never creates a page revision. It updates one row and writes one audit event.

What you get

  • Values are any JSON: 0.92, true, ["a","b"], {"due":"2026-08-01"}.
  • Merge-patch writes: send only the keys you’re changing.
    • set upserts (JSON null deletes)
    • append extends arrays atomically
    • appendUnique skips duplicates so re-run agents are idempotent
  • Per-key audit trail: who set what, when, with previous values.
  • Queryable: eq, neq, exists, missing, gt/gte/lt/lte (numbers and ISO-date strings), contains (array containment), and in / not-in (the value is any, or none, of a list of candidates). Filters are AND-ed together, with orderBy ranking.
  • Discoverable: GET /search/metadata/keys lists the key namespace with usage counts so writers converge on existing keys, and GET /search/metadata/values lists the values in use for one key.

Patch example

Query example

Keeping keys consistent

Metadata is free-form by default, which is what makes it useful to an agent that discovers a need mid-run. When a set of pages should agree on a shape, promote it to a record type: the same store, with a declared schema and validation on the way in.

Next: Record types

Schemas over metadata, so a space of pages is also a queryable dataset.