Screens API (part 1 of 4)
Screens endpoints in the Brix REST API, part 1 of 4: 4 operations from /v1/screens, each with auth, permission and curl.
View as Markdown · For AI agents: the full docs index is at /llms.txt
Base URL https://api.brixsignage.com. Send Authorization: Bearer $BRIX_API_KEY unless an operation says Auth: none or Auth: no API key. The Permission line names what the key must hold. See Authentication and scopes, Errors and rate limits and Pagination.
Screens is split into 4 pages: part 1 (/v1/screens to /v1/screens/{id}), part 2 (/v1/screens/{id} to /v1/screens/{id}/mirror), part 3 (/v1/screens/{id}/outages to /v1/screens/{id}/unpower-and-delete), part 4 (/v1/screens/{id}/up-next to /v1/screens/touch-content).
Every 4xx and 5xx response below returns this body:
| Field | Type | Description |
|---|---|---|
error | string | Machine-readable code: unauthorized, forbidden, not_found, validation_error, conflict, rate_limited, internal_error, … |
message | string | Human-readable explanation. Safe to show an operator. |
requestId | string | Present on 5xx: quote it to support. |
GET /v1/screens
List the screens in your workspace, including each screen's organization node, assigned content, online status, and player settings. Pass limit (and optionally cursor) to page through results; without limit, the full list is returned. Results are limited to the organization nodes you can see.
Notes.
- The state object is a lean subset here (connection, currentContent, cache, proof, sync, telemetry.identity/display); GET /v1/screens/{id} returns the full snapshot.
- nextCursor is a screen id (keyset by id), not the base64 cursor the shared resource routes use.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
limit | query | integer | no | Page size (max 500). Omit to get every screen. |
cursor | query | string | no | The nextCursor of the previous page (a screen id). |
q | query | string | no | Only screens whose name contains this text (not case-sensitive). % and _ match themselves. |
nodeId | query | string | no | Only screens at or under this location. An unknown location is 404. |
curl "https://api.brixsignage.com/v1/screens" \
-H "Authorization: Bearer $BRIX_API_KEY" Response 200: Success.
| Field | Type | Description |
|---|---|---|
data | array of Screen | |
data[].id | string | Screen id. |
data[].spaceId | string | Workspace id. |
data[].nodeId | string | null | Location (org node) the screen belongs to; null = workspace root. |
data[].name | string | |
data[].status | "online" | "offline" | "pairing" | pairing = no device has checked in yet. |
data[].lastSeenAt | string | null | Last heartbeat or socket ping reply, whichever is later. |
data[].coreUpdateOfferedAt | string | null | |
data[].contentKind | "playlist" | "schedule" | "layout" | "creative" | "app" | "media" | "signage" | null | What is assigned. Null = nothing assigned. |
data[].contentId | string | null | |
data[].contentFit | null | Retired; always null. Fit is set on the content. |
data[].deactivatedAt | string | null | Set while an operator has deactivated the screen. |
data[].awaitingPaymentAt | string | null | Set while the screen waits for payment: it was paired past the screens on the plan. It starts to play when the plan has room. |
data[].tags | array of string | |
data[].rotation | integer | 0, 90, 180 or 270 degrees. |
data[].rotationCommandedAt | string | null | |
data[].timezone | string | null | IANA time zone; null = inherited. |
data[].timezoneSource | "operator" | "device" | null | |
data[].operatingHours | string | default, or a JSON-encoded weekly window. |
data[].lastPanelCommand | string | null | |
data[].scheduleScreensOff | boolean | |
data[].displayPowerMode | "always-on" | "follow-schedule" | "os-default" | |
data[].playbackMode | "sync" | "unsync" | "device-time" | |
data[].locationLabel | string | null | |
data[].locationLat | number | null | |
data[].locationLng | number | null | |
data[].ipCity | string | null | |
data[].ipRegion | string | null | |
data[].ipCountry | string | null | |
data[].ipLat | number | null | |
data[].ipLng | number | null | |
data[].ipTimezone | string | null | |
data[].ipGeoAt | string | null | |
data[].playerSettings | string | null | Player settings as a JSON-ENCODED string (not an object). |
data[].kioskEnabled | boolean | |
data[].kioskPinMode | "workspace" | "custom" | |
data[].kioskGraceSeconds | integer | |
data[].activeEmergencyId | string | null | The live emergency overriding this screen, if any. |
data[].activeCastId | string | null | The live cast overriding this screen, if any. |
data[].playerVersionHold | string | null | |
data[].sealed | boolean | |
data[].sealedAt | string | null | |
data[].powerPolicyId | string | null | |
data[].importSourceId | string | null | |
data[].billingGroupId | string | null | |
data[].customFields | string | null | Custom fields as a JSON-ENCODED string. |
data[].lanSecretAt | string | null | When the local-trigger key was last set or rotated. The key itself is never returned. |
data[].createdAt | string | ISO-8601 timestamp (UTC). |
data[].updatedAt | string | ISO-8601 timestamp (UTC). |
data[].deletedAt | string | null | |
data[].location | object | null | |
data[].deviceClaimed | boolean | Status is pairing but a device has claimed it and not yet checked in. |
data[].nodeName | string | null | |
data[].groupIds | array of string | Screen groups this screen is in. |
data[].contentName | string | null | |
data[].contentSharedFrom | string | null | Name of the workspace that shared the assigned content in; null when it is this workspace's own. |
data[].thumbnailUrl | string | null | Preview of the assigned content. |
data[].contentAppKey | string | null | |
data[].contentMediaKind | string | null | |
data[].contentState | object | null | Assigned media that is not playable yet (processing, failed, needs_action); null otherwise. |
data[].contentOrientation | "portrait" | "landscape" | "adaptive" | null | |
data[].liveThumbnailAt | string | null | Capture time of the latest live frame (GET /v1/screens/{id}/live-thumbnail). |
data[].liveThumbnailFreshAt | string | null | |
data[].currentContentKind | "image" | "video" | "stream" | null | |
data[].currentContentPosterUrl | string | null | |
data[].emergencyHeadline | string | null | |
data[].castHeadline | string | null | |
data[].castStartedAt | string | null | |
data[].castExpiresAt | string | null | |
data[].castContentKind | string | null | |
data[].castContentId | string | null | |
data[].kioskHasCustomPin | boolean | |
data[].kioskHasRecovery | boolean | |
data[].obscuredSince | string | null | A system dialog is covering the screen since this time. |
data[].pixelHealth | "ok" | "frozen" | "blank" | null | |
data[].displayOffSince | string | null | |
data[].displayOffReason | "standby" | "wrong-input" | "disconnected" | "input-unconfirmed" | null | |
data[].expectedDark | object | |
data[].expectedDark.dark | boolean | True when the rules say the panel should be off now. |
data[].expectedDark.reason | "schedule-block" | "power-policy" | "operating-hours" | null | |
data[].expectedDark.nextOpen | object | null | |
data[].expectedDark.minutesSinceOpen | number | null | |
data[].expectedDark.minutesSinceClose | number | null | |
data[].accountHold | object | null | |
data[].outageSummary30d | object | null | |
data[].linkFlaps10m | integer | Socket link flips in the last ten minutes; present only when > 0 (list and get). |
data[].state | object | null | The device's last reported state (updatedAt plus the heartbeat snapshot). The list returns a lean subset; get and PATCH return it all. Null before the first heartbeat. |
nextCursor | string | null | Present only when limit was passed; null on the last page. |
{
"data": [
{
"id": "scr_1a2b3c4d5e6f7a8b",
"spaceId": "space_1a2b3c4d5e6f7a8b",
"nodeId": "node_4c5d6e7f8a9b0c1d",
"name": "Lobby",
"status": "online",
"lastSeenAt": "2026-09-28T11:58:00.000Z",
"coreUpdateOfferedAt": null,
"contentKind": "playlist",
"contentId": "pl_9a8b7c6d5e4f3a2b",
"contentFit": null,
"deactivatedAt": null,
"awaitingPaymentAt": null,
"tags": [
"lobby"
],
"rotation": 0,
"rotationCommandedAt": null,
"timezone": "Europe/London",
"timezoneSource": "operator",
"operatingHours": "default",
"lastPanelCommand": null,
"scheduleScreensOff": false,
"displayPowerMode": "always-on",
"playbackMode": "unsync",
"locationLabel": null,
"locationLat": null,
"locationLng": null,
"ipCity": "London",
"ipRegion": "England",
"ipCountry": "GB",
"ipLat": 51.5,
"ipLng": -0.12,
"ipTimezone": "Europe/London",
"ipGeoAt": "2026-09-01T09:00:00.000Z",
"playerSettings": null,
"kioskEnabled": false,
"kioskPinMode": "workspace",
"kioskGraceSeconds": 30,
"activeEmergencyId": null,
"activeCastId": null,
"playerVersionHold": null,
"sealed": false,
"sealedAt": null,
"powerPolicyId": null,
"importSourceId": null,
"billingGroupId": null,
"customFields": null,
"lanSecretAt": null,
"createdAt": "2026-09-01T09:00:00.000Z",
"updatedAt": "2026-09-28T11:58:00.000Z",
"deletedAt": null,
"location": null,
"deviceClaimed": false,
"nodeName": "Head office",
"groupIds": [],
"contentName": "Lobby loop",
"contentSharedFrom": null,
"thumbnailUrl": null,
"contentAppKey": null,
"contentMediaKind": null,
"contentState": null,
"contentOrientation": "landscape",
"liveThumbnailAt": "2026-09-28T11:45:00.000Z",
"liveThumbnailFreshAt": "2026-09-28T11:57:00.000Z",
"currentContentKind": "image",
"currentContentPosterUrl": null,
"emergencyHeadline": null,
"castHeadline": null,
"castStartedAt": null,
"castExpiresAt": null,
"castContentKind": null,
"castContentId": null,
"kioskHasCustomPin": false,
"kioskHasRecovery": false,
"obscuredSince": null,
"pixelHealth": "ok",
"displayOffSince": null,
"displayOffReason": null,
"expectedDark": {
"dark": false,
"reason": null,
"nextOpen": null,
"minutesSinceOpen": null,
"minutesSinceClose": null
},
"accountHold": null,
"outageSummary30d": null,
"state": {
"updatedAt": "2026-09-28T11:58:00.000Z",
"connection": "online",
"currentContent": {
"kind": "playlist",
"id": "pl_9a8b7c6d5e4f3a2b"
}
}
}
]
} Response 401: Missing, expired or revoked bearer token.
Response 403: The token lacks the permission this operation needs (see x-brix-permission).
Response 5XX: Server error. The body carries a requestId to quote to support.
POST /v1/screens
Create a screen. name is required; nodeId, location, and tags are optional. This operation is safe to retry with an idempotency key. Each screen created increases your billed screen count, so this request is refused if your account is suspended or cancelled.
Notes.
- Returns the stored row, not the composed Screen that GET /v1/screens/{id} returns: tags is the JSON-encoded string, and the composed fields (contentName, state, …) are absent.
- The screen waits in pairing status until a device claims it (POST /v1/screens/{id}/claim-replacement) — or use POST /v1/screens/claim or /v1/screens/enroll, which create and pair in one step.
Request body: application/json
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes | |
nodeId | string | no | Location to create it in; default: the API key's own location, else the workspace root. |
billingGroupId | string | null | no | Billing group that pays for the screen. |
payment | "later" | no | Answer to plan_full: create the screen waiting for payment. It starts to play when the plan has room. |
curl -X POST "https://api.brixsignage.com/v1/screens" \
-H "Authorization: Bearer $BRIX_API_KEY" \
-H "Content-Type: application/json" Response 201: Success.
| Field | Type | Description |
|---|---|---|
data | ScreenRow | A screen as stored, before composition. |
data.id | string | Screen id. |
data.spaceId | string | Workspace id. |
data.nodeId | string | null | Location (org node) the screen belongs to; null = workspace root. |
data.name | string | |
data.status | "online" | "offline" | "pairing" | pairing = no device has checked in yet. |
data.lastSeenAt | string | null | Last heartbeat or socket ping reply, whichever is later. |
data.coreUpdateOfferedAt | string | null | |
data.contentKind | "playlist" | "schedule" | "layout" | "creative" | "app" | "media" | "signage" | null | What is assigned. Null = nothing assigned. |
data.contentId | string | null | |
data.contentFit | null | Retired; always null. Fit is set on the content. |
data.deactivatedAt | string | null | Set while an operator has deactivated the screen. |
data.awaitingPaymentAt | string | null | Set while the screen waits for payment: it was paired past the screens on the plan. It starts to play when the plan has room. |
data.rotation | integer | 0, 90, 180 or 270 degrees. |
data.rotationCommandedAt | string | null | |
data.timezone | string | null | IANA time zone; null = inherited. |
data.timezoneSource | "operator" | "device" | null | |
data.operatingHours | string | default, or a JSON-encoded weekly window. |
data.lastPanelCommand | string | null | |
data.scheduleScreensOff | boolean | |
data.displayPowerMode | "always-on" | "follow-schedule" | "os-default" | |
data.playbackMode | "sync" | "unsync" | "device-time" | |
data.locationLabel | string | null | |
data.locationLat | number | null | |
data.locationLng | number | null | |
data.ipCity | string | null | |
data.ipRegion | string | null | |
data.ipCountry | string | null | |
data.ipLat | number | null | |
data.ipLng | number | null | |
data.ipTimezone | string | null | |
data.ipGeoAt | string | null | |
data.playerSettings | string | null | Player settings as a JSON-ENCODED string (not an object). |
data.kioskEnabled | boolean | |
data.kioskPinMode | "workspace" | "custom" | |
data.kioskGraceSeconds | integer | |
data.activeEmergencyId | string | null | The live emergency overriding this screen, if any. |
data.activeCastId | string | null | The live cast overriding this screen, if any. |
data.playerVersionHold | string | null | |
data.sealed | boolean | |
data.sealedAt | string | null | |
data.powerPolicyId | string | null | |
data.importSourceId | string | null | |
data.billingGroupId | string | null | |
data.customFields | string | null | Custom fields as a JSON-ENCODED string. |
data.lanSecretAt | string | null | When the local-trigger key was last set or rotated. The key itself is never returned. |
data.createdAt | string | ISO-8601 timestamp (UTC). |
data.updatedAt | string | ISO-8601 timestamp (UTC). |
data.deletedAt | string | null | |
data.tags | string | Tags as a JSON-ENCODED array string (the stored column), not an array. |
Response 401: Missing, expired or revoked bearer token.
Response 402: plan_full: every screen on the plan is in use. The body has data.plan with the price of one more screen today. Add screens to the plan, or send payment: "later".
Response 403: The token lacks the permission this operation needs (see x-brix-permission).
Response 404: The location does not exist.
Response 409: The account is suspended or cancelled.
Response 422: name is missing.
Response 5XX: Server error. The body carries a requestId to quote to support.
GET /v1/screens/{id}
Get one screen, with the same detail included in the screen list. A screen outside your organization scope returns a not-found error rather than a permission error.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | Screen id. |
curl "https://api.brixsignage.com/v1/screens/{id}" \
-H "Authorization: Bearer $BRIX_API_KEY" Response 200: Success.
| Field | Type | Description |
|---|---|---|
data | Screen | A screen, composed with its content, live state and health facts. |
data.id | string | Screen id. |
data.spaceId | string | Workspace id. |
data.nodeId | string | null | Location (org node) the screen belongs to; null = workspace root. |
data.name | string | |
data.status | "online" | "offline" | "pairing" | pairing = no device has checked in yet. |
data.lastSeenAt | string | null | Last heartbeat or socket ping reply, whichever is later. |
data.coreUpdateOfferedAt | string | null | |
data.contentKind | "playlist" | "schedule" | "layout" | "creative" | "app" | "media" | "signage" | null | What is assigned. Null = nothing assigned. |
data.contentId | string | null | |
data.contentFit | null | Retired; always null. Fit is set on the content. |
data.deactivatedAt | string | null | Set while an operator has deactivated the screen. |
data.awaitingPaymentAt | string | null | Set while the screen waits for payment: it was paired past the screens on the plan. It starts to play when the plan has room. |
data.tags | array of string | |
data.rotation | integer | 0, 90, 180 or 270 degrees. |
data.rotationCommandedAt | string | null | |
data.timezone | string | null | IANA time zone; null = inherited. |
data.timezoneSource | "operator" | "device" | null | |
data.operatingHours | string | default, or a JSON-encoded weekly window. |
data.lastPanelCommand | string | null | |
data.scheduleScreensOff | boolean | |
data.displayPowerMode | "always-on" | "follow-schedule" | "os-default" | |
data.playbackMode | "sync" | "unsync" | "device-time" | |
data.locationLabel | string | null | |
data.locationLat | number | null | |
data.locationLng | number | null | |
data.ipCity | string | null | |
data.ipRegion | string | null | |
data.ipCountry | string | null | |
data.ipLat | number | null | |
data.ipLng | number | null | |
data.ipTimezone | string | null | |
data.ipGeoAt | string | null | |
data.playerSettings | string | null | Player settings as a JSON-ENCODED string (not an object). |
data.kioskEnabled | boolean | |
data.kioskPinMode | "workspace" | "custom" | |
data.kioskGraceSeconds | integer | |
data.activeEmergencyId | string | null | The live emergency overriding this screen, if any. |
data.activeCastId | string | null | The live cast overriding this screen, if any. |
data.playerVersionHold | string | null | |
data.sealed | boolean | |
data.sealedAt | string | null | |
data.powerPolicyId | string | null | |
data.importSourceId | string | null | |
data.billingGroupId | string | null | |
data.customFields | string | null | Custom fields as a JSON-ENCODED string. |
data.lanSecretAt | string | null | When the local-trigger key was last set or rotated. The key itself is never returned. |
data.createdAt | string | ISO-8601 timestamp (UTC). |
data.updatedAt | string | ISO-8601 timestamp (UTC). |
data.deletedAt | string | null | |
data.location | object | null | |
data.deviceClaimed | boolean | Status is pairing but a device has claimed it and not yet checked in. |
data.nodeName | string | null | |
data.groupIds | array of string | Screen groups this screen is in. |
data.contentName | string | null | |
data.contentSharedFrom | string | null | Name of the workspace that shared the assigned content in; null when it is this workspace's own. |
data.thumbnailUrl | string | null | Preview of the assigned content. |
data.contentAppKey | string | null | |
data.contentMediaKind | string | null | |
data.contentState | object | null | Assigned media that is not playable yet (processing, failed, needs_action); null otherwise. |
data.contentOrientation | "portrait" | "landscape" | "adaptive" | null | |
data.liveThumbnailAt | string | null | Capture time of the latest live frame (GET /v1/screens/{id}/live-thumbnail). |
data.liveThumbnailFreshAt | string | null | |
data.currentContentKind | "image" | "video" | "stream" | null | |
data.currentContentPosterUrl | string | null | |
data.emergencyHeadline | string | null | |
data.castHeadline | string | null | |
data.castStartedAt | string | null | |
data.castExpiresAt | string | null | |
data.castContentKind | string | null | |
data.castContentId | string | null | |
data.kioskHasCustomPin | boolean | |
data.kioskHasRecovery | boolean | |
data.obscuredSince | string | null | A system dialog is covering the screen since this time. |
data.pixelHealth | "ok" | "frozen" | "blank" | null | |
data.displayOffSince | string | null | |
data.displayOffReason | "standby" | "wrong-input" | "disconnected" | "input-unconfirmed" | null | |
data.expectedDark | object | |
data.expectedDark.dark | boolean | True when the rules say the panel should be off now. |
data.expectedDark.reason | "schedule-block" | "power-policy" | "operating-hours" | null | |
data.expectedDark.nextOpen | object | null | |
data.expectedDark.minutesSinceOpen | number | null | |
data.expectedDark.minutesSinceClose | number | null | |
data.accountHold | object | null | |
data.outageSummary30d | object | null | |
data.linkFlaps10m | integer | Socket link flips in the last ten minutes; present only when > 0 (list and get). |
data.state | object | null | The device's last reported state (updatedAt plus the heartbeat snapshot). The list returns a lean subset; get and PATCH return it all. Null before the first heartbeat. |
Response 401: Missing, expired or revoked bearer token.
Response 403: The token lacks the permission this operation needs (see x-brix-permission).
Response 404: No such screen in this workspace.
Response 5XX: Server error. The body carries a requestId to quote to support.
PATCH /v1/screens/{id}
Update a screen's own fields, including name, location, tags, orientation, organization node, and player settings. This endpoint does not assign content; use POST /v1/screens/:id/assign to change what a screen plays.
Partial update. To change what a screen plays use POST /v1/screens/{id}/assign — this route refuses contentKind/contentId with a 400.
Notes.
- The PATCH response does not merge the live socket facts (linkFlaps10m, a socket-fresh lastSeenAt) that GET adds.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | Screen id. |
Request body: application/json
| Field | Type | Required | Description |
|---|---|---|---|
name | string | no | |
nodeId | string | null | no | Move to another location (you need screen.edit there too). |
billingGroupId | string | null | no | Needs billing.edit. |
status | "online" | "offline" | "pairing" | no | |
tags | array of string | no | |
rotation | 0 | 90 | 180 | 270 | no | |
timezone | string | null | no | IANA time zone; null to inherit. |
operatingHours | string | no | |
displayPowerMode | "always-on" | "follow-schedule" | "os-default" | no | |
powerPolicyId | string | null | no | |
playbackMode | "sync" | "unsync" | "device-time" | no | |
location | object | null | no | |
deactivated | boolean | no | True deactivates the screen (nothing plays); false reactivates it. |
playerVersionHold | boolean | string | null | no | |
playerSettings | object | null | no | Merged into the current settings; null resets them. |
customFields | object | null | no | |
kioskPinMode | "workspace" | "custom" | no | |
kioskGraceSeconds | number | no | |
kioskPin | string | null | no | 4-8 digits; null clears the custom PIN. |
kioskEnabled | boolean | no |
curl -X PATCH "https://api.brixsignage.com/v1/screens/{id}" \
-H "Authorization: Bearer $BRIX_API_KEY" \
-H "Content-Type: application/json" Response 200: Success.
| Field | Type | Description |
|---|---|---|
data | Screen | A screen, composed with its content, live state and health facts. |
data.id | string | Screen id. |
data.spaceId | string | Workspace id. |
data.nodeId | string | null | Location (org node) the screen belongs to; null = workspace root. |
data.name | string | |
data.status | "online" | "offline" | "pairing" | pairing = no device has checked in yet. |
data.lastSeenAt | string | null | Last heartbeat or socket ping reply, whichever is later. |
data.coreUpdateOfferedAt | string | null | |
data.contentKind | "playlist" | "schedule" | "layout" | "creative" | "app" | "media" | "signage" | null | What is assigned. Null = nothing assigned. |
data.contentId | string | null | |
data.contentFit | null | Retired; always null. Fit is set on the content. |
data.deactivatedAt | string | null | Set while an operator has deactivated the screen. |
data.awaitingPaymentAt | string | null | Set while the screen waits for payment: it was paired past the screens on the plan. It starts to play when the plan has room. |
data.tags | array of string | |
data.rotation | integer | 0, 90, 180 or 270 degrees. |
data.rotationCommandedAt | string | null | |
data.timezone | string | null | IANA time zone; null = inherited. |
data.timezoneSource | "operator" | "device" | null | |
data.operatingHours | string | default, or a JSON-encoded weekly window. |
data.lastPanelCommand | string | null | |
data.scheduleScreensOff | boolean | |
data.displayPowerMode | "always-on" | "follow-schedule" | "os-default" | |
data.playbackMode | "sync" | "unsync" | "device-time" | |
data.locationLabel | string | null | |
data.locationLat | number | null | |
data.locationLng | number | null | |
data.ipCity | string | null | |
data.ipRegion | string | null | |
data.ipCountry | string | null | |
data.ipLat | number | null | |
data.ipLng | number | null | |
data.ipTimezone | string | null | |
data.ipGeoAt | string | null | |
data.playerSettings | string | null | Player settings as a JSON-ENCODED string (not an object). |
data.kioskEnabled | boolean | |
data.kioskPinMode | "workspace" | "custom" | |
data.kioskGraceSeconds | integer | |
data.activeEmergencyId | string | null | The live emergency overriding this screen, if any. |
data.activeCastId | string | null | The live cast overriding this screen, if any. |
data.playerVersionHold | string | null | |
data.sealed | boolean | |
data.sealedAt | string | null | |
data.powerPolicyId | string | null | |
data.importSourceId | string | null | |
data.billingGroupId | string | null | |
data.customFields | string | null | Custom fields as a JSON-ENCODED string. |
data.lanSecretAt | string | null | When the local-trigger key was last set or rotated. The key itself is never returned. |
data.createdAt | string | ISO-8601 timestamp (UTC). |
data.updatedAt | string | ISO-8601 timestamp (UTC). |
data.deletedAt | string | null | |
data.location | object | null | |
data.deviceClaimed | boolean | Status is pairing but a device has claimed it and not yet checked in. |
data.nodeName | string | null | |
data.groupIds | array of string | Screen groups this screen is in. |
data.contentName | string | null | |
data.contentSharedFrom | string | null | Name of the workspace that shared the assigned content in; null when it is this workspace's own. |
data.thumbnailUrl | string | null | Preview of the assigned content. |
data.contentAppKey | string | null | |
data.contentMediaKind | string | null | |
data.contentState | object | null | Assigned media that is not playable yet (processing, failed, needs_action); null otherwise. |
data.contentOrientation | "portrait" | "landscape" | "adaptive" | null | |
data.liveThumbnailAt | string | null | Capture time of the latest live frame (GET /v1/screens/{id}/live-thumbnail). |
data.liveThumbnailFreshAt | string | null | |
data.currentContentKind | "image" | "video" | "stream" | null | |
data.currentContentPosterUrl | string | null | |
data.emergencyHeadline | string | null | |
data.castHeadline | string | null | |
data.castStartedAt | string | null | |
data.castExpiresAt | string | null | |
data.castContentKind | string | null | |
data.castContentId | string | null | |
data.kioskHasCustomPin | boolean | |
data.kioskHasRecovery | boolean | |
data.obscuredSince | string | null | A system dialog is covering the screen since this time. |
data.pixelHealth | "ok" | "frozen" | "blank" | null | |
data.displayOffSince | string | null | |
data.displayOffReason | "standby" | "wrong-input" | "disconnected" | "input-unconfirmed" | null | |
data.expectedDark | object | |
data.expectedDark.dark | boolean | True when the rules say the panel should be off now. |
data.expectedDark.reason | "schedule-block" | "power-policy" | "operating-hours" | null | |
data.expectedDark.nextOpen | object | null | |
data.expectedDark.minutesSinceOpen | number | null | |
data.expectedDark.minutesSinceClose | number | null | |
data.accountHold | object | null | |
data.outageSummary30d | object | null | |
data.linkFlaps10m | integer | Socket link flips in the last ten minutes; present only when > 0 (list and get). |
data.state | object | null | The device's last reported state (updatedAt plus the heartbeat snapshot). The list returns a lean subset; get and PATCH return it all. Null before the first heartbeat. |
Response 400: The body tried to set content (use POST /v1/screens/{id}/assign).
Response 401: Missing, expired or revoked bearer token.
Response 403: The token lacks the permission this operation needs (see x-brix-permission).
Response 404: No such screen (or destination location/billing group) in this workspace.
Response 422: Invalid status, rotation, time zone or PIN.
Response 5XX: Server error. The body carries a requestId to quote to support.