Skip to content
Hoody.com

Use these endpoints to inspect container processes, network listeners, system resources, connected displays, daemon programs, and to manage power state. Most endpoints are read-only and require no input. The write operations (signal, freeze, unfreeze, reboot, shutdown) all enforce kernel-level permission checks.

All endpoints in this service are scoped to a specific container. Substitute {projectId}, {containerId}, and {server} in the base URL with the values for your target deployment.

Returns comprehensive system statistics including CPU usage, memory, network interfaces, uptime, and disk usage.

This endpoint takes no parameters.

Terminal window
curl -X GET "https://{projectId}-{containerId}-terminal-1.{server}.containers.hoody.icu/api/v1/system/resources" \
-H "Authorization: Bearer <token>"

Returns the JSON array of daemon programs from the hoody-daemon configuration.

This endpoint takes no parameters.

Terminal window
curl -X GET "https://{projectId}-{containerId}-terminal-1.{server}.containers.hoody.icu/api/v1/system/daemon" \
-H "Authorization: Bearer <token>"

Returns information about connected displays from the external display script.

This endpoint takes no parameters.

Terminal window
curl -X GET "https://{projectId}-{containerId}-terminal-1.{server}.containers.hoody.icu/api/v1/system/displays" \
-H "Authorization: Bearer <token>"

Service health check. Unauthenticated. Always returns HTTP 200 with application/json when the service is up.

This endpoint takes no parameters.

Terminal window
curl -X GET "https://{projectId}-{containerId}-terminal-1.{server}.containers.hoody.icu/api/v1/terminal/health"

Returns a JSON array of all processes with CPU, memory, and state information. Supports filtering, sorting, and limiting results.

NameInTypeRequiredDescription
sortquerystringNoSort by field: cpu, memory, pid, name. Default: pid
limitqueryintegerNoMaximum number of processes to return. Default: all
filterquerystringNoFilter by process name (substring match, case-insensitive)
Terminal window
curl -X GET "https://{projectId}-{containerId}-terminal-1.{server}.containers.hoody.icu/api/v1/system/processes?sort=cpu&limit=10&filter=python" \
-H "Authorization: Bearer <token>"

Returns detailed information about a specific process including all stats, cmdline, environment, and open files.

NameInTypeRequiredDescription
pidpathintegerYesProcess ID
Terminal window
curl -X GET "https://{projectId}-{containerId}-terminal-1.{server}.containers.hoody.icu/api/v1/system/processes/1042" \
-H "Authorization: Bearer <token>"

Send a Unix signal to one or more processes by PID or name. Supports all standard signals (SIGTERM, SIGKILL, SIGSTOP, SIGCONT, etc.). When targeting by name, the signal is sent to ALL matching processes.

This endpoint takes no path, query, or header parameters.

NameTypeRequiredDescription
pidintegerNoProcess ID to signal (mutually exclusive with name)
namestringNoProcess name to signal — signals ALL matching processes (mutually exclusive with pid)
signalstring|integerNoSignal to send. String form accepts SIGTERM, TERM, 15, etc. (with or without SIG prefix). Integer form accepts any value in [0, NSIG) including realtime signals SIGRTMIN..SIGRTMAX (typically 34..64 on Linux), which have no portable string names.
forcebooleanNoShorthand for SIGKILL (true) or SIGTERM (false). Overrides the signal parameter
Terminal window
curl -X POST "https://{projectId}-{containerId}-terminal-1.{server}.containers.hoody.icu/api/v1/system/process/signal" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{ "pid": 1042, "signal": "SIGTERM" }'

These two endpoints suspend and resume process execution by delivering SIGSTOP and SIGCONT respectively. They are useful for pausing background workloads (builds, fine-tunes, AI inference) without losing in-memory state. Both target either a specific PID or all processes matching a name, and both can optionally fan out across every descendant of the target.

Suspend execution of one or more processes by delivering SIGSTOP. The kernel halts every thread of the target’s thread group until a matching SIGCONT is delivered (see unfreeze below).

This endpoint takes no path, query, or header parameters.

NameTypeRequiredDescription
pidintegerNoProcess ID to freeze (mutually exclusive with name). PIDs 1 (init), 2 (kthreadd), the server’s own PID, and the server’s parent PID are guarded and rejected with 403
namestringNoProcess name (case-insensitive comm match — freezes EVERY matching process; mutually exclusive with pid). Linux truncates comm to 15 chars; longer names silently match nothing
include_descendantsbooleanNoWhen true, also freeze every descendant via a one-shot /proc PPID snapshot (bounded at 65535 PIDs). Default false. By-name dedupes overlapping subtrees
Terminal window
curl -X POST "https://{projectId}-{containerId}-terminal-1.{server}.containers.hoody.icu/api/v1/system/processes/freeze" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{ "pid": 1042, "include_descendants": true }'

Resume execution of one or more previously-stopped processes by delivering SIGCONT. Calling unfreeze on a process that is already running is harmless — SIGCONT is a no-op for non-stopped processes. Permission is enforced by the kernel.

This endpoint takes no path, query, or header parameters.

NameTypeRequiredDescription
pidintegerNoProcess ID to unfreeze (mutually exclusive with name). The guarded-PID set (1, 2, self, parent) is the same as for freeze
namestringNoProcess name (case-insensitive comm match; mutually exclusive with pid). Linux truncates comm to 15 chars; longer names silently match nothing
include_descendantsbooleanNoAlso unfreeze all descendants via /proc PPID snapshot (bounded at 65535 PIDs). Default false. By-name dedupes overlapping subtrees
Terminal window
curl -X POST "https://{projectId}-{containerId}-terminal-1.{server}.containers.hoody.icu/api/v1/system/processes/unfreeze" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{ "pid": 1042, "include_descendants": true }'

Returns a JSON array of all TCP/UDP ports with process information and extensive filtering options.

NameInTypeRequiredDescription
protocolquerystringNoFilter by protocol: tcp, udp, or comma-separated list
userquerystringNoFilter by user (exact match)
portqueryintegerNoFilter by specific port number
ipquerystringNoFilter by IP address (comma-separated list)
skip_programquerystringNoExclude specific programs (comma-separated list)
http_onlyquerybooleanNoOnly return HTTP services
hoody_onlyquerybooleanNoOnly return Hoody Kit services
Terminal window
curl -X GET "https://{projectId}-{containerId}-terminal-1.{server}.containers.hoody.icu/api/v1/system/ports?protocol=tcp&http_only=true" \
-H "Authorization: Bearer <token>"

Both power management endpoints invoke shutdown(8), which schedules in whole minutes. The server rounds the requested delay UP to the nearest minute and reports the actual scheduled value as effective_minutes in the response.

Initiate a system reboot with optional delay.

NameInTypeRequiredDescription
delayqueryintegerNoDelay in seconds before reboot, 0..86400. Default 0 for immediate
Terminal window
curl -X POST "https://{projectId}-{containerId}-terminal-1.{server}.containers.hoody.icu/api/v1/system/reboot?delay=60" \
-H "Authorization: Bearer <token>"

Initiate a system shutdown with optional delay.

NameInTypeRequiredDescription
delayqueryintegerNoDelay in seconds before shutdown, 0..86400. Default 0 for immediate
Terminal window
curl -X POST "https://{projectId}-{containerId}-terminal-1.{server}.containers.hoody.icu/api/v1/system/shutdown?delay=300" \
-H "Authorization: Bearer <token>"

Fire-and-forget diagnostics endpoint. A terminal client posts its own render/connection health so the server can correlate client-side stalls with server-side session state. This is optional telemetry — callers never need it to drive a terminal, and the response carries no useful body.

This endpoint takes no path, query, or header parameters.

NameTypeRequiredDescription
build_idstringNoFrontend build identifier
rendererstringNoEffective renderer (webgl or dom)
reasonstringNoWhat triggered this beacon
Terminal window
curl -X POST "https://{projectId}-{containerId}-terminal-1.{server}.containers.hoody.icu/api/v1/terminal/state" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{ "build_id": "web-2024.04.01", "renderer": "webgl", "reason": "frame_skipped" }'