Skip to content
Hoody.com

Use these endpoints to drive low-level interaction with a running display container: dispatch synthetic mouse and keyboard events, manage windows, read on-screen geometry, and capture screenshots. Every endpoint targets the container’s display service and supports the optional displayId query parameter to override the hostname instance segment.

The base URL for all examples below is https://{projectId}-{containerId}-display-1.{server}.containers.hoody.com.

GET /api/v1/display/input/display-geometry

Section titled “GET /api/v1/display/input/display-geometry”

Returns the dimensions of the display.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
Terminal window
curl -X GET "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/input/display-geometry" \
-H "Authorization: Bearer $HOODY_TOKEN"

Returns the current cursor position and the window beneath it.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
Terminal window
curl -X GET "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/mouse/location" \
-H "Authorization: Bearer $HOODY_TOKEN"

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

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

Returns the position and size of a window by ID.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
windowIdpathstringYesWindow ID (decimal or hex)
Terminal window
curl -X GET "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/window/12345/geometry" \
-H "Authorization: Bearer $HOODY_TOKEN"

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

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

Returns the title of a window by ID.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
windowIdpathstringYesWindow ID (decimal or hex)
Terminal window
curl -X GET "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/window/12345/name" \
-H "Authorization: Bearer $HOODY_TOKEN"

Returns the ID of the currently focused window.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
Terminal window
curl -X GET "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/window/active" \
-H "Authorization: Bearer $HOODY_TOKEN"

Executes a single named action with an optional screenshot capture.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
actionstringYesAction path (e.g. mouse/click, keyboard/type)
paramsobjectNoAction-specific parameters
screenshotbooleanNoCapture screenshot after action. Default: true
screenshotDelayintegerNoDelay before screenshot in milliseconds. Default: 100
screenshotRegionstringNoCrop region in format x1,y1,x2,y2
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/input/act" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"action":"mouse/click","params":{"button":1},"screenshot":true}'

Executes a sequence of actions atomically and returns per-action results.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
actionsarrayYesOrdered list of actions to execute (1-50 items). Each item has action (string, required) and params (object, optional).
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/input/batch" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"actions":[{"action":"mouse/move","params":{"x":100,"y":100}},{"action":"mouse/click","params":{"button":1}}]}'

Moves the cursor to a position and clicks.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
xintegerYesTarget X coordinate
yintegerYesTarget Y coordinate
buttonintegerNoMouse button (1=left, 2=middle, 3=right, 4-7=extra). Default: 1
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/input/click-at" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"x":250,"y":140,"button":1}'

Drags from a start point to an end point.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
startXintegerYesStart X coordinate
startYintegerYesStart Y coordinate
endXintegerYesEnd X coordinate
endYintegerYesEnd Y coordinate
buttonintegerNoMouse button (1=left, 2=middle, 3=right, 4-7=extra). Default: 1
stepsintegerNoNumber of intermediate mouse positions for smooth drag (1-1000)
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/input/drag" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startX":100,"startY":100,"endX":500,"endY":500,"steps":20}'

Emergency release of all held inputs (mouse buttons and keys).

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/input/reset" \
-H "Authorization: Bearer $HOODY_TOKEN"

Selects a range by clicking the start point and shift-clicking the end point.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
xintegerYesStart X coordinate
yintegerYesStart Y coordinate
endXintegerYesEnd X coordinate
endYintegerYesEnd Y coordinate
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/input/select" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"x":120,"y":80,"endX":420,"endY":280}'

Moves to a position, clicks to focus, and types text — all in one call.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
xintegerYesTarget X coordinate
yintegerYesTarget Y coordinate
textstringYesText to type (max 10000 chars)
delayintegerNoInter-keystroke delay in milliseconds (0-1000)
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/input/type-at" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"x":300,"y":200,"text":"hello world","delay":10}'

Waits for a specified duration and optionally captures a screenshot.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
msintegerYesWait duration in milliseconds (50-30000)
screenshotbooleanNoCapture screenshot after wait. Default: false
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/input/wait" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"ms":500,"screenshot":true}'

Presses one or more key combinations. Each element of keys is pressed in sequence.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
keysarrayYesKey combinations (e.g. ["ctrl+c", "Return"]); 1-20 items, max 100 chars each
windowinteger | stringNoTarget window ID (decimal or hex)
delayintegerNoDelay in milliseconds (0-5000)
clearModifiersbooleanNoClear modifier keys before pressing
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/keyboard/key" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keys":["ctrl+a","Delete"],"clearModifiers":true}'

Holds a single key down. Pair with key-up to release.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
keystringYesKey name (X11 keysym, e.g. Shift_L, ctrl); max 100 chars
windowinteger | stringNoTarget window ID
holdMsintegerNoAuto-release after this many milliseconds (100-60000)
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/keyboard/key-down" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"key":"Shift_L","holdMs":2000}'

Releases a key previously held with key-down.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
keystringYesKey name (X11 keysym); max 100 chars
windowinteger | stringNoTarget window ID
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/keyboard/key-up" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"key":"Shift_L"}'

Types a string of text into the focused window.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
textstringYesText to type (max 10000 chars)
windowinteger | stringNoTarget window ID
delayintegerNoInter-keystroke delay in milliseconds (0-1000)
clearModifiersbooleanNoClear modifier keys before typing
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/keyboard/type" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"text":"The quick brown fox.","delay":5}'

Clicks the mouse button at the current cursor position.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
buttonintegerNoMouse button (1=left, 2=middle, 3=right, 4-7=extra). Default: 1
repeatintegerNoNumber of repeated clicks (1-100). Default: 1
delayintegerNoDelay between repeats in milliseconds (0-5000)
windowinteger | stringNoTarget window ID (decimal or hex 0x...)
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/mouse/click" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"button":1,"repeat":1}'

Double-clicks the mouse button at the current cursor position.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
buttonintegerNoMouse button (1=left, 2=middle, 3=right, 4-7=extra). Default: 1
windowinteger | stringNoTarget window ID
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/mouse/double-click" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"button":1}'

Presses and holds a mouse button. Pair with mouse/up to release, or set holdMs to auto-release.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
buttonintegerNoMouse button (1=left, 2=middle, 3=right, 4-7=extra). Default: 1
windowinteger | stringNoTarget window ID
holdMsintegerNoAuto-release after this many milliseconds (100-60000)
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/mouse/down" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"button":1,"holdMs":1500}'

Moves the cursor to an absolute screen coordinate.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
xintegerYesTarget X coordinate (-65535 to 65535)
yintegerYesTarget Y coordinate (-65535 to 65535)
windowinteger | stringNoTarget window ID
screenintegerNoTarget screen index (0-15)
syncbooleanNoWait for the move to settle before returning
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/mouse/move" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"x":640,"y":360,"screen":0}'

Moves the cursor by a relative offset from its current position.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
xintegerYesHorizontal offset
yintegerYesVertical offset
syncbooleanNoWait for the move to settle before returning
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/mouse/move-relative" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"x":50,"y":-20}'

Scrolls in one of four directions.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
directionstringYesScroll direction. One of: up, down, left, right
clicksintegerNoNumber of scroll clicks (1-100). Default: 5
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/mouse/scroll" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"direction":"down","clicks":5}'

Releases a mouse button previously held with mouse/down.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
buttonintegerNoMouse button (1=left, 2=middle, 3=right, 4-7=extra). Default: 1
windowinteger | stringNoTarget window ID
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/mouse/up" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"button":1}'

Closes a window by ID.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
windowIdinteger | stringYesWindow ID (decimal or hex 0x...)
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/window/close" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"windowId":12345}'

Focuses (activates) a window by ID.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
windowIdinteger | stringYesWindow ID (decimal or hex 0x...)
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/window/focus" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"windowId":12345}'

Minimizes a window by ID.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
windowIdinteger | stringYesWindow ID (decimal or hex 0x...)
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/window/minimize" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"windowId":12345}'

Moves a window to a new position. Use relative: true to offset from the current position.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
windowIdinteger | stringYesWindow ID (decimal or hex 0x...)
xintegerYesTarget X coordinate
yintegerYesTarget Y coordinate
syncbooleanNoWait for the move to settle before returning
relativebooleanNoTreat x/y as offsets from the current position
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/window/move" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"windowId":12345,"x":50,"y":50}'

Raises a window to the top of the stacking order.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
windowIdinteger | stringYesWindow ID (decimal or hex 0x...)
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/window/raise" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"windowId":12345}'

Resizes a window.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
windowIdinteger | stringYesWindow ID (decimal or hex 0x...)
widthintegerYesNew width (min 0)
heightintegerYesNew height (min 0)
syncbooleanNoWait for the resize to settle before returning
useHintsbooleanNoUse WM size hints instead of forcing the window manager to resize
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/window/resize" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"windowId":12345,"width":1024,"height":768}'

Searches for windows whose name, class, or classname matches a regex pattern.

NameInTypeRequiredDescription
displayIdqueryintegerNoDisplay ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
NameTypeRequiredDescription
patternstringYesSearch pattern (regex); max 200 chars
namebooleanNoSearch by window name/title
classbooleanNoSearch by window class
classnamebooleanNoSearch by window classname
onlyVisiblebooleanNoOnly return visible windows
Terminal window
curl -X POST "https://67e89abc123def456789abcd-890abcdef12345678901cdef-display-1.node-us.containers.hoody.com/api/v1/display/window/search" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"pattern":"^Terminal","name":true,"onlyVisible":true}'