Send low-level input events — mouse clicks, keyboard keys, drags, scrolls, and window management commands — to a connected display host. These endpoints let you automate GUI interactions, query display and window state, and manage windows programmatically. Every endpoint targets a single display, identified either by the *-display-N.* hostname pattern or the displayId query parameter.
Note
All action endpoints return a common display_InputActionResponse shape with success, action, and details fields. Endpoints that return screenshots include a screenshot object with a base64-encoded image and timestamp.
Get the dimensions of the display (width, height, and screen index).
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
curl -X GET " https://display.local/api/v1/display/input/display-geometry?displayId=1 "
const { data } = await client . display . input . geometry ( { displayId: 1 } );
Get the current cursor position, including the screen index and window under the cursor.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
curl -X GET " https://display.local/api/v1/display/mouse/location?displayId=1 "
const { data } = await client . display . input . mouseLocation ( { displayId: 1 } );
Get the position and size of a specific window.
Name In Type Required Description windowIdpath string Yes Window ID (decimal or hex). displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
curl -X GET " https://display.local/api/v1/display/window/0x80010/geometry?displayId=1 "
const { data } = await client . display . input . windowGeometry ( {
Get the title of a specific window.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999 windowIdpath string Yes Window ID (decimal or hex)
curl -X GET " https://display.local/api/v1/display/window/0x80010/name?displayId=1 "
const { data } = await client . display . input . windowName ( {
"name" : " Terminal — bash "
Get the ID of the currently focused (active) window.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
curl -X GET " https://display.local/api/v1/display/window/active?displayId=1 "
const { data } = await client . display . input . windowActive ( { displayId: 1 } );
Execute a single named action (e.g. mouse/click, keyboard/type) with an optional post-action screenshot.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
Field Type Required Description actionstring Yes Action path (e.g. mouse/click, keyboard/type). Max length: 50. paramsobject No Action-specific parameters. Default: {}. screenshotboolean No Capture screenshot after action. Default: true. screenshotDelayinteger No Delay before screenshot in milliseconds. Range: 0–5000. Default: 100. screenshotRegionstring No Crop region in format x1,y1,x2,y2. Pattern: ^\d+,\d+,\d+,\d+$. Max length: 40.
curl -X POST " https://display.local/api/v1/display/input/act?displayId=1 " \
-H " Content-Type: application/json " \
"params": { "x": 540, "y": 320, "button": 1 },
const { data } = await client . display . input . act ( {
params: { x: 540 , y: 320 , button: 1 },
"timestamp" : " 2025-01-15T10:30:00.000Z " ,
"data" : " iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB... " ,
"dataUrl" : " data:image/png;base64,iVBORw0KGgoAAAANSUhEUg... "
Execute a sequence of actions in order. Returns per-action results for completed, failed, and skipped actions.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description actionsarray Yes Array of actions to execute. 1–50 items. actions[].actionstring Yes Action path (e.g. mouse/click, keyboard/type). actions[].paramsobject No Action-specific parameters.
curl -X POST " https://display.local/api/v1/display/input/batch?displayId=1 " \
-H " Content-Type: application/json " \
{ "action": "mouse/click", "params": { "x": 100, "y": 200 } },
{ "action": "keyboard/type", "params": { "text": "hello" } },
{ "action": "keyboard/key", "params": { "keys": ["Return"] } }
const { data } = await client . display . input . batch ( {
{ action: " mouse/click " , params: { x: 100 , y: 200 } },
{ action: " keyboard/type " , params: { text: " hello " } },
{ action: " keyboard/key " , params: { keys: [ " Return " ] } }
{ "index" : 0 , "action" : " mouse/click " , "success" : true },
{ "index" : 1 , "action" : " keyboard/type " , "success" : true },
{ "index" : 2 , "action" : " keyboard/key " , "success" : true }
"error" : " Coordinates out of bounds "
Move the cursor to a position and click a mouse button in a single operation.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description xinteger Yes X coordinate. yinteger Yes Y coordinate. buttoninteger No Mouse button (1=left, 2=middle, 3=right, 4–7=extra). Default: 1.
curl -X POST " https://display.local/api/v1/display/input/click-at?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "x": 540, "y": 320, "button": 1 } '
const { data } = await client . display . input . clickAt ( {
data: { x: 540 , y: 320 , button: 1 }
Drag from a start position to an end position with optional step count for smooth movement.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description startXinteger Yes Starting X coordinate. startYinteger Yes Starting Y coordinate. endXinteger Yes Ending X coordinate. endYinteger Yes Ending Y coordinate. buttoninteger No Mouse button (1=left, 2=middle, 3=right, 4–7=extra). Default: 1. stepsinteger No Number of intermediate mouse positions for smooth drag. Range: 1–1000.
curl -X POST " https://display.local/api/v1/display/input/drag?displayId=1 " \
-H " Content-Type: application/json " \
const { data } = await client . display . input . drag ( {
Emergency release all held inputs — releases any keys or mouse buttons currently held down. No request body.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
curl -X POST " https://display.local/api/v1/display/input/reset?displayId=1 "
const { data } = await client . display . input . reset ( { displayId: 1 } );
"released" : [ " Shift_L " , " Button1 " ]
Select a range by clicking at a start position and shift-clicking at an end position.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1-999999
Field Type Required Description xinteger Yes Start X coordinate. yinteger Yes Start Y coordinate. endXinteger Yes End X coordinate. endYinteger Yes End Y coordinate.
curl -X POST " https://display.local/api/v1/display/input/select?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "x": 200, "y": 300, "endX": 600, "endY": 300 } '
const { data } = await client . display . input . select ( {
data: { x: 200 , y: 300 , endX: 600 , endY: 300 }
"start" : { "x" : 200 , "y" : 300 },
"end" : { "x" : 600 , "y" : 300 }
Move the cursor to a position, click, and type text in one operation.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description xinteger Yes X coordinate to click. yinteger Yes Y coordinate to click. textstring Yes Text to type. Max length: 10000. delayinteger No Inter-keystroke delay in milliseconds. Range: 0–1000.
curl -X POST " https://display.local/api/v1/display/input/type-at?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "x": 540, "y": 320, "text": "user@example.com", "delay": 10 } '
const { data } = await client . display . input . typeAt ( {
data: { x: 540 , y: 320 , text: " user@example.com " , delay: 10 }
Wait for a specified duration, with an optional screenshot capture after the wait.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description msinteger Yes Wait duration in milliseconds. Range: 50–30000. screenshotboolean No Capture screenshot after wait. Default: false.
curl -X POST " https://display.local/api/v1/display/input/wait?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "ms": 2000, "screenshot": true } '
const { data } = await client . display . input . wait ( {
data: { ms: 2000 , screenshot: true }
"timestamp" : " 2025-01-15T10:30:02.000Z " ,
"data" : " iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB... " ,
"dataUrl" : " data:image/png;base64,iVBORw0KGgoAAAANSUhEUg... "
Press one or more key combinations (e.g. ctrl+c, Return). Keys are pressed and released sequentially.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description keysarray Yes Key combinations (e.g. ["ctrl+c", "Return"]). 1–20 items. Each max length: 100. windowinteger | string No Target window ID. delayinteger No Delay between keys in milliseconds. Range: 0–5000. clearModifiersboolean No Clear modifier keys before pressing.
curl -X POST " https://display.local/api/v1/display/keyboard/key?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "keys": ["ctrl+c"] } '
const { data } = await client . display . input . keyboardKey ( {
data: { keys: [ " ctrl+c " ] }
Press and hold a key. Use the matching key-up endpoint to release it, or set holdMs for auto-release.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description keystring Yes Key name (X11 keysym, e.g. Shift_L, ctrl). Max length: 100. windowinteger | string No Target window ID. holdMsinteger No Auto-release after this many milliseconds. Range: 100–60000.
curl -X POST " https://display.local/api/v1/display/keyboard/key-down?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "key": "Shift_L", "holdMs": 3000 } '
const { data } = await client . display . input . keyboardKeyDown ( {
data: { key: " Shift_L " , holdMs: 3000 }
Release a previously held key.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description keystring Yes Key name (X11 keysym). Max length: 100. windowinteger | string No Target window ID.
curl -X POST " https://display.local/api/v1/display/keyboard/key-up?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "key": "Shift_L" } '
const { data } = await client . display . input . keyboardKeyUp ( {
Type a string of text, sending each character as a keystroke.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description textstring Yes Text to type. Max length: 10000. windowinteger | string No Target window ID. delayinteger No Inter-keystroke delay in milliseconds. Range: 0–1000. clearModifiersboolean No Clear modifier keys before typing.
curl -X POST " https://display.local/api/v1/display/keyboard/type?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "text": "Hello, world!", "delay": 5 } '
const { data } = await client . display . input . keyboardType ( {
data: { text: " Hello, world! " , delay: 5 }
Click a mouse button at the current cursor position, optionally repeating with a delay.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description buttoninteger No Mouse button (1=left, 2=middle, 3=right, 4–7=extra). Default: 1. repeatinteger No Number of times to repeat the click. Range: 1–100. Default: 1. delayinteger No Delay between repeats in milliseconds. Range: 0–5000. windowinteger | string No Target window ID (decimal or hex 0x...).
curl -X POST " https://display.local/api/v1/display/mouse/click?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "button": 1, "repeat": 1 } '
const { data } = await client . display . input . mouseClick ( {
data: { button: 1 , repeat: 1 }
Double-click a mouse button at the current cursor position.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description buttoninteger No Mouse button. Range: 1–7. Default: 1. windowinteger | string No Target window ID.
curl -X POST " https://display.local/api/v1/display/mouse/double-click?displayId=1 " \
-H " Content-Type: application/json " \
const { data } = await client . display . input . mouseDoubleClick ( {
"action" : " double-click " ,
Press and hold a mouse button. Use the matching mouse/up endpoint to release it, or set holdMs for auto-release.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description buttoninteger No Mouse button. Range: 1–7. Default: 1. windowinteger | string No Target window ID. holdMsinteger No Auto-release after this many milliseconds. Range: 100–60000.
curl -X POST " https://display.local/api/v1/display/mouse/down?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "button": 1, "holdMs": 5000 } '
const { data } = await client . display . input . mouseDown ( {
data: { button: 1 , holdMs: 5000 }
Move the cursor to an absolute position on the display.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description xinteger Yes Target X coordinate. Range: -65535 to 65535. yinteger Yes Target Y coordinate. Range: -65535 to 65535. windowinteger | string No Target window ID. screeninteger No Screen index. Range: 0–15. syncboolean No Synchronize the move event.
curl -X POST " https://display.local/api/v1/display/mouse/move?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "x": 540, "y": 320 } '
const { data } = await client . display . input . mouseMove ( {
Move the cursor by a relative offset from its current position.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description xinteger Yes Horizontal offset in pixels. yinteger Yes Vertical offset in pixels. syncboolean No Synchronize the move event.
curl -X POST " https://display.local/api/v1/display/mouse/move-relative?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "x": 50, "y": -20 } '
const { data } = await client . display . input . mouseMoveRelative ( {
"action" : " mouse-move-relative " ,
Scroll in a specified direction with a configurable number of click units.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description directionstring Yes Scroll direction. One of: up, down, left, right. clicksinteger No Number of scroll click units. Range: 1–100. Default: 5.
curl -X POST " https://display.local/api/v1/display/mouse/scroll?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "direction": "down", "clicks": 3 } '
const { data } = await client . display . input . mouseScroll ( {
data: { direction: " down " , clicks: 3 }
Release a previously held mouse button.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description buttoninteger No Mouse button. Range: 1–7. Default: 1. windowinteger | string No Target window ID.
curl -X POST " https://display.local/api/v1/display/mouse/up?displayId=1 " \
-H " Content-Type: application/json " \
const { data } = await client . display . input . mouseUp ( {
Close a window by its ID.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description windowIdinteger | string Yes Window ID (decimal or hex 0x...).
curl -X POST " https://display.local/api/v1/display/window/close?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "windowId": "0x80010" } '
const { data } = await client . display . input . windowClose ( {
data: { windowId: " 0x80010 " }
"action" : " window-close " ,
Focus (activate) a window by its ID, bringing it to the foreground.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description windowIdinteger | string Yes Window ID (decimal or hex 0x...).
curl -X POST " https://display.local/api/v1/display/window/focus?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "windowId": "0x80010" } '
const { data } = await client . display . input . windowFocus ( {
data: { windowId: " 0x80010 " }
"action" : " window-focus " ,
Minimize (iconify) a window by its ID.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description windowIdinteger | string Yes Window ID (decimal or hex 0x...).
curl -X POST " https://display.local/api/v1/display/window/minimize?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "windowId": "0x80010" } '
const { data } = await client . display . input . windowMinimize ( {
data: { windowId: " 0x80010 " }
"action" : " window-minimize " ,
Move a window to a new position. Use relative: true to move by an offset from the current position.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description windowIdinteger | string Yes Window ID (decimal or hex 0x...). xinteger Yes Target X coordinate (or relative offset if relative is true). yinteger Yes Target Y coordinate (or relative offset if relative is true). syncboolean No Synchronize the move event. relativeboolean No Interpret x and y as relative offsets.
curl -X POST " https://display.local/api/v1/display/window/move?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "windowId": "0x80010", "x": 100, "y": 50 } '
const { data } = await client . display . input . windowMove ( {
data: { windowId: " 0x80010 " , x: 100 , y: 50 }
Raise a window to the top of the stacking order so it appears above other windows.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description windowIdinteger | string Yes Window ID (decimal or hex 0x...).
curl -X POST " https://display.local/api/v1/display/window/raise?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "windowId": "0x80010" } '
const { data } = await client . display . input . windowRaise ( {
data: { windowId: " 0x80010 " }
"action" : " window-raise " ,
Resize a window to a specific width and height.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description windowIdinteger | string Yes Window ID (decimal or hex 0x...). widthinteger Yes Target width in pixels. Minimum: 0. heightinteger Yes Target height in pixels. Minimum: 0. syncboolean No Synchronize the resize event. useHintsboolean No Use X11 size hints when resizing.
curl -X POST " https://display.local/api/v1/display/window/resize?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "windowId": "0x80010", "width": 1024, "height": 768 } '
const { data } = await client . display . input . windowResize ( {
data: { windowId: " 0x80010 " , width: 1024 , height: 768 }
"action" : " window-resize " ,
Search for windows by a regex pattern matched against window name, class, or classname.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999.
Field Type Required Description patternstring Yes Search pattern (regex). Max length: 200. nameboolean No Search by window name/title. classboolean No Search by window class. classnameboolean No Search by window classname. onlyVisibleboolean No Only return visible windows.
curl -X POST " https://display.local/api/v1/display/window/search?displayId=1 " \
-H " Content-Type: application/json " \
-d ' { "pattern": "Terminal", "name": true, "onlyVisible": true } '
const { data } = await client . display . input . windowSearch ( {
data: { pattern: " Terminal " , name: true , onlyVisible: true }
"windows" : [ 524304 , 524310 , 524322 ]