Skip to content

The Terminal: Command Execution API lets you run shell commands inside an existing terminal session, poll for their results, abort in-flight executions, and send raw keystroke input to a session’s PTY. Use these endpoints to automate CLI workflows, drive interactive prompts, or orchestrate remote SSH commands from a backend or agent.

POST /api/v1/terminal/execute

NameInTypeRequiredDescription
terminal_idquerystringNoTerminal session ID (numeric 1-65535). Use terminal_id=0 as an explicit sentinel meaning “no terminal ID” (treated as absent, useful when a reverse proxy always injects a terminal_id). Required unless ephemeral=true, in which case it is auto-generated if not provided.
ephemeralquerybooleanNoWhen true, auto-generates a unique terminal_id (if not provided), skips display/dbus initialization, and applies aggressive cleanup. Designed for programmatic CLI command execution like child_process.exec. Default: false. WARNING: Do NOT use ephemeral=true for GUI applications that require a display. Ephemeral sessions strip the DISPLAY environment variable, which means X11/GUI applications will not work. Use a regular terminal session with an explicit terminal_id and display parameter instead for GUI workloads.
defer_pidqueryintegerNoDefer command injection until this PID exits (TUI-safe). If set, the API returns immediately regardless of wait=true.
defer_start_time_ticksquerystringNoOptional /proc/<pid>/stat field 22 (starttime in clock ticks since boot) to avoid PID reuse bugs. If it mismatches, command executes immediately.
defer_timeout_msqueryintegerNoMax time to wait for defer_pid exit before failing. Default: 60000.
defer_poll_msqueryintegerNoPoll interval while waiting for defer_pid exit. Default: 50, minimum: 10.
resetquerybooleanNoReset existing session and reconfigure (kills current process, clears state, allows switching from bash to SSH or changing any parameter). Use 'true', '1', or no value.
cwdquerystringNoWorking directory for local bash sessions (ignored for SSH).
cwd_auto_createquerybooleanNoAuto-create cwd when the requested working directory does not exist yet. Only applies when cwd is explicitly provided for a new or reset local session. Enable with 'true', '1', or no value. Default: false.
shellquerystringNoShell to use for local sessions: bash (case-insensitive), zsh, fish, sh, etc. Default: server startup command, only applies to new sessions or after reset.
userquerystringNoSystem user to spawn shell as (requires su permissions, only applies to new sessions or after reset).
cmdquerystringNoBase64-encoded command to execute automatically (works with both new and active shells, executes every time URL is visited).
envquerystringNoEnvironment variable in KEY=VALUE format (can be repeated for multiple variables, e.g., ?env=DEBUG=1&env=API_KEY=abc).
skip_display_waitquerybooleanNoSkip waiting for Hoody Display readiness before executing command. By default, if a DISPLAY is configured, the endpoint blocks until the display server on port 4000+display_num is ready. Default: false.
display_wait_timeoutqueryintegerNoTimeout in seconds for display readiness wait. Default: 10, capped at 10 seconds to prevent event-loop pin; values ≤0 or malformed also map to the 10-second cap. Ignored if skip_display_wait=true.
displayquerystringNoDISPLAY environment variable for X11 applications (auto-formats :display if number provided, e.g., ?display=1 becomes DISPLAY=:1).
ssh_hostquerystringNoSSH server hostname or IP address (creates SSH session if provided with ssh_user).
ssh_userquerystringNoSSH username (required if ssh_host is provided).
ssh_portquerystringNoSSH port number. Default: 22.
ssh_passwordquerystringNoSSH password for authentication (use with caution, prefer key-based auth).
socks5_hostquerystringNoSOCKS5 proxy hostname for SSH connection.
socks5_portquerystringNoSOCKS5 proxy port. Default: 1080.
socks5_userquerystringNoSOCKS5 proxy username for authentication.
ssh_keyquerystringNoBase64-encoded SSH private key for key-based authentication (prefer over password-based auth).
socks5_passquerystringNoSOCKS5 proxy password for authentication.
FieldTypeRequiredDescription
commandstringYesThe command to execute.
idstringNoCustom command ID (numeric 1-65535, auto-generated if not provided).
timeoutintegerNoTimeout in seconds (0 = no timeout). Default: 0.
waitbooleanNoWhether to wait for completion. Default: true; forced false when defer_pid is set.
cwdstringNoWorking directory for command execution (for local bash only).
envobjectNoEnvironment variables as key-value pairs.
{
"command": "ls -la",
"timeout": 30,
"wait": true
}
{
"command_id": "42",
"status": "running"
}
const result = await client.terminal.execution.execute({
terminal_id: "1",
data: {
command: "ls -la",
timeout: 30,
wait: true
}
});

Retrieve the current or final results of a command execution. Can be called while a command is running or after completion.

GET /api/v1/terminal/result/{command_id}

NameInTypeRequiredDescription
command_idpathstringYesCommand ID returned from /api/v1/terminal/execute (numeric 1-65535).
{
"command_id": "42",
"status": "completed",
"output": "total 12\ndrwxr-xr-x 3 user user 4096 Jan 15 10:30 .\ndrwxr-xr-x 5 user user 4096 Jan 15 10:29 ..",
"exit_code": 0
}
const result = await client.terminal.execution.getResult({
command_id: "42"
});

Cancel a command that was started via the execute endpoint. Graceful mode (default) sends SIGINT via the PTY (equivalent to Ctrl+C). Force mode sends SIGKILL to the process group. Partial output captured before abort is preserved in the response.

POST /api/v1/terminal/execute/{command_id}/abort

NameInTypeRequiredDescription
command_idpathstringYesThe command ID returned by the execute endpoint.
FieldTypeRequiredDescription
forcebooleanNoSend SIGKILL to process group instead of SIGINT. Default: false.
{
"force": false
}
{
"command_id": "42",
"status": "aborted",
"output": "partial output captured before abort",
"exit_code": null
}
const result = await client.terminal.abort({
command_id: "42",
data: {
force: false
}
});

Send keyboard input to a terminal session’s PTY. The input is written directly to the PTY master fd, exactly as if typed on a physical keyboard. By default, Enter (newline) is automatically appended after the input. Set enter=false for raw input without Enter. Supports interactive prompts (y/n), sudo passwords, and any other stdin input. Use empty input "" to just press Enter.

POST /api/v1/terminal/write

NameInTypeRequiredDescription
terminal_idquerystringYesTerminal session ID to write to.
FieldTypeRequiredDescription
inputstringYesThe text to type into the terminal.
enterbooleanNoAuto-append Enter (newline) after input. Default: true. Set to false for raw keystroke input.
{
"input": "y",
"enter": true
}
{
"status": "ok",
"bytes_written": 2
}
const result = await client.terminal.write({
terminal_id: "1",
data: {
input: "y",
enter: true
}
});