Push custom text/image "frames" to a device. While any frames are set, the device shows only
those frames on loop — the normal clock/announcement/score-reel rotation is skipped entirely
until you clear them. Auth: the device's own X-Device-ID / X-Device-Key
headers (the same ones firmware uses against every other device endpoint).
Replaces the device's content wholesale. Every field except frames itself, and
the content inside each text/image block, is optional — sensible
defaults fill in the rest.
curl -X POST https://api.glowboxlabs.com/v1/device-content/AA:BB:CC:DD:EE:FF \
-H "X-Device-ID: AA:BB:CC:DD:EE:FF" \
-H "X-Device-Key: <your device key>" \
-H "Content-Type: application/json" \
-d '{
"frames": [
{ "text": { "content": "GAME NIGHT 7PM" } },
{
"duration_ms": 4000,
"background_color": "000000",
"text": { "content": "LETS GO", "row": 1, "align": "center", "color": "FFFFFF" },
"image": { "image_base64": "<base64 PNG/JPEG>", "width": 24, "height": 24, "x": 20, "y": 4 }
}
]
}'
| Field | Default | Notes |
|---|---|---|
duration_ms | 4000 | Only meaningful in "paged" display mode; ignored in "scroll" mode, where dwell time follows content width instead. |
background_color | none | Hex, no #. Omitted means no fill rect — just the plain cleared background. |
text.row | vertical-center | 0-3, snaps to the panel's 4-row grid. Omit for a single centered message. |
text.align | center | left | center | right |
text.color | FFFFFF | Hex, no #. |
image.width / height | 24 / 24 | Resized/cropped server-side; capped at 64x32 (the panel size). |
image.x / y | centered | Top-left corner, panel-local pixels. |
Clears stored content and hands control back to the normal rotation. Same headers as above, no body.
curl -X DELETE https://api.glowboxlabs.com/v1/device-content/AA:BB:CC:DD:EE:FF \ -H "X-Device-ID: AA:BB:CC:DD:EE:FF" \ -H "X-Device-Key: <your device key>"
The device's own display mode setting decides how frames render. In paged mode, each
frame is a held card for duration_ms. In scroll mode, frames render back-to-back
as one continuous marquee, the same way the announcement text scrolls — duration_ms
is ignored, and each frame's on-screen time follows its own content width at the device's
configured scroll speed.