Dashboards
Boards that put a site's live state on a screen.
Base path /api/v1/dashboards on https://trydozer.com. Authenticate with Authorization: Bearer $DASH_API_KEY and name the project with the Project-ID header. Writes are validated in declared mode; an operation this resource does not declare answers 405 operation_not_supported.
List dashboards
GET /api/v1/dashboards
curl "https://trydozer.com/api/v1/dashboards?status=active" \
-H "Authorization: Bearer $DASH_API_KEY" \
-H "Project-ID: pr_northpit"Which dashboards are live right now?data_query {
"collection": "dashboards",
"where": {
"status": "active"
}
}Returns a paginated list of dashboard objects, newest first.
{
"object": "list",
"data": [
{
"object": "dashboard",
"id": "obj_123",
"name": "Washplants",
"status": "active",
"created_at": "2026-07-25T12:00:00.000Z",
"updated_at": "2026-07-25T12:00:00.000Z"
}
],
"has_more": false,
"next_cursor": null
}Parameters
| Parameter | Type | Kind | Description |
|---|---|---|---|
status | string | filter | Whether the dashboard is live on screens or parked. |
location | string | filter | Pit or yard the board covers. |
q | string | search | Free-text search across name, site_name. |
sort | string | sort | One of updated_at, name; prefix with - to reverse. |
limit | number | page | Rows to return, 1–100. Defaults to 20. |
cursor | string | page | next_cursor from the previous page. |
Retrieve a dashboard
GET /api/v1/dashboards/a60h-12
curl "https://trydozer.com/api/v1/dashboards/a60h-12" \
-H "Authorization: Bearer $DASH_API_KEY" \
-H "Project-ID: pr_northpit"Show me the Washplants boarddata_get {
"collection": "dashboards",
"object_id": "a60h-12"
}Returns the dashboard object.
{
"object": "dashboard",
"id": "obj_123",
"name": "Washplants",
"status": "active",
"created_at": "2026-07-25T12:00:00.000Z",
"updated_at": "2026-07-25T12:00:00.000Z"
}Parameters
| Parameter | Type | Kind | Description |
|---|---|---|---|
id | string | path | The dashboard's id or slug. |
Create a dashboard
POST /api/v1/dashboards
curl -X POST "https://trydozer.com/api/v1/dashboards" \
-H "Authorization: Bearer $DASH_API_KEY" \
-H "Project-ID: pr_northpit" \
-H "Content-Type: application/json" \
-d '{"name":"name","status":"status","site_name":"site name"}'Create a new dashboarddata_set {
"collection": "dashboards",
"object_id": "a60h-12",
"data": {
"name": "name",
"status": "status",
"site_name": "site name"
}
}Returns the dashboard object.
{
"object": "dashboard",
"id": "obj_123",
"name": "Washplants",
"status": "active",
"created_at": "2026-07-25T12:00:00.000Z",
"updated_at": "2026-07-25T12:00:00.000Z"
}Parameters
| Field | Type | Required | Description |
|---|---|---|---|
name | string | no | Name of the dashboard, shown as its heading on the TV. |
status | string | no | Whether the dashboard is live on screens or parked. |
site_name | string | no | Site this board is about, as the crew names it (e.g. Washplants B). |
location | string | no | Pit or yard the board covers. |
time_zone | string | no | IANA time zone the board renders its clocks and ages in. |
theme | string | no | dark or light. Anything else is read as dark. |
layout | string | no | Which TV arrangement the board renders in: auto, primary_tablet, summary_grid, or washplant_split. |
refresh_interval_seconds | number | no | How often the TV re-reads its data, in seconds. Floored at 5. |
linked_equipment | string | no | Machine this board is pinned to, when it is about one. |
settings | object | no | Board-level display options. |
widgets | array | no | The tiles on the board. Each binds to ONE data object (source.collection + source.object_id) and reads its values off that object — see the TV widget contract in agents/dozer/lib/tv-widget-contract.ts (carried verbatim by the setup skill). |
Update a dashboard
PATCH /api/v1/dashboards/a60h-12
curl -X PATCH "https://trydozer.com/api/v1/dashboards/a60h-12" \
-H "Authorization: Bearer $DASH_API_KEY" \
-H "Project-ID: pr_northpit" \
-H "Content-Type: application/json" \
-d '{"name":"name","status":"status","site_name":"site name"}'Update the dashboard {id}data_set {
"collection": "dashboards",
"object_id": "a60h-12",
"data": {
"name": "name",
"status": "status",
"site_name": "site name"
}
}Returns the dashboard object.
{
"object": "dashboard",
"id": "obj_123",
"name": "Washplants",
"status": "active",
"created_at": "2026-07-25T12:00:00.000Z",
"updated_at": "2026-07-25T12:00:00.000Z"
}Parameters
| Field | Type | Required | Description |
|---|---|---|---|
name | string | no | Name of the dashboard, shown as its heading on the TV. |
status | string | no | Whether the dashboard is live on screens or parked. |
site_name | string | no | Site this board is about, as the crew names it (e.g. Washplants B). |
location | string | no | Pit or yard the board covers. |
time_zone | string | no | IANA time zone the board renders its clocks and ages in. |
theme | string | no | dark or light. Anything else is read as dark. |
layout | string | no | Which TV arrangement the board renders in: auto, primary_tablet, summary_grid, or washplant_split. |
refresh_interval_seconds | number | no | How often the TV re-reads its data, in seconds. Floored at 5. |
linked_equipment | string | no | Machine this board is pinned to, when it is about one. |
settings | object | no | Board-level display options. |
widgets | array | no | The tiles on the board. Each binds to ONE data object (source.collection + source.object_id) and reads its values off that object — see the TV widget contract in agents/dozer/lib/tv-widget-contract.ts (carried verbatim by the setup skill). |
Delete a dashboard
DELETE /api/v1/dashboards/a60h-12
curl -X DELETE "https://trydozer.com/api/v1/dashboards/a60h-12" \
-H "Authorization: Bearer $DASH_API_KEY" \
-H "Project-ID: pr_northpit"Delete the dashboard {id}data_delete {
"collection": "dashboards",
"object_id": "a60h-12"
}Returns the deleted dashboard object with deleted: true.
{
"object": "dashboard",
"id": "obj_123",
"deleted": true
}Parameters
| Parameter | Type | Kind | Description |
|---|---|---|---|
id | string | path | The dashboard's id or slug. |
Append an event to a dashboard
POST /api/v1/dashboards/{id}/events
curl -X POST "https://trydozer.com/api/v1/dashboards/a60h-12/events" \
-H "Authorization: Bearer $DASH_API_KEY" \
-H "Project-ID: pr_northpit" \
-H "Content-Type: application/json" \
-d '{"event":"Noted by the operator","context":{"source":"api"}}'Add a note to the dashboard {id}data_event {
"collection": "dashboards",
"object_id": "a60h-12",
"event": "Noted by the operator"
}Returns the appended event object.
{
"object": "event",
"id": "evt_123",
"event": "Noted by the operator"
}Parameters
| Field | Type | Required | Description |
|---|---|---|---|
event | string | yes | The human-readable timeline entry. |
context | object | no | Provenance — source, integration, worker_run_id, … |
What comes back (read-only)
Every dashboard carries the envelope below. The fields under it are computed or stamped by the platform — they are returned, never sent.
| Field | Type | Description |
|---|---|---|
object | string | Always dashboard. |
id | string | Stable object id. Also accepted in place of slug on any path. |
slug | string | URL-safe name, unique within the collection. |
created_at | string | ISO-8601 timestamp of the first write. |
updated_at | string | ISO-8601 timestamp of the most recent write. The cursor sorts on this. |
last_live_data_at | string | When data behind this board last arrived (ISO 8601). Stamped by the telemetry path. |
share | object | Public-share state for the board — whether a scoped TV share link exists. Owned by the share-token flow, not set on a board write. |
Errors
Failures use { error: { type, code, message, param } }. The full code table is generated at Error Codes.