> ## Documentation Index
> Fetch the complete documentation index at: https://hyperbrowser.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Computer Actions

> Control sessions with low-level mouse and keyboard input

Computer Actions let you drive a live session using screen-level primitives like click, type, drag, scroll, and screenshot. Use them when DOM automation is unreliable or impossible (canvas apps, remote desktops, non-standard controls, or stubborn overlays).

## When To Use Computer Actions

* You need full-screen interaction, not just DOM selectors.
* The page uses canvas or custom rendering where selectors are unreliable.
* You want a robust fallback when Playwright/Puppeteer actions fail.

## How It Works

Every session includes a `computerActionEndpoint`. The SDKs wrap this for you with `client.computerAction.*` (Node.js) and `client.computer_action.*` (Python). You can pass either a session ID or the full session object, and passing the session object is recommended.

<Note>
  Coordinates are pixels relative to the top-left of the session screen. The default screen size is 1280x720. If you change `screen` in session creation, adjust your coordinates accordingly.
</Note>

## Quickstart

This example navigates using keyboard input, scrolls, and captures a screenshot.

<CodeGroup>
  ```typescript Node.js theme={null}
  import { Hyperbrowser } from "@hyperbrowser/sdk";
  import { config } from "dotenv";

  config();

  const client = new Hyperbrowser({
    apiKey: process.env.HYPERBROWSER_API_KEY,
  });

  async function main() {
    const session = await client.sessions.create();

    try {
      // Focus address bar and navigate
      await client.computerAction.pressKeys(session, ["Control_L", "l"]);
      await client.computerAction.typeText(session, "https://example.com");
      await client.computerAction.pressKeys(session, ["Return"]);

      const shot = await client.computerAction.screenshot(session);

      console.log(shot.screenshot); // base64
    } finally {
      await client.sessions.stop(session.id);
    }
  }

  main().catch(console.error);
  ```

  ```python Python theme={null}
  from hyperbrowser import Hyperbrowser
  import os
  from dotenv import load_dotenv

  load_dotenv()

  client = Hyperbrowser(api_key=os.environ["HYPERBROWSER_API_KEY"])

  session = client.sessions.create()

  try:
      # Focus address bar and navigate
      client.computer_action.press_keys(session, keys=["Control_L", "l"])
      client.computer_action.type_text(session, text="https://example.com")
      client.computer_action.press_keys(session, keys=["Return"])

      shot = client.computer_action.screenshot(session)

      print(shot.screenshot)  # base64
  finally:
      client.sessions.stop(session.id)
  ```
</CodeGroup>

## Action Examples

### Click

<CodeGroup>
  ```typescript Node.js theme={null}
  const response = await client.computerAction.click(
    "session-id",  // or session object
    500,  // x coordinate
    300,  // y coordinate
    "left",  // button: "left" | "right" | "middle" | "back" | "forward" | "wheel"
    1,  // number of clicks
    false  // do not return screenshot (default: false)
  );

  console.log(response.success);
  console.log(response.screenshot);  // base64 if requested
  ```

  ```python Python theme={null}
  response = client.computer_action.click(
      "session-id",  # or session object
      x=500,
      y=300,
      button="left",  # "left" | "right" | "middle" | "back" | "forward" | "wheel"
      click_count=1,
      return_screenshot=False  # do not return screenshot (default: False)
  )

  print(response.success)
  print(response.screenshot)  # base64 if requested
  ```
</CodeGroup>

### Type Text

<CodeGroup>
  ```typescript Node.js theme={null}
  const response = await client.computerAction.typeText(
    "session-id",
    "Hello, World!",
    false  // do not return screenshot (default: false)
  );
  ```

  ```python Python theme={null}
  response = client.computer_action.type_text(
      "session-id",
      text="Hello, World!",
      return_screenshot=False  # do not return screenshot (default: False)
  )
  ```
</CodeGroup>

### Press Keys

Uses the xdotool format for keys: [https://github.com/sickcodes/xdotool-gui/blob/master/key\_list.csv](https://github.com/sickcodes/xdotool-gui/blob/master/key_list.csv)

<CodeGroup>
  ```typescript Node.js theme={null}
  const response = await client.computerAction.pressKeys(
    "session-id",
    ["Control_L", "a"],  // Key combination
    false  // do not return screenshot (default: false)
  );
  ```

  ```python Python theme={null}
  response = client.computer_action.press_keys(
      "session-id",
      keys=["Control_L", "a"],  # Key combination
      return_screenshot=False  # do not return screenshot (default: False)
  )
  ```
</CodeGroup>

### Move Mouse

<CodeGroup>
  ```typescript Node.js theme={null}
  const response = await client.computerAction.moveMouse(
    "session-id",
    500,  // x
    300,  // y
    false  // do not return screenshot (default: false)
  );
  ```

  ```python Python theme={null}
  response = client.computer_action.move_mouse(
      "session-id",
      x=500,
      y=300,
      return_screenshot=False  # do not return screenshot (default: False)
  )
  ```
</CodeGroup>

### Drag

<CodeGroup>
  ```typescript Node.js theme={null}
  const response = await client.computerAction.drag(
    "session-id",
    [
      { x: 100, y: 100 },
      { x: 200, y: 200 },
      { x: 300, y: 300 },
    ],
    false  // do not return screenshot (default: false)
  );
  ```

  ```python Python theme={null}
  response = client.computer_action.drag(
      "session-id",
      coordinates=[
          {"x": 100, "y": 100},
          {"x": 200, "y": 200},
          {"x": 300, "y": 300}
      ],
      return_screenshot=False  # do not return screenshot (default: False)
  )
  ```
</CodeGroup>

### Scroll

<CodeGroup>
  ```typescript Node.js theme={null}
  const response = await client.computerAction.scroll(
    "session-id",
    500,  // x position
    300,  // y position
    0,  // scroll x delta
    100,  // scroll y delta
    false  // do not return screenshot (default: false)
  );
  ```

  ```python Python theme={null}
  response = client.computer_action.scroll(
      "session-id",
      x=500,
      y=300,
      scroll_x=0,
      scroll_y=100,
      return_screenshot=False  # do not return screenshot (default: False)
  )
  ```
</CodeGroup>

### Screenshot

<CodeGroup>
  ```typescript Node.js theme={null}
  const response = await client.computerAction.screenshot("session-id");
  console.log(response.screenshot);  // base64
  ```

  ```python Python theme={null}
  response = client.computer_action.screenshot("session-id")
  print(response.screenshot)  # base64
  ```
</CodeGroup>

## Related

* [Create a Session](/sessions/create)
* [Session Parameters](/sessions/parameters)
* [OpenAI CUA Agent](/agents/openai-cua)
* [Claude Computer Use Agent](/agents/claude-computer-use)
