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:

FieldTypeDescription
errorstringMachine-readable code: unauthorized, forbidden, not_found, validation_error, conflict, rate_limited, internal_error, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

GET /v1/screens

Auth: Bearer token. Permission: screen.view.

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.

ParameterInTypeRequiredDescription
limitqueryintegernoPage size (max 500). Omit to get every screen.
cursorquerystringnoThe nextCursor of the previous page (a screen id).
qquerystringnoOnly screens whose name contains this text (not case-sensitive). % and _ match themselves.
nodeIdquerystringnoOnly 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.

FieldTypeDescription
dataarray of Screen
data[].idstringScreen id.
data[].spaceIdstringWorkspace id.
data[].nodeIdstring | nullLocation (org node) the screen belongs to; null = workspace root.
data[].namestring
data[].status"online" | "offline" | "pairing"pairing = no device has checked in yet.
data[].lastSeenAtstring | nullLast heartbeat or socket ping reply, whichever is later.
data[].coreUpdateOfferedAtstring | null
data[].contentKind"playlist" | "schedule" | "layout" | "creative" | "app" | "media" | "signage" | nullWhat is assigned. Null = nothing assigned.
data[].contentIdstring | null
data[].contentFitnullRetired; always null. Fit is set on the content.
data[].deactivatedAtstring | nullSet while an operator has deactivated the screen.
data[].awaitingPaymentAtstring | nullSet 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[].tagsarray of string
data[].rotationinteger0, 90, 180 or 270 degrees.
data[].rotationCommandedAtstring | null
data[].timezonestring | nullIANA time zone; null = inherited.
data[].timezoneSource"operator" | "device" | null
data[].operatingHoursstringdefault, or a JSON-encoded weekly window.
data[].lastPanelCommandstring | null
data[].scheduleScreensOffboolean
data[].displayPowerMode"always-on" | "follow-schedule" | "os-default"
data[].playbackMode"sync" | "unsync" | "device-time"
data[].locationLabelstring | null
data[].locationLatnumber | null
data[].locationLngnumber | null
data[].ipCitystring | null
data[].ipRegionstring | null
data[].ipCountrystring | null
data[].ipLatnumber | null
data[].ipLngnumber | null
data[].ipTimezonestring | null
data[].ipGeoAtstring | null
data[].playerSettingsstring | nullPlayer settings as a JSON-ENCODED string (not an object).
data[].kioskEnabledboolean
data[].kioskPinMode"workspace" | "custom"
data[].kioskGraceSecondsinteger
data[].activeEmergencyIdstring | nullThe live emergency overriding this screen, if any.
data[].activeCastIdstring | nullThe live cast overriding this screen, if any.
data[].playerVersionHoldstring | null
data[].sealedboolean
data[].sealedAtstring | null
data[].powerPolicyIdstring | null
data[].importSourceIdstring | null
data[].billingGroupIdstring | null
data[].customFieldsstring | nullCustom fields as a JSON-ENCODED string.
data[].lanSecretAtstring | nullWhen the local-trigger key was last set or rotated. The key itself is never returned.
data[].createdAtstringISO-8601 timestamp (UTC).
data[].updatedAtstringISO-8601 timestamp (UTC).
data[].deletedAtstring | null
data[].locationobject | null
data[].deviceClaimedbooleanStatus is pairing but a device has claimed it and not yet checked in.
data[].nodeNamestring | null
data[].groupIdsarray of stringScreen groups this screen is in.
data[].contentNamestring | null
data[].contentSharedFromstring | nullName of the workspace that shared the assigned content in; null when it is this workspace's own.
data[].thumbnailUrlstring | nullPreview of the assigned content.
data[].contentAppKeystring | null
data[].contentMediaKindstring | null
data[].contentStateobject | nullAssigned media that is not playable yet (processing, failed, needs_action); null otherwise.
data[].contentOrientation"portrait" | "landscape" | "adaptive" | null
data[].liveThumbnailAtstring | nullCapture time of the latest live frame (GET /v1/screens/{id}/live-thumbnail).
data[].liveThumbnailFreshAtstring | null
data[].currentContentKind"image" | "video" | "stream" | null
data[].currentContentPosterUrlstring | null
data[].emergencyHeadlinestring | null
data[].castHeadlinestring | null
data[].castStartedAtstring | null
data[].castExpiresAtstring | null
data[].castContentKindstring | null
data[].castContentIdstring | null
data[].kioskHasCustomPinboolean
data[].kioskHasRecoveryboolean
data[].obscuredSincestring | nullA system dialog is covering the screen since this time.
data[].pixelHealth"ok" | "frozen" | "blank" | null
data[].displayOffSincestring | null
data[].displayOffReason"standby" | "wrong-input" | "disconnected" | "input-unconfirmed" | null
data[].expectedDarkobject
data[].expectedDark.darkbooleanTrue when the rules say the panel should be off now.
data[].expectedDark.reason"schedule-block" | "power-policy" | "operating-hours" | null
data[].expectedDark.nextOpenobject | null
data[].expectedDark.minutesSinceOpennumber | null
data[].expectedDark.minutesSinceClosenumber | null
data[].accountHoldobject | null
data[].outageSummary30dobject | null
data[].linkFlaps10mintegerSocket link flips in the last ten minutes; present only when > 0 (list and get).
data[].stateobject | nullThe 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.
nextCursorstring | nullPresent 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

Auth: Bearer token. Permission: screen.create.

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

FieldTypeRequiredDescription
namestringyes
nodeIdstringnoLocation to create it in; default: the API key's own location, else the workspace root.
billingGroupIdstring | nullnoBilling group that pays for the screen.
payment"later"noAnswer 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.

FieldTypeDescription
dataScreenRowA screen as stored, before composition.
data.idstringScreen id.
data.spaceIdstringWorkspace id.
data.nodeIdstring | nullLocation (org node) the screen belongs to; null = workspace root.
data.namestring
data.status"online" | "offline" | "pairing"pairing = no device has checked in yet.
data.lastSeenAtstring | nullLast heartbeat or socket ping reply, whichever is later.
data.coreUpdateOfferedAtstring | null
data.contentKind"playlist" | "schedule" | "layout" | "creative" | "app" | "media" | "signage" | nullWhat is assigned. Null = nothing assigned.
data.contentIdstring | null
data.contentFitnullRetired; always null. Fit is set on the content.
data.deactivatedAtstring | nullSet while an operator has deactivated the screen.
data.awaitingPaymentAtstring | nullSet 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.rotationinteger0, 90, 180 or 270 degrees.
data.rotationCommandedAtstring | null
data.timezonestring | nullIANA time zone; null = inherited.
data.timezoneSource"operator" | "device" | null
data.operatingHoursstringdefault, or a JSON-encoded weekly window.
data.lastPanelCommandstring | null
data.scheduleScreensOffboolean
data.displayPowerMode"always-on" | "follow-schedule" | "os-default"
data.playbackMode"sync" | "unsync" | "device-time"
data.locationLabelstring | null
data.locationLatnumber | null
data.locationLngnumber | null
data.ipCitystring | null
data.ipRegionstring | null
data.ipCountrystring | null
data.ipLatnumber | null
data.ipLngnumber | null
data.ipTimezonestring | null
data.ipGeoAtstring | null
data.playerSettingsstring | nullPlayer settings as a JSON-ENCODED string (not an object).
data.kioskEnabledboolean
data.kioskPinMode"workspace" | "custom"
data.kioskGraceSecondsinteger
data.activeEmergencyIdstring | nullThe live emergency overriding this screen, if any.
data.activeCastIdstring | nullThe live cast overriding this screen, if any.
data.playerVersionHoldstring | null
data.sealedboolean
data.sealedAtstring | null
data.powerPolicyIdstring | null
data.importSourceIdstring | null
data.billingGroupIdstring | null
data.customFieldsstring | nullCustom fields as a JSON-ENCODED string.
data.lanSecretAtstring | nullWhen the local-trigger key was last set or rotated. The key itself is never returned.
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).
data.deletedAtstring | null
data.tagsstringTags 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}

Auth: Bearer token. Permission: screen.view.

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.

ParameterInTypeRequiredDescription
idpathstringyesScreen id.
curl "https://api.brixsignage.com/v1/screens/{id}" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataScreenA screen, composed with its content, live state and health facts.
data.idstringScreen id.
data.spaceIdstringWorkspace id.
data.nodeIdstring | nullLocation (org node) the screen belongs to; null = workspace root.
data.namestring
data.status"online" | "offline" | "pairing"pairing = no device has checked in yet.
data.lastSeenAtstring | nullLast heartbeat or socket ping reply, whichever is later.
data.coreUpdateOfferedAtstring | null
data.contentKind"playlist" | "schedule" | "layout" | "creative" | "app" | "media" | "signage" | nullWhat is assigned. Null = nothing assigned.
data.contentIdstring | null
data.contentFitnullRetired; always null. Fit is set on the content.
data.deactivatedAtstring | nullSet while an operator has deactivated the screen.
data.awaitingPaymentAtstring | nullSet 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.tagsarray of string
data.rotationinteger0, 90, 180 or 270 degrees.
data.rotationCommandedAtstring | null
data.timezonestring | nullIANA time zone; null = inherited.
data.timezoneSource"operator" | "device" | null
data.operatingHoursstringdefault, or a JSON-encoded weekly window.
data.lastPanelCommandstring | null
data.scheduleScreensOffboolean
data.displayPowerMode"always-on" | "follow-schedule" | "os-default"
data.playbackMode"sync" | "unsync" | "device-time"
data.locationLabelstring | null
data.locationLatnumber | null
data.locationLngnumber | null
data.ipCitystring | null
data.ipRegionstring | null
data.ipCountrystring | null
data.ipLatnumber | null
data.ipLngnumber | null
data.ipTimezonestring | null
data.ipGeoAtstring | null
data.playerSettingsstring | nullPlayer settings as a JSON-ENCODED string (not an object).
data.kioskEnabledboolean
data.kioskPinMode"workspace" | "custom"
data.kioskGraceSecondsinteger
data.activeEmergencyIdstring | nullThe live emergency overriding this screen, if any.
data.activeCastIdstring | nullThe live cast overriding this screen, if any.
data.playerVersionHoldstring | null
data.sealedboolean
data.sealedAtstring | null
data.powerPolicyIdstring | null
data.importSourceIdstring | null
data.billingGroupIdstring | null
data.customFieldsstring | nullCustom fields as a JSON-ENCODED string.
data.lanSecretAtstring | nullWhen the local-trigger key was last set or rotated. The key itself is never returned.
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).
data.deletedAtstring | null
data.locationobject | null
data.deviceClaimedbooleanStatus is pairing but a device has claimed it and not yet checked in.
data.nodeNamestring | null
data.groupIdsarray of stringScreen groups this screen is in.
data.contentNamestring | null
data.contentSharedFromstring | nullName of the workspace that shared the assigned content in; null when it is this workspace's own.
data.thumbnailUrlstring | nullPreview of the assigned content.
data.contentAppKeystring | null
data.contentMediaKindstring | null
data.contentStateobject | nullAssigned media that is not playable yet (processing, failed, needs_action); null otherwise.
data.contentOrientation"portrait" | "landscape" | "adaptive" | null
data.liveThumbnailAtstring | nullCapture time of the latest live frame (GET /v1/screens/{id}/live-thumbnail).
data.liveThumbnailFreshAtstring | null
data.currentContentKind"image" | "video" | "stream" | null
data.currentContentPosterUrlstring | null
data.emergencyHeadlinestring | null
data.castHeadlinestring | null
data.castStartedAtstring | null
data.castExpiresAtstring | null
data.castContentKindstring | null
data.castContentIdstring | null
data.kioskHasCustomPinboolean
data.kioskHasRecoveryboolean
data.obscuredSincestring | nullA system dialog is covering the screen since this time.
data.pixelHealth"ok" | "frozen" | "blank" | null
data.displayOffSincestring | null
data.displayOffReason"standby" | "wrong-input" | "disconnected" | "input-unconfirmed" | null
data.expectedDarkobject
data.expectedDark.darkbooleanTrue when the rules say the panel should be off now.
data.expectedDark.reason"schedule-block" | "power-policy" | "operating-hours" | null
data.expectedDark.nextOpenobject | null
data.expectedDark.minutesSinceOpennumber | null
data.expectedDark.minutesSinceClosenumber | null
data.accountHoldobject | null
data.outageSummary30dobject | null
data.linkFlaps10mintegerSocket link flips in the last ten minutes; present only when > 0 (list and get).
data.stateobject | nullThe 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}

Auth: Bearer token. Permission: screen.edit.

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.

ParameterInTypeRequiredDescription
idpathstringyesScreen id.

Request body: application/json

FieldTypeRequiredDescription
namestringno
nodeIdstring | nullnoMove to another location (you need screen.edit there too).
billingGroupIdstring | nullnoNeeds billing.edit.
status"online" | "offline" | "pairing"no
tagsarray of stringno
rotation0 | 90 | 180 | 270no
timezonestring | nullnoIANA time zone; null to inherit.
operatingHoursstringno
displayPowerMode"always-on" | "follow-schedule" | "os-default"no
powerPolicyIdstring | nullno
playbackMode"sync" | "unsync" | "device-time"no
locationobject | nullno
deactivatedbooleannoTrue deactivates the screen (nothing plays); false reactivates it.
playerVersionHoldboolean | string | nullno
playerSettingsobject | nullnoMerged into the current settings; null resets them.
customFieldsobject | nullno
kioskPinMode"workspace" | "custom"no
kioskGraceSecondsnumberno
kioskPinstring | nullno4-8 digits; null clears the custom PIN.
kioskEnabledbooleanno
curl -X PATCH "https://api.brixsignage.com/v1/screens/{id}" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200: Success.

FieldTypeDescription
dataScreenA screen, composed with its content, live state and health facts.
data.idstringScreen id.
data.spaceIdstringWorkspace id.
data.nodeIdstring | nullLocation (org node) the screen belongs to; null = workspace root.
data.namestring
data.status"online" | "offline" | "pairing"pairing = no device has checked in yet.
data.lastSeenAtstring | nullLast heartbeat or socket ping reply, whichever is later.
data.coreUpdateOfferedAtstring | null
data.contentKind"playlist" | "schedule" | "layout" | "creative" | "app" | "media" | "signage" | nullWhat is assigned. Null = nothing assigned.
data.contentIdstring | null
data.contentFitnullRetired; always null. Fit is set on the content.
data.deactivatedAtstring | nullSet while an operator has deactivated the screen.
data.awaitingPaymentAtstring | nullSet 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.tagsarray of string
data.rotationinteger0, 90, 180 or 270 degrees.
data.rotationCommandedAtstring | null
data.timezonestring | nullIANA time zone; null = inherited.
data.timezoneSource"operator" | "device" | null
data.operatingHoursstringdefault, or a JSON-encoded weekly window.
data.lastPanelCommandstring | null
data.scheduleScreensOffboolean
data.displayPowerMode"always-on" | "follow-schedule" | "os-default"
data.playbackMode"sync" | "unsync" | "device-time"
data.locationLabelstring | null
data.locationLatnumber | null
data.locationLngnumber | null
data.ipCitystring | null
data.ipRegionstring | null
data.ipCountrystring | null
data.ipLatnumber | null
data.ipLngnumber | null
data.ipTimezonestring | null
data.ipGeoAtstring | null
data.playerSettingsstring | nullPlayer settings as a JSON-ENCODED string (not an object).
data.kioskEnabledboolean
data.kioskPinMode"workspace" | "custom"
data.kioskGraceSecondsinteger
data.activeEmergencyIdstring | nullThe live emergency overriding this screen, if any.
data.activeCastIdstring | nullThe live cast overriding this screen, if any.
data.playerVersionHoldstring | null
data.sealedboolean
data.sealedAtstring | null
data.powerPolicyIdstring | null
data.importSourceIdstring | null
data.billingGroupIdstring | null
data.customFieldsstring | nullCustom fields as a JSON-ENCODED string.
data.lanSecretAtstring | nullWhen the local-trigger key was last set or rotated. The key itself is never returned.
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).
data.deletedAtstring | null
data.locationobject | null
data.deviceClaimedbooleanStatus is pairing but a device has claimed it and not yet checked in.
data.nodeNamestring | null
data.groupIdsarray of stringScreen groups this screen is in.
data.contentNamestring | null
data.contentSharedFromstring | nullName of the workspace that shared the assigned content in; null when it is this workspace's own.
data.thumbnailUrlstring | nullPreview of the assigned content.
data.contentAppKeystring | null
data.contentMediaKindstring | null
data.contentStateobject | nullAssigned media that is not playable yet (processing, failed, needs_action); null otherwise.
data.contentOrientation"portrait" | "landscape" | "adaptive" | null
data.liveThumbnailAtstring | nullCapture time of the latest live frame (GET /v1/screens/{id}/live-thumbnail).
data.liveThumbnailFreshAtstring | null
data.currentContentKind"image" | "video" | "stream" | null
data.currentContentPosterUrlstring | null
data.emergencyHeadlinestring | null
data.castHeadlinestring | null
data.castStartedAtstring | null
data.castExpiresAtstring | null
data.castContentKindstring | null
data.castContentIdstring | null
data.kioskHasCustomPinboolean
data.kioskHasRecoveryboolean
data.obscuredSincestring | nullA system dialog is covering the screen since this time.
data.pixelHealth"ok" | "frozen" | "blank" | null
data.displayOffSincestring | null
data.displayOffReason"standby" | "wrong-input" | "disconnected" | "input-unconfirmed" | null
data.expectedDarkobject
data.expectedDark.darkbooleanTrue when the rules say the panel should be off now.
data.expectedDark.reason"schedule-block" | "power-policy" | "operating-hours" | null
data.expectedDark.nextOpenobject | null
data.expectedDark.minutesSinceOpennumber | null
data.expectedDark.minutesSinceClosenumber | null
data.accountHoldobject | null
data.outageSummary30dobject | null
data.linkFlaps10mintegerSocket link flips in the last ten minutes; present only when > 0 (list and get).
data.stateobject | nullThe 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.