Screens API (part 3 of 4)

Screens endpoints in the Brix REST API, part 3 of 4: 13 operations from /v1/screens/{id}/outages, 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/{id}/outages

Auth: Bearer token. Permission: screen.view.

Get the outage history for a screen over the last N days (default 30, capped at the retention window). Each outage includes when it happened, how long it lasted, a plain-language cause such as a Wi-Fi drop or a power cut, and supporting evidence, along with a summary sentence such as "went down 6 times in the last 30 days, all Wi-Fi drops". Planned downtime is listed but excluded from the outage count.

ParameterInTypeRequiredDescription
idpathstringyesScreen id.
daysquerystringnoWindow in days (default 30), capped at the workspace's retention.
limitquerystringnoMost outages to list (default 50).
curl "https://api.brixsignage.com/v1/screens/{id}/outages" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataobject
data.screenIdstring
data.windowDaysinteger
data.retentionDaysinteger
data.summaryOutageSummaryOutages in a window, by cause.
data.summary.windowDaysinteger
data.summary.countintegerUnplanned outages in the window.
data.summary.byCauseobjectOutage count per cause; a cause with none is absent.
data.summary.byCause.power-lossinteger
data.summary.byCause.powered-offinteger
data.summary.byCause.os-rebootinteger
data.summary.byCause.app-crashinteger
data.summary.byCause.app-killed-low-memoryinteger
data.summary.byCause.app-anrinteger
data.summary.byCause.app-restartinteger
data.summary.byCause.wifi-droppedinteger
data.summary.byCause.wifi-weakinteger
data.summary.byCause.wifi-no-internetinteger
data.summary.byCause.ethernet-droppedinteger
data.summary.byCause.brix-unreachableinteger
data.summary.byCause.display-offinteger
data.summary.byCause.sleepinteger
data.summary.byCause.scheduled-offinteger
data.summary.byCause.unknowninteger
data.summary.byCause.power-cycleinteger
data.summary.byCause.network-onlyinteger
data.summary.byBucketobject
data.summary.byBucket.appinteger
data.summary.byBucket.displayinteger
data.summary.byBucket.unknowninteger
data.summary.byBucket.networkinteger
data.summary.byBucket.powerinteger
data.summary.byBucket.brixinteger
data.summary.byBucket.plannedinteger
data.summary.topCausestring | null
data.summary.topCauseSharenumber
data.summary.hedgedSharenumber
data.summary.lastCauseobject | null
data.summary.lastAtstring | null
data.summary.lastKnownCauseobject | null
data.summary.avgRssiDbmnumber | null
data.summary.insightstring | nullThe rollup sentence, e.g. All 6 were Wi-Fi drops.
data.outagesarray of object
data.outages[].idstring
data.outages[].fromstringISO-8601 timestamp (UTC).
data.outages[].tostring | nullNull while the screen is still down.
data.outages[].durationSecinteger | null
data.outages[].openboolean
data.outages[].detectionPathstring
data.outages[].causeobject | null
data.outages[].labelstring | null
data.outages[].sentencestring | null
data.outages[].evidenceobject | null
data.outages[].expectedDarkboolean | nullTrue for planned darkness (operating hours): listed, never counted.
data.outages[].expectedReasonstring | null
data.outages[].selfReportedReasonstring | null
data.outages[].playerVersionstring | null
data.truncatedboolean

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.

GET /v1/screens/{id}/playback-quality

Auth: Bearer token. Permission: screen.view.

Check whether this screen's device is limiting playback quality. The response reports, for each 4K-capable video, whether it plays at full quality or has been reduced because of device limitations or stuttering, along with any hardware upgrade recommendation.

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

Response 200: Success.

FieldTypeDescription
dataobject
data.modelstring | null
data.tierstring | null
data.serves4kbooleanTrue when the device is sent 4K renditions.
data.videos4karray of object
data.videos4k[].idstring
data.videos4k[].namestring
data.videos4k[].demotedboolean
data.videos4k[].servedboolean
data.recommendationstring | null
data.limitedBy"panel" | "decoder" | nullWhy a 4K-tier device is not sent 4K: its panel shows less than 4K, or it has no hardware 4K decoder. Null when not limited.

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.

GET /v1/screens/{id}/preview

Auth: Bearer token. Permission: screen.view.

Preview what a screen would play at a given time, without affecting the actual device. Pass at as an ISO timestamp to preview a different time; it defaults to now. Notes. - data is the player manifest. Content blocks are open objects in the player's own format; v versions it.

ParameterInTypeRequiredDescription
idpathstringyesScreen id.
atquerystringnoISO timestamp to build the preview for; default now.
curl "https://api.brixsignage.com/v1/screens/{id}/preview" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataManifestPreviewWhat the screen would play: the player manifest, built as the device would receive it.
data.vintegerManifest format version.
data.screenobject
data.screen.idstring
data.screen.namestring
data.screen.rotationinteger
data.screen.tagsarray of string
data.generatedAtstringISO-8601 timestamp (UTC).
data.minPlayerVersionstring
data.contentManifestContentBlockResolved content: kind plus the fields for that kind (media, playlist + items, app, layout + zones, creative, signage). The inner shape is the player's format and grows with it.
data.content.kind"none" | "creative" | "signage" | "playlist" | "app" | "media" | "layout"
data.standbyContentManifestContentBlockResolved content: kind plus the fields for that kind (media, playlist + items, app, layout + zones, creative, signage). The inner shape is the player's format and grows with it.
data.standbyContent.kind"none" | "creative" | "signage" | "playlist" | "app" | "media" | "layout"
data.screensOffbooleanTrue when the rules say the panel should be off now.
data.operatingWindowobject | nullWeekly on-hours by weekday key (mon…sun), or null for always on.
data.proofOfPlayboolean
data.doohbooleanTrue when the workspace has advertising on. Players ignore ad pods when this is false.
data.playbackMode"sync" | "unsync" | "device-time"
data.clockobject
data.clock.timeZonestring
data.languagestring
data.locationobject | null
data.playerSettingsobjectEffective player settings (volume, watermark, download policy, …).
data.watermarkTextstring | null
data.watermarkLogoUrlstringThe customer's own logo as the corner mark, on the device-readable media route. Present only for a direct, paying workspace with a Brand Kit logo and the logo switch on. Draw it instead of the text mark; when it fails to load, draw no mark.
data.accountHoldobjectPresent when the account is on hold: the screen shows a hold card, not content.
data.accountHold.statusstring
data.accountHold.reasonstring
data.kioskobjectScreen Lock. The device's PIN material is never returned here — only whether it is set.
data.kiosk.enabledboolean
data.kiosk.graceSecondsinteger
data.kiosk.hasPinboolean
data.kiosk.hasRecoveryboolean
data.apkUpdatePolicyobject
data.apkUpdatePolicy.windowboolean
data.apkUpdatePolicy.hourLocalinteger
data.apkUpdatePolicy.forceAfterDaysinteger
data.apkUpdatePolicy.windowMinutesinteger
data.apkUpdatePolicy.forceboolean
data.apkUpdateobject
data.apkUpdate.versionstring
data.apkUpdate.urlstring
data.apkUpdate.sha256string
data.apkUpdate.signaturestring | null
data.testModetrue
data.testEligibletrue
data.flightRecorderobject
data.flightRecorder.sampleMsnumber
data.flightRecorder.maxEdgenumber
data.flightRecorder.qualitynumber
data.mediaBenchClipUrlstringA short public clip the player decodes off-screen for its media self-test. Absent unless configured.
data.fontsarray of object
data.fonts[].familystring
data.fonts[].urlstring
data.fonts[].weightsarray of integer
data.upcomingBlocksarray of objectThe next scheduled changes, so an offline device can pre-load them.
data.upcomingBlocks[].activatesAtstringISO-8601 timestamp (UTC).
data.upcomingBlocks[].contentManifestContentBlockResolved content: kind plus the fields for that kind (media, playlist + items, app, layout + zones, creative, signage). The inner shape is the player's format and grows with it.
data.upcomingBlocks[].content.kind"none" | "creative" | "signage" | "playlist" | "app" | "media" | "layout"
data.upcomingBlocks[].screensOffboolean
data.retiredMediaIdsarray of stringMedia this workspace deleted from its library in the last 30 days (newest first, at most 200). The device deletes its stored copies. Absent when there are none.
data.nextRefreshAtstringISO-8601 timestamp (UTC).
data.prestagedOverridesarray of objectEmergency templates pre-loaded on the device.
data.prestagedOverrides[].idstring
data.prestagedOverrides[].kind"emergency" | "cast"
data.prestagedOverrides[].severity"info" | "warning" | "critical"
data.prestagedOverrides[].headlinestring
data.prestagedOverrides[].bodystring | null
data.prestagedOverrides[].contentManifestContentBlockResolved content: kind plus the fields for that kind (media, playlist + items, app, layout + zones, creative, signage). The inner shape is the player's format and grows with it.
data.prestagedOverrides[].content.kind"none" | "creative" | "signage" | "playlist" | "app" | "media" | "layout"
data.prestagedOverrides[].triggeredAtstring | null
data.prestagedOverrides[].expiresAtstring | null
data.castobject
data.cast.idstring
data.cast.kind"emergency" | "cast"
data.cast.severity"info" | "warning" | "critical"
data.cast.headlinestring
data.cast.bodystring | null
data.cast.contentManifestContentBlockResolved content: kind plus the fields for that kind (media, playlist + items, app, layout + zones, creative, signage). The inner shape is the player's format and grows with it.
data.cast.content.kind"none" | "creative" | "signage" | "playlist" | "app" | "media" | "layout"
data.cast.triggeredAtstring | null
data.cast.expiresAtstring | null
data.emergencyobject
data.emergency.idstring
data.emergency.kind"emergency" | "cast"
data.emergency.severity"info" | "warning" | "critical"
data.emergency.headlinestring
data.emergency.bodystring | null
data.emergency.contentManifestContentBlockResolved content: kind plus the fields for that kind (media, playlist + items, app, layout + zones, creative, signage). The inner shape is the player's format and grows with it.
data.emergency.content.kind"none" | "creative" | "signage" | "playlist" | "app" | "media" | "layout"
data.emergency.triggeredAtstring | null
data.emergency.expiresAtstring | null
data.sealedtrue
data.brandobject
data.brand.partnerIdstring | null
data.brand.productNamestring
data.brand.logoUrlstring | nullThe logo the screen draws. A screen sits on a dark background, so this is the partner's logo for dark backgrounds when they set one.
data.brand.logoDarkUrlstring | nullThe partner's logo for dark backgrounds, or null.
data.brand.brandColorstring
data.brand.cmsHoststring
data.brand.supportEmailstring
data.brand.termsUrlstring | null
data.brand.privacyUrlstring | null
data.brand.isWhiteLabelboolean

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.

GET /v1/screens/{id}/quality

Auth: Bearer token. Permission: screen.view.

Returns the quality data the screen's Health tab shows: the content items that played badly in the last 7 days (worst first), how often the player started today and why, and the device health readings from the last 24 hours, such as frame gaps, decoder failures, cache clears and the highest temperature.

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

Response 200: Success.

FieldTypeDescription
dataobject
data.problemItemsarray of objectItems that failed or played badly on this screen in the last 7 days, worst first.
data.problemItems[].contentIdstring
data.problemItems[].namestring | null
data.problemItems[].kindstring | null
data.problemItems[].playsinteger
data.problemItems[].failsinteger
data.problemItems[].lastFailReasonstring | null
data.problemItems[].ttffMsMaxnumber | null
data.problemItems[].stallCountinteger
data.problemItems[].stallMsMaxnumber | null
data.problemItems[].blackMsMaxnumber | null
data.problemItems[].dropPctMaxnumber | null
data.problemItems[].seamWorstMsnumber | null
data.problemItems[].pathstring | null
data.problemItems[].srcstring | null
data.problemItems[].daysinteger
data.restartsTodayobjectPlayer starts since 00:00 UTC, per launch reason.
data.restartSummarystring | null
data.mediaBenchobject | nullThe screen's own media self-test (what it can decode), when it has run.
data.signalsobject | nullThe last 24 hours of device-health readings. Null when the screen reported none.

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/{id}/replace-device

Auth: Bearer token. Permission: screen.edit.

Release the device currently paired with a screen, without deleting the screen itself. The screen's name, content, location, and history are kept. Follow up with POST /v1/screens/:id/claim-replacement to pair a new device.

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

Response 200: Success.

FieldTypeDescription
dataobject
data.idstring
data.awaitingReplacementtrue

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.

GET /v1/screens/{id}/resource-pressure

Auth: Bearer token. Permission: screen.view.

Check a screen's storage, memory, and offline cache pressure. The response ranks the content contributing most to that pressure, with suggestions to remove or replace it, and includes hardware upgrade recommendations if relevant.

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

Response 200: Success.

FieldTypeDescription
dataobject
data.severity"none" | "warning" | "critical"
data.resourcesarray of "storage" | "memory" | "cache"The resources under pressure.
data.storageobject
data.storage.severity"none" | "warning" | "critical"
data.storage.freeMbnumber | null
data.storage.totalMbnumber | null
data.storage.freeFracnumber | nullFree as a fraction of total (0–1).
data.storage.headlinestring | null
data.storage.daysLeftnumber | nullDays until full at the recent rate; null when not shrinking.
data.memoryobject
data.memory.severity"none" | "warning" | "critical"
data.memory.freeMbnumber | null
data.memory.totalMbnumber | null
data.memory.freeFracnumber | nullFree as a fraction of total (0–1).
data.memory.headlinestring | null
data.memory.daysLeftnumber | nullDays until full at the recent rate; null when not shrinking.
data.cacheobject
data.cache.severity"none" | "warning" | "critical"
data.cache.cacheableBytesinteger
data.cache.budgetBytesinteger | null
data.cache.ramTotalMbnumber | null
data.cache.videoCountinteger
data.cache.overBytesinteger
data.cache.headlinestring | null
data.heavyContentarray of objectAssigned content that costs the most, with what removing it frees.
data.heavyContent[].kind"layout" | "app" | "media"
data.heavyContent[].idstring
data.heavyContent[].namestring
data.heavyContent[].detailstring
data.heavyContent[].freesMbnumber
data.heavyContent[].estimatedboolean
data.heavyContent[].freesLabelstring
data.heavyContent[].reasonstring
data.hardwareobject | nullA hardware upgrade suggestion, when the device is the limit.
data.summarystring | null

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/{id}/restore

Auth: Bearer token. Permission: screen.delete.

Restore a screen deleted within the last 30 days, and restore its device pairing. A device that has kept its access token reconnects automatically, without needing to be re-paired on site.

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

Response 200: Success.

FieldTypeDescription
dataobject
data.idstring
data.restoredtrue

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 deleted screen with this id.

Response 409: The screen is not deleted, or restoring it would exceed the plan.

Response 5XX: Server error. The body carries a requestId to quote to support.

POST /v1/screens/{id}/revoke-device

Auth: Bearer token. Permission: screen.edit.

Immediately invalidate the access token of the device currently paired with a screen, for example after a device is lost or stolen. The token can no longer be used, including to pair as a new screen. The screen itself is not deleted.

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

Response 200: Success.

FieldTypeDescription
dataobject
data.idstring
data.revokedtrue
data.atstringISO-8601 timestamp (UTC).

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/{id}/rotate-token

Auth: Bearer token. Permission: screen.edit.

Generate a new access token for a screen's paired device, invalidating the previous one immediately. The new token is returned once in the response and cannot be retrieved afterward. Notes. - The response carries the NEW device credential. The device holding the old token is disconnected and must be given this token (or re-paired) to keep playing.

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

Response 200: Success.

FieldTypeDescription
dataobject
data.idstring
data.deviceTokenstringThe new device credential. Shown once; the old token stops working now.
data.rotatedAtstringISO-8601 timestamp (UTC).

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.

GET /v1/screens/{id}/state

Auth: Bearer token. Permission: screen.view.

Get the screen's most recently reported state, including what is currently displayed, the player software version, and its cache and resource status. The device's last heartbeat snapshot (telemetry, cache, current content, pending updates). Free-form: fields vary by player shell and version.

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

Response 200: Success.

FieldTypeDescription
dataobject | nullNull 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.

GET /v1/screens/{id}/telemetry

Auth: Bearer token. Permission: screen.view.

Get the 100 most recent raw telemetry events sent by a screen, newest first, with parsed payload data. Notes. - The newest 100 events.

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

Response 200: Success.

FieldTypeDescription
dataarray of object
data[].idstring
data[].spaceIdstring
data[].screenIdstring
data[].typestring
data[].payloadanyThe event payload (decoded JSON); its shape depends on type.
data[].occurredAtstringISO-8601 timestamp (UTC).
data[].receivedAtstringISO-8601 timestamp (UTC).

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/{id}/trigger

Auth: Bearer token. Permission: screen.edit.

Send a real-time trigger to a screen: refresh, next, go-to-scene, or send-event. The screen receives it immediately.

ParameterInTypeRequiredDescription
idpathstringyesScreen id.

Request body: application/json

FieldTypeRequiredDescription
kind"refresh" | "next" | "prev" | "go-to-page" | "go-to-scene" | "send-event"yes
pageintegernogo-to-page: 1–100.
sceneIdstringnogo-to-scene: the scene to show.
eventstringnosend-event: the event name the content listens for.
payloadstringnosend-event: an optional string payload.
overlayobjectnoA popup shown over what is playing for seconds, then removed. The content underneath does not restart.
overlay.contentKind"media" | "app" | "canvas"yes
overlay.contentIdstringyes
overlay.secondsnumberno1–600 (clamped); default 15.
overlay.position"center" | "top" | "bottom" | "top-left" | "top-right" | "bottom-left" | "bottom-right"noDefault center.
overlay.paramsobjectnoValues passed to the content, e.g. { "table": "4" }.
curl -X POST "https://api.brixsignage.com/v1/screens/{id}/trigger" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 201: Success.

FieldTypeDescription
dataobject
data.idstringThe command id.
data.kind"trigger"
data.triggerobjectThe trigger as stored (only the fields its kind uses).
data.trigger.kindstring
data.trigger.pageinteger
data.trigger.sceneIdstring
data.trigger.eventstring
data.trigger.payloadstring
data.overlayobject
data.overlay.contentKind"media" | "app" | "canvas"
data.overlay.contentIdstring
data.overlay.secondsinteger1–600; default 15.
data.overlay.position"center" | "top" | "bottom" | "top-left" | "top-right" | "bottom-left" | "bottom-right"
data.overlay.paramsobjectValues passed to the content, e.g. { "table": "4" }.

Response 401: Missing, expired or revoked bearer token.

Response 403: The token lacks the permission this operation needs (see x-brix-permission).

Response 422: Not a valid trigger, or the overlay content is not in this workspace.

Response 5XX: Server error. The body carries a requestId to quote to support.

POST /v1/screens/{id}/unpower-and-delete

Auth: Bearer token. Permission: screen.delete.

Retire a screen in one action: turn off the physical display, unpair the device, and delete the screen. The screen can be recovered within 30 days.

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

Response 200: Success.

FieldTypeDescription
dataobject
data.idstring
data.deletedtrue
data.commandIdstringThe cec-off command sent before the device was unpaired.

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.