Device Content API

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).

POST /v1/device-content/{deviceID}

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 }
      }
    ]
  }'
FieldDefaultNotes
duration_ms4000Only meaningful in "paged" display mode; ignored in "scroll" mode, where dwell time follows content width instead.
background_colornoneHex, no #. Omitted means no fill rect — just the plain cleared background.
text.rowvertical-center0-3, snaps to the panel's 4-row grid. Omit for a single centered message.
text.aligncenterleft | center | right
text.colorFFFFFFHex, no #.
image.width / height24 / 24Resized/cropped server-side; capped at 64x32 (the panel size).
image.x / ycenteredTop-left corner, panel-local pixels.

DELETE /v1/device-content/{deviceID}

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>"

Paged vs. scroll

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.