← All docsThe device contract
GET /d/<token>/image.png returns the screen's current image in its configured format, with headers Content-Length, X-Still-Sleep: <seconds> and ETag. A 200 is never chunked: devices allocate the image buffer from Content-Length before reading the body. With a matching If-None-Match it returns 304 and still sets X-Still-Sleep. Optional query parameters battery (volts), rssi (dBm) and fw (free text) are recorded as telemetry.
GET /d/<token>/sleep returns { "seconds": <n> }.
- The server never answers
200 with anything but a real dashboard image. A render that fails serves the last good image; a screen that has never rendered serves a "waiting for first render" image. Devices are told to keep the old image on any non-200.
- Sleep seconds are computed to the next slot in the screen's schedule, in the screen's time zone, plus 0 to 30 s of jitter so a fleet never wakes in lockstep.