/core/custom-data; see Authentication for tokens.
Scopes: agents:read to read, agents:manage to write, custom_data:manage to author stored queries.
Tables
List
Get one
live_rows, tombstoned_rows and last_changed_at.
Create
string, number, integer, boolean), an optional format of date or date-time on strings, and exactly one property marked "x-key": true, which must also be in required.
409 if the name is taken.
Update the schema
400 if you try.
Delete
Rows
Query
eq, neq, gt, gte, lt, lte, in, contains, starts_with. Filters address declared properties only, and comparisons use the declared types — a price compares as a number, a date as a date.
A filter value that can’t be read as its column’s type matches nothing rather than failing the request, so one unusable value doesn’t discard your other filters.
limit defaults to 20, maximum 500.
Get one row
found is false rather than a 404, so absent and deleted are indistinguishable to the caller.
Replace everything
rows are deleted. Returns counts:
rows are tombstoned, not erased: send a correct snapshot and they return.
Add or update
Delete rows
Claim a row
patch, returns it. Concurrent callers never receive the same row. { "found": false } when nothing is available — a 200, not an error. patch may only set declared properties and may not touch the row key.
Stored queries
PUT, dry-run, enabled, DELETE) needs custom_data:manage. Listing and running need only the table’s read scope.
Saving:
status: "broken" and a validation_error. Only validated queries can be enabled.
Running:
Tool schema
tools.
Errors
503 is worth handling separately from 500: the request was well formed and the same request may succeed on retry.
