Databases and fields
The workspace field registry, databases and their bound fields, saved views, and row memberships.
34 operations. Every path is relative to the instance origin; every response body is JSON unless stated. The endpoint descriptions below come straight from the server’s own route table. See API for authentication, errors and pagination.
GET /api/v1/workspaces/{workspaceId}/fields
List a workspace's registry fields.
listFields · token scope: content:read
Path parameters
workspaceId· string (uuid) — required
Query parameters
cursor· string — length 1–∞limit· integer — 1–100
Response 200 — application/json
items· object[] — requiredid· string (uuid) — requiredworkspaceId· string (uuid) — requiredkey· string — required, length 1–100name· string — requiredtype·"text"|"number"|"select"|"multi_select"|"date"|"person"|"checkbox"|"url"|"relation"|"formula"— requiredconfig· object — requiredbuiltinKey·"tags"|"summary"|"page_type"|"status"|"related"| null — requiredcreatedAt· string (date-time) — required
nextCursor· string | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
POST /api/v1/workspaces/{workspaceId}/fields
Create a workspace field (typed registry column).
createField · token scope: content:write
Path parameters
workspaceId· string (uuid) — required
Request body — application/json, required
key· string — length 1–100name· string — required, length 1–200type·"text"|"number"|"select"|"multi_select"|"date"|"person"|"checkbox"|"url"|"relation"|"formula"— requiredconfig· objectscope· objecttype·"workspace"|"collection"|"database"— requiredid· string (uuid)
Response 200 — application/json
id· string (uuid) — requiredworkspaceId· string (uuid) — requiredkey· string — required, length 1–100name· string — requiredtype·"text"|"number"|"select"|"multi_select"|"date"|"person"|"checkbox"|"url"|"relation"|"formula"— requiredconfig· object — requiredbuiltinKey·"tags"|"summary"|"page_type"|"status"|"related"| null — requiredcreatedAt· string (date-time) — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
GET /api/v1/workspaces/{workspaceId}/fields/{fieldId}
Get a single field.
getField · token scope: content:read
Path parameters
workspaceId· string (uuid) — requiredfieldId· string (uuid) — required
Response 200 — application/json
id· string (uuid) — requiredworkspaceId· string (uuid) — requiredkey· string — required, length 1–100name· string — requiredtype·"text"|"number"|"select"|"multi_select"|"date"|"person"|"checkbox"|"url"|"relation"|"formula"— requiredconfig· object — requiredbuiltinKey·"tags"|"summary"|"page_type"|"status"|"related"| null — requiredcreatedAt· string (date-time) — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
PATCH /api/v1/workspaces/{workspaceId}/fields/{fieldId}
Update a field name and/or config (type changes go through retype).
updateField · token scope: content:write
Path parameters
workspaceId· string (uuid) — requiredfieldId· string (uuid) — required
Request body — application/json, required
name· string — length 1–200config· object
Response 200 — application/json
id· string (uuid) — requiredworkspaceId· string (uuid) — requiredkey· string — required, length 1–100name· string — requiredtype·"text"|"number"|"select"|"multi_select"|"date"|"person"|"checkbox"|"url"|"relation"|"formula"— requiredconfig· object — requiredbuiltinKey·"tags"|"summary"|"page_type"|"status"|"related"| null — requiredcreatedAt· string (date-time) — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
DELETE /api/v1/workspaces/{workspaceId}/fields/{fieldId}
Delete a field from the registry (unbinds it everywhere and strips its page values). Returns the deleted field.
deleteField · token scope: content:write
Path parameters
workspaceId· string (uuid) — requiredfieldId· string (uuid) — required
Response 200 — application/json
id· string (uuid) — requiredworkspaceId· string (uuid) — requiredkey· string — required, length 1–100name· string — requiredtype·"text"|"number"|"select"|"multi_select"|"date"|"person"|"checkbox"|"url"|"relation"|"formula"— requiredconfig· object — requiredbuiltinKey·"tags"|"summary"|"page_type"|"status"|"related"| null — requiredcreatedAt· string (date-time) — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
POST /api/v1/workspaces/{workspaceId}/fields/{fieldId}/retype
Change a field type, converting stored page values (bounded/chunked). Illegal targets (to/from relation or formula) are rejected (400).
retypeField · token scope: content:write
Path parameters
workspaceId· string (uuid) — requiredfieldId· string (uuid) — required
Request body — application/json, required
type·"text"|"number"|"select"|"multi_select"|"date"|"person"|"checkbox"|"url"|"relation"|"formula"— requiredconfig· object
Response 200 — application/json
id· string (uuid) — requiredworkspaceId· string (uuid) — requiredkey· string — required, length 1–100name· string — requiredtype·"text"|"number"|"select"|"multi_select"|"date"|"person"|"checkbox"|"url"|"relation"|"formula"— requiredconfig· object — requiredbuiltinKey·"tags"|"summary"|"page_type"|"status"|"related"| null — requiredcreatedAt· string (date-time) — requiredconvertedValues· integer — required, 0–9007199254740991droppedValues· integer — required, 0–9007199254740991
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
POST /api/v1/workspaces/{workspaceId}/fields/{fieldId}/merge
Merge this field into a target field: move page values, rebind databases, then delete this (source) field. Returns the target field.
mergeField · token scope: content:write
Path parameters
workspaceId· string (uuid) — requiredfieldId· string (uuid) — required
Request body — application/json, required
targetFieldId· string (uuid) — required
Response 200 — application/json
id· string (uuid) — requiredworkspaceId· string (uuid) — requiredkey· string — required, length 1–100name· string — requiredtype·"text"|"number"|"select"|"multi_select"|"date"|"person"|"checkbox"|"url"|"relation"|"formula"— requiredconfig· object — requiredbuiltinKey·"tags"|"summary"|"page_type"|"status"|"related"| null — requiredcreatedAt· string (date-time) — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
GET /api/v1/workspaces/{workspaceId}/fields/{fieldId}/usage
Report how widely a field is used (databases bound, pages carrying it).
getFieldUsage · token scope: content:read
Path parameters
workspaceId· string (uuid) — requiredfieldId· string (uuid) — required
Response 200 — application/json
fieldId· string (uuid) — requireddatabaseCount· integer — required, 0–9007199254740991pageCount· integer — required, 0–9007199254740991
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
POST /api/v1/workspaces/{workspaceId}/fields/{fieldId}/options
Add one option to an open vocabulary (tags); rejected on a closed select.
addFieldOption · token scope: content:write
Path parameters
workspaceId· string (uuid) — requiredfieldId· string (uuid) — required
Request body — application/json, required
label· string — required, length 1–200color· string
Response 200 — application/json
id· string (uuid) — requiredworkspaceId· string (uuid) — requiredkey· string — required, length 1–100name· string — requiredtype·"text"|"number"|"select"|"multi_select"|"date"|"person"|"checkbox"|"url"|"relation"|"formula"— requiredconfig· object — requiredbuiltinKey·"tags"|"summary"|"page_type"|"status"|"related"| null — requiredcreatedAt· string (date-time) — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
GET /api/v1/workspaces/{workspaceId}/databases
List databases in a workspace (optionally filtered to a collection).
listDatabases · token scope: content:read
Path parameters
workspaceId· string (uuid) — required
Query parameters
cursor· string — length 1–∞limit· integer — 1–100collectionId· string (uuid)
Response 200 — application/json
items· object[] — requiredid· string (uuid) — requiredworkspaceId· string (uuid) — requiredcollectionId· string (uuid) — requiredparentPageId· string (uuid) | null — requiredposition· string — requiredname· string — requiredicon· string | null — requiredcreatedBy· string (uuid) | null — requiredupdatedBy· string (uuid) | null — requiredcreatedAt· string (date-time) — requiredupdatedAt· string (date-time) — requireddeletedAt· string (date-time) | null — required
nextCursor· string | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
POST /api/v1/workspaces/{workspaceId}/databases
Create a database in a collection, optionally under a parent page.
createDatabase · token scope: content:write
Path parameters
workspaceId· string (uuid) — required
Request body — application/json, required
collectionId· string (uuid) — requiredparentPageId· string (uuid)name· string — required, length 1–200icon· string — length 0–2048
Response 200 — application/json
id· string (uuid) — requiredworkspaceId· string (uuid) — requiredcollectionId· string (uuid) — requiredparentPageId· string (uuid) | null — requiredposition· string — requiredname· string — requiredicon· string | null — requiredcreatedBy· string (uuid) | null — requiredupdatedBy· string (uuid) | null — requiredcreatedAt· string (date-time) — requiredupdatedAt· string (date-time) — requireddeletedAt· string (date-time) | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
GET /api/v1/workspaces/{workspaceId}/databases/{databaseId}
Get a single database.
getDatabase · token scope: content:read
Path parameters
workspaceId· string (uuid) — requireddatabaseId· string (uuid) — required
Response 200 — application/json
id· string (uuid) — requiredworkspaceId· string (uuid) — requiredcollectionId· string (uuid) — requiredparentPageId· string (uuid) | null — requiredposition· string — requiredname· string — requiredicon· string | null — requiredcreatedBy· string (uuid) | null — requiredupdatedBy· string (uuid) | null — requiredcreatedAt· string (date-time) — requiredupdatedAt· string (date-time) — requireddeletedAt· string (date-time) | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
PATCH /api/v1/workspaces/{workspaceId}/databases/{databaseId}
Update a database name and/or icon.
updateDatabase · token scope: content:write
Path parameters
workspaceId· string (uuid) — requireddatabaseId· string (uuid) — required
Request body — application/json, required
name· string — length 1–200icon· string | null
Response 200 — application/json
id· string (uuid) — requiredworkspaceId· string (uuid) — requiredcollectionId· string (uuid) — requiredparentPageId· string (uuid) | null — requiredposition· string — requiredname· string — requiredicon· string | null — requiredcreatedBy· string (uuid) | null — requiredupdatedBy· string (uuid) | null — requiredcreatedAt· string (date-time) — requiredupdatedAt· string (date-time) — requireddeletedAt· string (date-time) | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
POST /api/v1/workspaces/{workspaceId}/databases/{databaseId}/trash
Soft-delete a database (move to trash). Deep: the pages HOMED in it are trashed with it. Row memberships are kept, not dropped, so restoring is lossless; they are removed only by a permanent delete.
trashDatabase · token scope: content:write
Path parameters
workspaceId· string (uuid) — requireddatabaseId· string (uuid) — required
Response 200 — application/json
id· string (uuid) — requiredworkspaceId· string (uuid) — requiredcollectionId· string (uuid) — requiredparentPageId· string (uuid) | null — requiredposition· string — requiredname· string — requiredicon· string | null — requiredcreatedBy· string (uuid) | null — requiredupdatedBy· string (uuid) | null — requiredcreatedAt· string (date-time) — requiredupdatedAt· string (date-time) — requireddeletedAt· string (date-time) | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
POST /api/v1/workspaces/{workspaceId}/databases/{databaseId}/restore
Restore a database from the trash, together with exactly the pages that were trashed in the same batch (pages already in the trash beforehand stay there). Row memberships survived the trash, so the restored database shows its rows again. Restoring under a still-trashed parent re-parents the database to the collection root, mirroring restorePage — and, mirroring it again, refuses with 400 when the asking product never shows a database there (ADR-0030): restore the container it was in first, and the database comes home to it.
restoreDatabase · token scope: content:write
Path parameters
workspaceId· string (uuid) — requireddatabaseId· string (uuid) — required
Response 200 — application/json
id· string (uuid) — requiredworkspaceId· string (uuid) — requiredcollectionId· string (uuid) — requiredparentPageId· string (uuid) | null — requiredposition· string — requiredname· string — requiredicon· string | null — requiredcreatedBy· string (uuid) | null — requiredupdatedBy· string (uuid) | null — requiredcreatedAt· string (date-time) — requiredupdatedAt· string (date-time) — requireddeletedAt· string (date-time) | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
DELETE /api/v1/workspaces/{workspaceId}/databases/{databaseId}/permanent
Permanently delete a TRASHED database and everything below it — irreversible. Refuses with 409 when the database is not in the trash. Same cascade as deletePagePermanently, plus the database-specific rows: every membership (db_row) of the database, its column bindings (database_field), and every view targeting it. Returns what was deleted.
deleteDatabasePermanently · token scope: content:write
Path parameters
workspaceId· string (uuid) — requireddatabaseId· string (uuid) — required
Response 200 — application/json
roots· integer — required, 0–9007199254740991pages· integer — required, 0–9007199254740991databases· integer — required, 0–9007199254740991views· integer — required, 0–9007199254740991blocks· integer — required, 0–9007199254740991
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
GET /api/v1/workspaces/{workspaceId}/databases/{databaseId}/fields
List a database's field bindings, in column order.
listDatabaseFields · token scope: content:read
Path parameters
workspaceId· string (uuid) — requireddatabaseId· string (uuid) — required
Query parameters
cursor· string — length 1–∞limit· integer — 1–100
Response 200 — application/json
items· object[] — requiredworkspaceId· string (uuid) — requiredscopeType·"workspace"|"collection"|"database"— requiredscopeId· string (uuid) — requiredfieldId· string (uuid) — requiredposition· string — requiredrequired· boolean — requireddefaultValue· object | null — required
nextCursor· string | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
POST /api/v1/workspaces/{workspaceId}/databases/{databaseId}/fields
Bind a registry field into a database as a column.
bindField · token scope: content:write
Path parameters
workspaceId· string (uuid) — requireddatabaseId· string (uuid) — required
Request body — application/json, required
fieldId· string (uuid) — requiredrequired· booleandefaultValue· object | nullbeforeId· string (uuid)afterId· string (uuid)
Response 200 — application/json
workspaceId· string (uuid) — requiredscopeType·"workspace"|"collection"|"database"— requiredscopeId· string (uuid) — requiredfieldId· string (uuid) — requiredposition· string — requiredrequired· boolean — requireddefaultValue· object | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
PATCH /api/v1/workspaces/{workspaceId}/databases/{databaseId}/fields/{fieldId}
Update a binding: required, default value, and/or column position.
updateBinding · token scope: content:write
Path parameters
workspaceId· string (uuid) — requireddatabaseId· string (uuid) — requiredfieldId· string (uuid) — required
Request body — application/json, required
required· booleandefaultValue· object | nullbeforeId· string (uuid)afterId· string (uuid)
Response 200 — application/json
workspaceId· string (uuid) — requiredscopeType·"workspace"|"collection"|"database"— requiredscopeId· string (uuid) — requiredfieldId· string (uuid) — requiredposition· string — requiredrequired· boolean — requireddefaultValue· object | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
DELETE /api/v1/workspaces/{workspaceId}/databases/{databaseId}/fields/{fieldId}
Remove a field binding from a database (values on pages are kept).
unbindField · token scope: content:write
Path parameters
workspaceId· string (uuid) — requireddatabaseId· string (uuid) — requiredfieldId· string (uuid) — required
Response 200 — application/json
workspaceId· string (uuid) — requiredscopeType·"workspace"|"collection"|"database"— requiredscopeId· string (uuid) — requiredfieldId· string (uuid) — requiredposition· string — requiredrequired· boolean — requireddefaultValue· object | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
GET /api/v1/workspaces/{workspaceId}/field-bindings
List the fields offered on every page of the workspace.
listWorkspaceBindings · token scope: content:read
Path parameters
workspaceId· string (uuid) — required
Query parameters
cursor· string — length 1–∞limit· integer — 1–100
Response 200 — application/json
items· object[] — requiredworkspaceId· string (uuid) — requiredscopeType·"workspace"|"collection"|"database"— requiredscopeId· string (uuid) — requiredfieldId· string (uuid) — requiredposition· string — requiredrequired· boolean — requireddefaultValue· object | null — required
nextCursor· string | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
POST /api/v1/workspaces/{workspaceId}/field-bindings
Offer a registry field on every page of the workspace.
bindWorkspaceField · token scope: content:write
Path parameters
workspaceId· string (uuid) — required
Request body — application/json, required
fieldId· string (uuid) — requiredrequired· booleandefaultValue· object | nullbeforeId· string (uuid)afterId· string (uuid)
Response 200 — application/json
workspaceId· string (uuid) — requiredscopeType·"workspace"|"collection"|"database"— requiredscopeId· string (uuid) — requiredfieldId· string (uuid) — requiredposition· string — requiredrequired· boolean — requireddefaultValue· object | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
PATCH /api/v1/workspaces/{workspaceId}/field-bindings/{fieldId}
Reorder a workspace binding among the workspace's fields.
updateWorkspaceBinding · token scope: content:write
Path parameters
workspaceId· string (uuid) — requiredfieldId· string (uuid) — required
Request body — application/json, required
required· booleandefaultValue· object | nullbeforeId· string (uuid)afterId· string (uuid)
Response 200 — application/json
workspaceId· string (uuid) — requiredscopeType·"workspace"|"collection"|"database"— requiredscopeId· string (uuid) — requiredfieldId· string (uuid) — requiredposition· string — requiredrequired· boolean — requireddefaultValue· object | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
DELETE /api/v1/workspaces/{workspaceId}/field-bindings/{fieldId}
Stop offering a field workspace-wide (values already on pages are kept).
unbindWorkspaceField · token scope: content:write
Path parameters
workspaceId· string (uuid) — requiredfieldId· string (uuid) — required
Response 200 — application/json
workspaceId· string (uuid) — requiredscopeType·"workspace"|"collection"|"database"— requiredscopeId· string (uuid) — requiredfieldId· string (uuid) — requiredposition· string — requiredrequired· boolean — requireddefaultValue· object | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
GET /api/v1/workspaces/{workspaceId}/views
List views in a workspace (optionally filtered to one database).
listViews · token scope: content:read
Path parameters
workspaceId· string (uuid) — required
Query parameters
cursor· string — length 1–∞limit· integer — 1–100targetDatabaseId· string (uuid)
Response 200 — application/json
items· object[] — requiredid· string (uuid) — requiredworkspaceId· string (uuid) — requiredcollectionId· string (uuid) — requiredparentPageId· string (uuid) | null — requiredposition· string — requiredtargetDatabaseId· string (uuid) — requiredlayout·"table"|"list"— requiredfilters· object[] — requiredfieldId· string (uuid) — requiredop·"eq"|"ne"|"contains"|"is_empty"|"is_not_empty"— requiredvalue· any
match·"all"|"any"sorts· object[] — requiredfieldId· string (uuid) — requireddirection·"asc"|"desc"— required
createdAt· string (date-time) — requiredupdatedAt· string (date-time) — requireddeletedAt· string (date-time) | null — required
nextCursor· string | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
POST /api/v1/workspaces/{workspaceId}/views
Create a saved view (table or list) over a database.
createView · token scope: content:write
Path parameters
workspaceId· string (uuid) — required
Request body — application/json, required
collectionId· string (uuid) — requiredparentPageId· string (uuid)targetDatabaseId· string (uuid) — requiredlayout·"table"|"list"— requiredfilters· object[]fieldId· string (uuid) — requiredop·"eq"|"ne"|"contains"|"is_empty"|"is_not_empty"— requiredvalue· any
match·"all"|"any"sorts· object[]fieldId· string (uuid) — requireddirection·"asc"|"desc"— required
Response 200 — application/json
id· string (uuid) — requiredworkspaceId· string (uuid) — requiredcollectionId· string (uuid) — requiredparentPageId· string (uuid) | null — requiredposition· string — requiredtargetDatabaseId· string (uuid) — requiredlayout·"table"|"list"— requiredfilters· object[] — requiredfieldId· string (uuid) — requiredop·"eq"|"ne"|"contains"|"is_empty"|"is_not_empty"— requiredvalue· any
match·"all"|"any"sorts· object[] — requiredfieldId· string (uuid) — requireddirection·"asc"|"desc"— required
createdAt· string (date-time) — requiredupdatedAt· string (date-time) — requireddeletedAt· string (date-time) | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
GET /api/v1/workspaces/{workspaceId}/views/{viewId}
Get a single view.
getView · token scope: content:read
Path parameters
workspaceId· string (uuid) — requiredviewId· string (uuid) — required
Response 200 — application/json
id· string (uuid) — requiredworkspaceId· string (uuid) — requiredcollectionId· string (uuid) — requiredparentPageId· string (uuid) | null — requiredposition· string — requiredtargetDatabaseId· string (uuid) — requiredlayout·"table"|"list"— requiredfilters· object[] — requiredfieldId· string (uuid) — requiredop·"eq"|"ne"|"contains"|"is_empty"|"is_not_empty"— requiredvalue· any
match·"all"|"any"sorts· object[] — requiredfieldId· string (uuid) — requireddirection·"asc"|"desc"— required
createdAt· string (date-time) — requiredupdatedAt· string (date-time) — requireddeletedAt· string (date-time) | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
PATCH /api/v1/workspaces/{workspaceId}/views/{viewId}
Update a view layout, filters, and/or sorts.
updateView · token scope: content:write
Path parameters
workspaceId· string (uuid) — requiredviewId· string (uuid) — required
Request body — application/json, required
layout·"table"|"list"filters· object[]fieldId· string (uuid) — requiredop·"eq"|"ne"|"contains"|"is_empty"|"is_not_empty"— requiredvalue· any
match·"all"|"any"sorts· object[]fieldId· string (uuid) — requireddirection·"asc"|"desc"— required
Response 200 — application/json
id· string (uuid) — requiredworkspaceId· string (uuid) — requiredcollectionId· string (uuid) — requiredparentPageId· string (uuid) | null — requiredposition· string — requiredtargetDatabaseId· string (uuid) — requiredlayout·"table"|"list"— requiredfilters· object[] — requiredfieldId· string (uuid) — requiredop·"eq"|"ne"|"contains"|"is_empty"|"is_not_empty"— requiredvalue· any
match·"all"|"any"sorts· object[] — requiredfieldId· string (uuid) — requireddirection·"asc"|"desc"— required
createdAt· string (date-time) — requiredupdatedAt· string (date-time) — requireddeletedAt· string (date-time) | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
POST /api/v1/workspaces/{workspaceId}/views/{viewId}/trash
Soft-delete a view (move to trash).
trashView · token scope: content:write
Path parameters
workspaceId· string (uuid) — requiredviewId· string (uuid) — required
Response 200 — application/json
id· string (uuid) — requiredworkspaceId· string (uuid) — requiredcollectionId· string (uuid) — requiredparentPageId· string (uuid) | null — requiredposition· string — requiredtargetDatabaseId· string (uuid) — requiredlayout·"table"|"list"— requiredfilters· object[] — requiredfieldId· string (uuid) — requiredop·"eq"|"ne"|"contains"|"is_empty"|"is_not_empty"— requiredvalue· any
match·"all"|"any"sorts· object[] — requiredfieldId· string (uuid) — requireddirection·"asc"|"desc"— required
createdAt· string (date-time) — requiredupdatedAt· string (date-time) — requireddeletedAt· string (date-time) | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
POST /api/v1/workspaces/{workspaceId}/databases/{databaseId}/rows/query
The main read path: run a view (filters/sorts) over a database and page through the rows with a composite keyset cursor. Cells are projected at read time from page props + relation_link + formula evaluation.
queryDatabaseRows · token scope: content:write
Path parameters
workspaceId· string (uuid) — requireddatabaseId· string (uuid) — required
Request body — application/json, required
filters· object[]fieldId· string (uuid) — requiredop·"eq"|"ne"|"contains"|"is_empty"|"is_not_empty"— requiredvalue· any
match·"all"|"any"sorts· object[]fieldId· string (uuid) — requireddirection·"asc"|"desc"— required
cursor· string — length 1–∞limit· integer — 1–100
Response 200 — application/json
items· object[] — requiredpageId· string (uuid) — requiredworkspaceId· string (uuid) — requireddatabaseId· string (uuid) — requiredposition· string — requiredtitle· string — requiredicon· string | null — requiredcells· object — requiredcreatedAt· string (date-time) — required
nextCursor· string | null — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
POST /api/v1/workspaces/{workspaceId}/databases/{databaseId}/rows
Create a new page as a row of this database, seeding its props from the supplied cells and the bindings' default values (D2 materialize-at-create).
createRow · token scope: content:write
Path parameters
workspaceId· string (uuid) — requireddatabaseId· string (uuid) — required
Request body — application/json, required
title· string — length 0–1000icon· string — length 0–2048cells· objectbeforeId· string (uuid)afterId· string (uuid)
Response 200 — application/json
pageId· string (uuid) — requiredworkspaceId· string (uuid) — requireddatabaseId· string (uuid) — requiredposition· string — requiredtitle· string — requiredicon· string | null — requiredcells· object — requiredcreatedAt· string (date-time) — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
POST /api/v1/workspaces/{workspaceId}/databases/{databaseId}/rows/add
Add an existing page to this database as a row (membership).
addExistingPage · token scope: content:write
Path parameters
workspaceId· string (uuid) — requireddatabaseId· string (uuid) — required
Request body — application/json, required
pageId· string (uuid) — requiredcells· objectbeforeId· string (uuid)afterId· string (uuid)
Response 200 — application/json
pageId· string (uuid) — requiredworkspaceId· string (uuid) — requireddatabaseId· string (uuid) — requiredposition· string — requiredtitle· string — requiredicon· string | null — requiredcells· object — requiredcreatedAt· string (date-time) — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
POST /api/v1/workspaces/{workspaceId}/databases/{databaseId}/rows/{pageId}/move
Reorder a row within its database membership.
moveRow · token scope: content:write
Path parameters
workspaceId· string (uuid) — requireddatabaseId· string (uuid) — requiredpageId· string (uuid) — required
Request body — application/json, required
beforeId· string (uuid)afterId· string (uuid)
Response 200 — application/json
pageId· string (uuid) — requiredworkspaceId· string (uuid) — requireddatabaseId· string (uuid) — requiredposition· string — requiredtitle· string — requiredicon· string | null — requiredcells· object — requiredcreatedAt· string (date-time) — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64
DELETE /api/v1/workspaces/{workspaceId}/databases/{databaseId}/rows/{pageId}
Remove a page from this database (drops the membership; the page is kept). 409 with a needs-new-home code when this is the page's home database — reparent it via movePage first, or name a newHomeBoardId on removeBoardCard when the database backs a board.
removeRow · token scope: content:write
Path parameters
workspaceId· string (uuid) — requireddatabaseId· string (uuid) — requiredpageId· string (uuid) — required
Response 200 — application/json
pageId· string (uuid) — requiredworkspaceId· string (uuid) — requireddatabaseId· string (uuid) — requiredposition· string — requiredtitle· string — requiredicon· string | null — requiredcells· object — requiredcreatedAt· string (date-time) — required
Response default — application/json
error· object — requiredcode·"bad_request"|"validation_failed"|"unauthorized"|"forbidden"|"not_found"|"conflict"|"rate_limited"|"internal"— requiredmessage· string — requiredreason· string — length 1–64