The Display Input API provides low-level control over mouse, keyboard, and window management on a remote display. Use these endpoints to automate UI interactions, capture screenshots, manipulate windows, and build scripted workflows against a virtualized desktop.
Query the current state of the display, cursor, and windows.
Returns the dimensions of the current display.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
"message" : " No display context available "
"error" : " Internal Server Error " ,
"message" : " Failed to read display geometry "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
const geometry = await client . display . input . geometry ();
Returns the current cursor position, screen, and the 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
"message" : " No display context available "
"error" : " Internal Server Error " ,
"message" : " Failed to read mouse location "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
const location = await client . display . input . mouseLocation ();
Returns the currently active (focused) window ID.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
"message" : " No display context available "
"error" : " Internal Server Error " ,
"message" : " Failed to read active window "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
const active = await client . display . input . windowActive ();
Returns 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
"message" : " No display context available "
"message" : " Window not found "
"error" : " Internal Server Error " ,
"message" : " Failed to read window geometry "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
const geometry = await client . display . input . windowGeometry ( { windowId: " 0x12d687 " } );
Returns the title 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
"name" : " Visual Studio Code "
"message" : " No display context available "
"message" : " Window not found "
"error" : " Internal Server Error " ,
"message" : " Failed to read window name "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
const name = await client . display . input . windowName ( { windowId: " 0x12d687 " } );
Composite actions that bundle multiple low-level operations into a single request.
Executes a single named action (e.g. mouse/click, keyboard/type) with an optional screenshot.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
Name Type Required Default Description actionstring Yes — Action path (e.g. mouse/click, keyboard/type). Max length: 50 paramsobject No {}Action-specific parameters screenshotboolean No trueCapture screenshot after action screenshotDelayinteger No 100Delay before screenshot in milliseconds. Range: 0–5000 screenshotRegionstring No — Crop region in format x1,y1,x2,y2
"timestamp" : " 2026-01-15T12:34:56.000Z " ,
"data" : " iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB... " ,
"dataUrl" : " data:image/png;base64,iVBORw0KGgoAAAANSUhEUg... "
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
const result = await client . display . input . act ( {
params: { x: 540 , y: 312 , button: 1 },
Executes a sequence of actions in order. Up to 50 actions per request.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
Name Type Required Description actionsarray Yes List of actions to execute. 1–50 items
Each action item has the following structure:
Name Type Required Description actionstring Yes Action path (e.g. mouse/click, keyboard/type) paramsobject No Action-specific parameters
{ "index" : 0 , "action" : " mouse/move " , "success" : true },
{ "index" : 1 , "action" : " mouse/click " , "success" : true },
{ "index" : 2 , "action" : " keyboard/type " , "success" : true }
"action" : " keyboard/key " ,
"error" : " Unknown keysym: Foo "
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
const result = await client . display . input . batch ( {
{ action: " mouse/move " , params: { x: 100 , y: 100 } },
{ action: " mouse/click " , params: { button: 1 } },
{ action: " keyboard/type " , params: { text: " hello " } },
Moves the cursor to a coordinate and clicks.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
Name Type Required Default Description xinteger Yes — Target X coordinate yinteger Yes — Target Y coordinate buttoninteger No 1Mouse button (1=left, 2=middle, 3=right, 4–7=extra). Range: 1–7
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . clickAt ({ x: 540 , y: 312 , button: 1 });
Drags the cursor from a start position to 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
Name Type Required Default Description startXinteger Yes — Start X coordinate startYinteger Yes — Start Y coordinate endXinteger Yes — End X coordinate endYinteger Yes — End Y coordinate buttoninteger No 1Mouse button (1=left, 2=middle, 3=right, 4–7=extra). Range: 1–7 stepsinteger No — Number of intermediate mouse positions for smooth drag. Range: 1–1000
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . drag ({
Selects 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
Name Type Required Description xinteger Yes Start X coordinate yinteger Yes Start Y coordinate endXinteger Yes End X coordinate endYinteger Yes End Y coordinate
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . select ({ x: 120 , y: 240 , endX: 480 , endY: 360 });
Moves the cursor to a coordinate, clicks, and types 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
Name Type Required Description xinteger Yes Target X coordinate yinteger Yes Target Y coordinate textstring Yes Text to type. Max length: 10000 delayinteger No Inter-keystroke delay in milliseconds. Range: 0–1000
"text" : " user@example.com " ,
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . typeAt ({ x: 540 , y: 312 , text: " user@example.com " });
Waits for a specified duration, with an optional screenshot on completion.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
Name Type Required Default Description msinteger Yes — Wait duration in milliseconds. Range: 50–30000 screenshotboolean No falseCapture screenshot after wait
"timestamp" : " 2026-01-15T12:34:56.000Z " ,
"data" : " iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB... " ,
"dataUrl" : " data:image/png;base64,iVBORw0KGgoAAAANSUhEUg... "
"message" : " No display context available "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . wait ({ ms: 500 , screenshot: false });
Emergency release of all held inputs (mouse buttons and modifier keys).
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
This endpoint takes no body.
"released" : [ " mouse:1 " , " Shift_L " , " ctrl " ]
"message" : " No display context available "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . reset ();
Send key presses, key combinations, and typed text.
Presses one or more key combinations (e.g. ['ctrl+c', 'Return']).
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
Name 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 key presses in milliseconds. Range: 0–5000 clearModifiersboolean No Clear modifier keys before pressing
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . keyboardKey ({ keys: [ " ctrl+c " ] });
Holds a key down (without releasing it).
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
Name 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
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . keyboardKeyDown ({ key: " Shift_L " , holdMs: 1500 });
Releases 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
Name Type Required Description keystring Yes Key name (X11 keysym, e.g. Shift_L). Max length: 100 windowinteger | string No Target window ID
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . keyboardKeyUp ({ key: " Shift_L " });
Types a string of text 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
Name 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
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . keyboardType ({ text: " Hello, world! " });
Move the cursor, click, hold, release, and scroll.
Clicks a mouse button. Supports repeated clicks with a delay between them.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
Name Type Required Default Description buttoninteger No 1Mouse button (1=left, 2=middle, 3=right, 4–7=extra). Range: 1–7 repeatinteger No 1Number of times to repeat the click. Range: 1–100 delayinteger No — Delay between repeats in milliseconds. Range: 0–5000 windowinteger | string No — Target window ID (decimal or hex 0x...)
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . mouseClick ({ button: 1 , repeat: 2 , delay: 50 });
Double-clicks a mouse button.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
Name Type Required Default Description buttoninteger No 1Mouse button (1=left, 2=middle, 3=right, 4–7=extra). Range: 1–7 windowinteger | string No — Target window ID
"action" : " double-click " ,
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . mouseDoubleClick ({ button: 1 });
Presses and holds a mouse button.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
Name Type Required Default Description buttoninteger No 1Mouse button (1=left, 2=middle, 3=right, 4–7=extra). Range: 1–7 windowinteger | string No — Target window ID holdMsinteger No — Auto-release after this many milliseconds. Range: 100–60000
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . mouseDown ({ button: 1 , holdMs: 1000 });
Releases 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
Name Type Required Default Description buttoninteger No 1Mouse button (1=left, 2=middle, 3=right, 4–7=extra). Range: 1–7 windowinteger | string No — Target window ID
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . mouseUp ({ button: 1 });
Moves 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
Name Type Required Description xinteger Yes Target X coordinate. Range: -65535–65535 yinteger Yes Target Y coordinate. Range: -65535–65535 windowinteger | string No Target window ID screeninteger No Target screen index. Range: 0–15 syncboolean No Wait for the move to complete before returning
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . mouseMove ({ x: 540 , y: 312 , screen: 0 });
Moves 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
Name Type Required Description xinteger Yes Horizontal offset in pixels yinteger Yes Vertical offset in pixels syncboolean No Wait for the move to complete before returning
"action" : " mouse-move-relative " ,
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . mouseMoveRelative ({ x: 25 , y: - 10 });
Scrolls in one of four directions.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
Name Type Required Default Description directionstring Yes — Scroll direction. One of: up, down, left, right clicksinteger No 5Number of scroll clicks. Range: 1–100
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . mouseScroll ({ direction: " down " , clicks: 5 });
Focus, move, resize, close, and search for windows on the display.
Closes a window by ID.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
Name Type Required Description windowIdinteger | string Yes Window ID (decimal or hex 0x...)
"action" : " window-close " ,
"message" : " No display context available "
"message" : " Window not found "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . windowClose ({ windowId: 1234567 });
Activates (focuses) a window by ID.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
Name Type Required Description windowIdinteger | string Yes Window ID (decimal or hex 0x...)
"action" : " window-focus " ,
"message" : " No display context available "
"message" : " Window not found "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . windowFocus ({ windowId: 1234567 });
Minimizes a window by ID.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
Name Type Required Description windowIdinteger | string Yes Window ID (decimal or hex 0x...)
"action" : " window-minimize " ,
"message" : " No display context available "
"message" : " Window not found "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . windowMinimize ({ windowId: 1234567 });
Moves a window to a new position. Supports absolute and relative moves.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
Name Type Required Description windowIdinteger | string Yes Window ID (decimal or hex 0x...) xinteger Yes Target X coordinate yinteger Yes Target Y coordinate syncboolean No Wait for the move to complete before returning relativeboolean No Treat coordinates as relative to the current position
"message" : " No display context available "
"message" : " Window not found "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . windowMove ({ windowId: 1234567 , x: 100 , y: 50 });
Raises a window to the top of the stacking order.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
Name Type Required Description windowIdinteger | string Yes Window ID (decimal or hex 0x...)
"action" : " window-raise " ,
"message" : " No display context available "
"message" : " Window not found "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . windowRaise ({ windowId: 1234567 });
Resizes a window to a new 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
Name Type Required Description windowIdinteger | string Yes Window ID (decimal or hex 0x...) widthinteger Yes New window width. Minimum: 0 heightinteger Yes New window height. Minimum: 0 syncboolean No Wait for the resize to complete before returning useHintsboolean No Send resize as a size-hint instead of forcing a new size
"action" : " window-resize " ,
"message" : " No display context available "
"message" : " Window not found "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
await client . display . input . windowResize ({ windowId: 1234567 , width: 1280 , height: 720 });
Searches for windows matching a regex pattern across name, class, and classname fields.
Name In Type Required Description displayIdquery integer No Display ID to use (overrides the *-display-N.* hostname pattern). Valid range: 1–999999
Name 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
"windows" : [ 1234567 , 1234568 , 7654321 ]
"message" : " No display context available "
"error" : " Too Many Requests " ,
"message" : " Input action queue is full "
"error" : " Internal Server Error " ,
"message" : " Input action failed "
"error" : " Service Unavailable " ,
"message" : " Display is not available "
const matches = await client . display . input . windowSearch ( {
pattern: " Visual Studio " ,