Pages
REST endpoints for pages. Bearer-auth required.
GET /api/pages
List pages.
Query parameters
limit(optional): Page size (1–100, default 100).after(optional): Keyset cursor — return the page after this row (next page).before(optional): Keyset cursor — return the page before this row (prev page).ids(optional): Comma-separated list of IDs. Narrows results to these IDs within the caller's accessible scope (does not bypass access checks).filter(optional): Nested filter expression (<Entity>Filter): AND/OR/NOT + per-field comparison operators + relation traversal. JSON-encoded on the query string.orderBy(optional): Multi-key sort (<Entity>OrderBy[]): array of{ field: direction }applied in order. Directions: asc/desc plus the four explicit nulls variants. JSON-encoded on the query string.workspace_id(optional): Filter pages to this workspace.parent_id(optional): Filter to direct children of this parent page. Omit for all pages in the workspace.kind(optional): Filter by kind:page(tree) ordashboard(flat workspace-home tiles).include_deleted(optional): Soft-deleted page visibility.false(default) — active rows only.true— active plus soft-deleted.only— soft-deleted only (trash view).source(optional): Narrow by source.workspace= this workspace's rows plus those visible via installed integrations;integration= only rows made visible by installed integrations; omit = union.created_by(optional): Shorthand: filter wherecreatedByequals this value.
Response
{
"data": [
{
"id": "<...>",
"workspaceId": "<...>",
"parentId": "<...>",
"title": "<...>",
"slug": "<...>",
"body": "<...>",
"kind": "<...>",
"position": "<...>",
"createdBy": "<...>",
"createdAt": "<...>",
"updatedAt": "<...>"
}
],
"pageInfo": {
"total": "number",
"hasNextPage": "boolean",
"hasPreviousPage": "boolean",
"startCursor": "string",
"endCursor": "string"
}
}POST /api/pages
Create page
Request body
{
"workspaceId": "string",
"title": "string",
"slug?": "string",
"body?": "string",
"parentId?": "string",
"kind?": "any"
}Response
{
"id": "string",
"workspaceId": "string",
"parentId": "string",
"title": "string",
"slug": "string",
"body": "string",
"kind": "page | dashboard",
"position": "integer",
"createdBy": "string",
"createdAt": "string",
"updatedAt": "string"
}GET /api/pages/{id}
Get a page by ID.
Path parameters
id(required): Page to retrieve.
Response
{
"id": "string",
"workspaceId": "string",
"parentId": "string",
"title": "string",
"slug": "string",
"body": "string",
"kind": "page | dashboard",
"position": "integer",
"createdBy": "string",
"createdAt": "string",
"updatedAt": "string"
}PATCH /api/pages/{id}
Update page
Path parameters
id(required): The page's prefixed ID.
Request body
{
"title?": "string",
"slug?": "string",
"body?": "string",
"parentId?": "string"
}Response
{
"id": "string",
"workspaceId": "string",
"parentId": "string",
"title": "string",
"slug": "string",
"body": "string",
"kind": "page | dashboard",
"position": "integer",
"createdBy": "string",
"createdAt": "string",
"updatedAt": "string"
}DELETE /api/pages/{id}
Soft-delete a page.
Path parameters
id(required): Page to soft-delete.
Response
{
"success": "boolean"
}POST /api/pages/{id}/move
Move a page up or down within its siblings
Swaps the page's position with the adjacent sibling within the same (workspace, kind, parent) group. No-op at the edges.
Path parameters
id(required): The page's prefixed ID.
Request body
{
"direction": "up | down"
}Response
{
"id": "string",
"workspaceId": "string",
"parentId": "string",
"title": "string",
"slug": "string",
"body": "string",
"kind": "page | dashboard",
"position": "integer",
"createdBy": "string",
"createdAt": "string",
"updatedAt": "string"
}DELETE /api/pages/{id}/purge
Permanently delete a soft-deleted page.
Path parameters
id(required): Soft-deleted page to permanently delete.
Response
{
"success": "boolean"
}POST /api/pages/{id}/restore
Restore a soft-deleted page.
Path parameters
id(required): Soft-deleted page to restore.
Response
{
"id": "string",
"workspaceId": "string",
"parentId": "string",
"title": "string",
"slug": "string",
"body": "string",
"kind": "page | dashboard",
"position": "integer",
"createdBy": "string",
"createdAt": "string",
"updatedAt": "string"
}POST /api/pages/resolve
Resolve page by slash-separated slug path
Walks a slash-separated slug path (e.g. runbooks/ingest/retry-policy) from the workspace root to the leaf page. Backs the /workspaces/:wsId/pages/$ splat route.
Request body
{
"workspaceId": "string",
"path": "string"
}Response
{
"id": "string",
"workspaceId": "string",
"parentId": "string",
"title": "string",
"slug": "string",
"body": "string",
"kind": "page | dashboard",
"position": "integer",
"createdBy": "string",
"createdAt": "string",
"updatedAt": "string"
}