Render a page against a record for printing
Resolves the page or note surface and the record named by `recordId` independently, then returns a print-ready render of the page with the record's values substituted, laid out for the requested `preset` (`a4` or `80mm`, default `a4`). The caller must have read access to both the surface and the record; surfaces of any other kind are rejected as a validation error.
apiKeyAuthorizationBearer <snoze_sk_…>Workspace API key created in Workspace settings → API keys. Scopes on the key bound what it can read and write.
workspaceId*stringsurfaceId*stringrecordId*stringpreset?|nullSuccess
application/json- response
data*curl -X GET 'https://api.snoze.dev/v1/workspaces/string/surfaces/string/print?recordId=string'{ "data": { "preset": "80mm", "surface": { "id": "string", "workspaceId": "string", "kind": "page", "title": "string", "icon": "string", "manifest": {}, "createdAt": "string", "updatedAt": "string", "itemId": "string" }, "record": { "id": "1d8a44e0-7c93-4f21-b60a-3e8d2f5a9c14", "workspaceId": "4b81aa0c-6d2f-4b19-9f0e-1a7c3d5e8b02", "databaseId": "9f2c1e7a-3b58-4d0c-8e27-6a1f9d4b3c85", "contentSurfaceId": "string", "title": "Ship the desktop app", "data": { "status": "in_progress", "due": "2026-08-01" }, "relations": {}, "computed": {}, "system": {}, "related": {}, "archived": false, "externalId": "string", "createdByUserId": "string", "updatedByUserId": "string", "createdAt": "2026-07-10T08:00:00.000Z", "updatedAt": "2026-07-14T11:26:02.000Z" }, "blocks": [ { "id": "string", "workspaceId": "string", "surfaceId": "string", "parentBlockId": "string", "kind": "paragraph", "orderKey": "string", "manifest": {}, "layout": { "x": 0, "y": 0, "w": 0, "h": 0, "tab": "string" }, "plainText": "string", "createdAt": "string", "updatedAt": "string" } ] }}List a surface's blocks in document order
Returns a window of the surface's block tree flattened into depth-first document order, together with the workspace version the window was read at. Requires `surfaces:read` on the surface. Paginated: pass `limit` (default 200, maximum 500) and the `cursor` from the previous response; a cursor that does not decode is rejected as a validation error.
Evaluate a dashboard's data widgets as the caller
Runs the dashboard engine over the dashboard's saved data widgets and returns one frame per widget block, keyed by block id, under the dashboard's saved filter defaults, or under `filters` when sent: the caller's filter bar exactly as shown (`period`, `compare`, shared-field `fields` and `params`), with no saved defaults merged in, so an omitted `period` means all time. Sources are read as the caller sees them, so a database they cannot read is withheld from the frames that need it. App sources are read as the caller's own apps are: time entries and shifts from 400 days back, calendar occurrences six months either side of this month and the workspace's newest 100 visible activity events within the plan's history retention; periods outside what was read are withheld rather than undercounted. A widget whose source fails to read is left out of `frames` rather than failing the request. Frames carry no contributing record ids. `inputs` holds, per block, a key identifying the query its frame answers, so a client shows a frame only while its own widget asks the same query; when workspace changes keep landing during evaluation, `frames` is empty and the client evaluates on its own. Results are cached per person, dashboard and filter bar for up to 30 seconds, retired on any workspace change, and served only while the caller's access to the dashboard and every source read is unchanged; evaluations that read the calendar or the activity feed are not cached. For people signed in to Snoze (the web app's first paint): API keys and automations are refused. Read-only; requires `surfaces:read` on the dashboard.