Skip to content
Hoody.com

The Display Screenshot API captures, retrieves, and manages visual state from a running container’s X11 display. Use these endpoints to grab a fresh PNG for monitoring or vision pipelines, browse the screenshot history by Unix timestamp, fetch compact thumbnails for UI overviews, inspect the window tree, and read or write the clipboard buffer. Image responses are available as raw PNG bytes (the default) or as a base64 JSON envelope for clients that cannot handle binary payloads.

Returns information about the current display, including all available screenshots. This is the standardized equivalent of /display.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
Terminal window
curl -X GET 'https://{projectId}-{containerId}-display-1.{server}.containers.hoody.com/api/v1/display/info' \
-H 'Authorization: Bearer <token>'

Returns a list of all available screenshots for the current display with their metadata.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
Terminal window
curl -X GET 'https://{projectId}-{containerId}-display-1.{server}.containers.hoody.com/api/v1/display/screenshots' \
-H 'Authorization: Bearer <token>'

Captures a fresh screenshot of the display and returns the image file. By default, the response is a binary PNG; pass base64=true to receive a JSON envelope instead.

A capture spans the whole screen, so these are screen coordinates: the same ones POST /input/click-at takes and GET /input/display-geometry describes. The cropped image starts at x1,y1: its pixel (x, y) is screen point (x1 + x, y1 + y).

NameInTypeRequiredDescription
base64querybooleanNoReturn a base64-encoded JSON response instead of a binary image. Accepted values: true, 1, or empty for base64; false, 0 for binary (default).
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
regionquerystringNoCrop the returned image to x1,y1,x2,y2. Minimum 10x10 px, maximum 65535 on each axis, x2 > x1 and y2 > y1; anything else is a 400. A capture spans the whole screen, so these are screen coordinates: the same ones POST /input/click-at takes and GET /input/display-geometry describes. The cropped image starts at x1,y1: its pixel (x, y) is screen point (x1 + x, y1 + y).
cursorquerybooleanNoInclude the pointer position in the response. Only affects the base64 JSON form. Accepted values: true, 1, or empty. Anything else is off.
Terminal window
curl -X GET 'https://{projectId}-{containerId}-display-1.{server}.containers.hoody.com/api/v1/display/screenshot?base64=true' \
-H 'Authorization: Bearer <token>'

GET /api/v1/display/screenshot/{timestamp}

Section titled “GET /api/v1/display/screenshot/{timestamp}”

Retrieves a previously captured screenshot using its Unix timestamp.

NameInTypeRequiredDescription
timestamppathstringYesUnix timestamp of the screenshot. Use the timestamp field returned by screenshot metadata/list endpoints. Do not use timestamp_human for path queries. Must be numeric only for security.
base64querybooleanNoReturn a base64-encoded JSON response instead of a binary image. Accepted values: true, 1, or empty for base64; false, 0 for binary (default).
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
Terminal window
curl -X GET 'https://{projectId}-{containerId}-display-1.{server}.containers.hoody.com/api/v1/display/screenshot/1749541160?base64=true' \
-H 'Authorization: Bearer <token>'

Captures a fresh screenshot but returns only the metadata, with no image bytes in the body.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
Terminal window
curl -X GET 'https://{projectId}-{containerId}-display-1.{server}.containers.hoody.com/api/v1/display/screenshot/info' \
-H 'Authorization: Bearer <token>'

Returns the most recently captured screenshot.

NameInTypeRequiredDescription
base64querybooleanNoReturn a base64-encoded JSON response instead of a binary image. Accepted values: true, 1, or empty for base64; false, 0 for binary (default).
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
Terminal window
curl -X GET 'https://{projectId}-{containerId}-display-1.{server}.containers.hoody.com/api/v1/display/screenshot/last?base64=true' \
-H 'Authorization: Bearer <token>'

Returns metadata about the most recent screenshot without downloading the image.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
Terminal window
curl -X GET 'https://{projectId}-{containerId}-display-1.{server}.containers.hoody.com/api/v1/display/screenshot/last/info' \
-H 'Authorization: Bearer <token>'

A thumbnail is the capture scaled to 20% (ImageMagick convert -resize 20%), not a fixed size. A seamless capture’s dimensions follow the windows it composited, so the thumbnail’s do too.

Captures a fresh screenshot and returns a thumbnail of it.

NameInTypeRequiredDescription
base64querybooleanNoReturn a base64-encoded JSON response instead of a binary image. Accepted values: true, 1, or empty for base64; false, 0 for binary (default).
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
Terminal window
curl -X GET 'https://{projectId}-{containerId}-display-1.{server}.containers.hoody.com/api/v1/display/thumbnail?base64=true' \
-H 'Authorization: Bearer <token>'

Retrieves the thumbnail for a specific screenshot by its Unix timestamp.

NameInTypeRequiredDescription
timestamppathstringYesUnix timestamp of the screenshot. Use the timestamp field returned by screenshot metadata/list endpoints. Do not use timestamp_human for path queries. Must be numeric only for security.
base64querybooleanNoReturn a base64-encoded JSON response instead of a binary image. Accepted values: true, 1, or empty for base64; false, 0 for binary (default).
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
Terminal window
curl -X GET 'https://{projectId}-{containerId}-display-1.{server}.containers.hoody.com/api/v1/display/thumbnail/1749541160?base64=true' \
-H 'Authorization: Bearer <token>'

Returns the thumbnail of the most recently captured screenshot.

NameInTypeRequiredDescription
base64querybooleanNoReturn a base64-encoded JSON response instead of a binary image. Accepted values: true, 1, or empty for base64; false, 0 for binary (default).
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
Terminal window
curl -X GET 'https://{projectId}-{containerId}-display-1.{server}.containers.hoody.com/api/v1/display/thumbnail/last?base64=true' \
-H 'Authorization: Bearer <token>'

Lists the windows currently known to the display.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
onlyVisiblequerybooleanNoIf true, drop windows carrying _NET_WM_STATE_HIDDEN. A minimized window carries that state, so this does exclude minimized windows. It is a different test from the onlyVisible on window/search and input/wait-until, which ask the X server whether the window is viewable and, under xpra, still match a minimized one.
Terminal window
curl -X GET 'https://{projectId}-{containerId}-display-1.{server}.containers.hoody.com/api/v1/display/windows?onlyVisible=true' \
-H 'Authorization: Bearer <token>'

GET /api/v1/display/window/{windowId}/properties

Section titled “GET /api/v1/display/window/{windowId}/properties”

Returns extended properties (WM class, WM name, role, PID, state, type, transient parent) for a single window.

NameInTypeRequiredDescription
windowIdpathstringYesWindow ID, supplied as a decimal integer or hex 0x... value.
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
Terminal window
curl -X GET 'https://{projectId}-{containerId}-display-1.{server}.containers.hoody.com/api/v1/display/window/12345/properties' \
-H 'Authorization: Bearer <token>'

Reads the current text content of the display’s clipboard buffer.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
selectionquerystringNoClipboard buffer selection. One of clipboard, primary, secondary. Default: clipboard
Terminal window
curl -X GET 'https://{projectId}-{containerId}-display-1.{server}.containers.hoody.com/api/v1/display/clipboard?selection=clipboard' \
-H 'Authorization: Bearer <token>'

Writes text to the display’s clipboard buffer.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
textstringYesClipboard text content. Maximum length: 1048576 bytes.
selectionstringNoClipboard buffer selection. One of clipboard, primary, secondary. Default: clipboard
Terminal window
curl -X POST 'https://{projectId}-{containerId}-display-1.{server}.containers.hoody.com/api/v1/display/clipboard' \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{"text":"Hello, World!","selection":"clipboard"}'