Dozer logoDozer
Get started
Dozer Docs
Collections

TV Playlists

Rotations of dashboards for an office TV.

Base path /api/v1/playlists 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 tv playlists

GET /api/v1/playlists

curl "https://trydozer.com/api/v1/playlists?status=active" \
  -H "Authorization: Bearer $DASH_API_KEY" \
  -H "Project-ID: pr_northpit"
What is playing on the office TV?
data_query {
  "collection": "playlists",
  "where": {
    "status": "active"
  }
}

Returns a paginated list of playlist objects, newest first.

{
  "object": "list",
  "data": [
    {
      "object": "playlist",
      "id": "obj_123",
      "name": "Little Flake Mine Office Loop",
      "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

ParameterTypeKindDescription
statusstringfilterWhether the playlist is playing on screens or parked.
qstringsearchFree-text search across name.
sortstringsortOne of updated_at, name; prefix with - to reverse.
limitnumberpageRows to return, 1–100. Defaults to 20.
cursorstringpagenext_cursor from the previous page.

Retrieve a playlist

GET /api/v1/playlists/a60h-12

curl "https://trydozer.com/api/v1/playlists/a60h-12" \
  -H "Authorization: Bearer $DASH_API_KEY" \
  -H "Project-ID: pr_northpit"
Show me the office loop
data_get {
  "collection": "playlists",
  "object_id": "a60h-12"
}

Returns the playlist object.

{
  "object": "playlist",
  "id": "obj_123",
  "name": "Little Flake Mine Office Loop",
  "status": "active",
  "created_at": "2026-07-25T12:00:00.000Z",
  "updated_at": "2026-07-25T12:00:00.000Z"
}

Parameters

ParameterTypeKindDescription
idstringpathThe playlist's id or slug.

Create a playlist

POST /api/v1/playlists

curl -X POST "https://trydozer.com/api/v1/playlists" \
  -H "Authorization: Bearer $DASH_API_KEY" \
  -H "Project-ID: pr_northpit" \
  -H "Content-Type: application/json" \
  -d '{"name":"name","status":"status","default_hold_seconds":1}'
Create a new playlist
data_set {
  "collection": "playlists",
  "object_id": "a60h-12",
  "data": {
    "name": "name",
    "status": "status",
    "default_hold_seconds": 1
  }
}

Returns the playlist object.

{
  "object": "playlist",
  "id": "obj_123",
  "name": "Little Flake Mine Office Loop",
  "status": "active",
  "created_at": "2026-07-25T12:00:00.000Z",
  "updated_at": "2026-07-25T12:00:00.000Z"
}

Parameters

FieldTypeRequiredDescription
namestringnoName of the playlist.
statusstringnoWhether the playlist is playing on screens or parked.
default_hold_secondsnumbernoHow long each dashboard stays up when its own entry sets no hold. Defaults to 30.
transitionstringnoHow one dashboard gives way to the next (e.g. fade).
ordered_dashboard_idsarraynoThe dashboards in play order. Per-dashboard dwell times live in items[].hold_seconds.
linked_equipmentstringnoMachine this loop is pinned to, when it is about one.
settingsobjectnoPlaylist-level display options.
itemsarraynoThe loop itself — one entry per dashboard, each \{dashboard_id, hold_seconds\}. An entry with no hold_seconds uses default_hold_seconds.

Update a playlist

PATCH /api/v1/playlists/a60h-12

curl -X PATCH "https://trydozer.com/api/v1/playlists/a60h-12" \
  -H "Authorization: Bearer $DASH_API_KEY" \
  -H "Project-ID: pr_northpit" \
  -H "Content-Type: application/json" \
  -d '{"name":"name","status":"status","default_hold_seconds":1}'
Update the playlist {id}
data_set {
  "collection": "playlists",
  "object_id": "a60h-12",
  "data": {
    "name": "name",
    "status": "status",
    "default_hold_seconds": 1
  }
}

Returns the playlist object.

{
  "object": "playlist",
  "id": "obj_123",
  "name": "Little Flake Mine Office Loop",
  "status": "active",
  "created_at": "2026-07-25T12:00:00.000Z",
  "updated_at": "2026-07-25T12:00:00.000Z"
}

Parameters

FieldTypeRequiredDescription
namestringnoName of the playlist.
statusstringnoWhether the playlist is playing on screens or parked.
default_hold_secondsnumbernoHow long each dashboard stays up when its own entry sets no hold. Defaults to 30.
transitionstringnoHow one dashboard gives way to the next (e.g. fade).
ordered_dashboard_idsarraynoThe dashboards in play order. Per-dashboard dwell times live in items[].hold_seconds.
linked_equipmentstringnoMachine this loop is pinned to, when it is about one.
settingsobjectnoPlaylist-level display options.
itemsarraynoThe loop itself — one entry per dashboard, each \{dashboard_id, hold_seconds\}. An entry with no hold_seconds uses default_hold_seconds.

Delete a playlist

DELETE /api/v1/playlists/a60h-12

curl -X DELETE "https://trydozer.com/api/v1/playlists/a60h-12" \
  -H "Authorization: Bearer $DASH_API_KEY" \
  -H "Project-ID: pr_northpit"
Delete the playlist {id}
data_delete {
  "collection": "playlists",
  "object_id": "a60h-12"
}

Returns the deleted playlist object with deleted: true.

{
  "object": "playlist",
  "id": "obj_123",
  "deleted": true
}

Parameters

ParameterTypeKindDescription
idstringpathThe playlist's id or slug.

Append an event to a playlist

POST /api/v1/playlists/{id}/events

curl -X POST "https://trydozer.com/api/v1/playlists/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 playlist {id}
data_event {
  "collection": "playlists",
  "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

FieldTypeRequiredDescription
eventstringyesThe human-readable timeline entry.
contextobjectnoProvenance — source, integration, worker_run_id, …

What comes back (read-only)

Every playlist carries the envelope below. The fields under it are computed or stamped by the platform — they are returned, never sent.

FieldTypeDescription
objectstringAlways playlist.
idstringStable object id. Also accepted in place of slug on any path.
slugstringURL-safe name, unique within the collection.
created_atstringISO-8601 timestamp of the first write.
updated_atstringISO-8601 timestamp of the most recent write. The cursor sorts on this.
last_live_data_atstringWhen data behind this loop last arrived (ISO 8601). Stamped by the telemetry path.
shareobjectPublic-share state for the loop — whether a scoped TV share link exists. Owned by the share-token flow, not set on a playlist write.

Errors

Failures use { error: { type, code, message, param } }. The full code table is generated at Error Codes.