reference

HTTP API reference (REST daemon)

Daemon REST API over unix socket or TCP for automation and the Go/TypeScript SDKs.

Connect

Unix socket (default CLI path)

bash
curl --unix-socket ~/.grain/grain.sock http://grain/healthz
curl --unix-socket ~/.grain/grain.sock http://grain/vms

TCP (when api: 127.0.0.1:7474 is set — default)

bash
curl -s http://127.0.0.1:7474/healthz
curl -s http://127.0.0.1:7474/openapi.yaml

Auth: if api_token is configured, send Authorization: Bearer <token>. GET /healthz stays open.

Machine-readable schema

Common routes

MethodPathNotes
GET/healthzLiveness
GET/infoVersion
GET/metricsPrometheus text
GET/openapi.yamlSpec
GET/POST/vmsList / create
GET/DELETE/vms/{name}Get / delete
POST/vms/{name}/startStart persistent
POST/vms/{name}/shutdownStop
POST/vms/{name}/pauseQMP stop
POST/vms/{name}/resumeQMP cont
POST/vms/{name}/suspendFree RAM
POST/vms/{name}/restoreFrom suspended
POST/vms/{name}/execAgent exec (buffered=true|false)
GET/vms/{name}/agent/healthAgent health
GET/vms/{name}/statsGuest stats
PUT/GET/vms/{name}/cpFile/tar copy
GET/POST/DELETE/vms/{name}/fs/*readdir, stat, mkdir, remove
POST/DELETE/vms/{name}/forwardsLive TCP forwards
GET/POST/DELETE/secretsHost secrets
POST/vms/{name}/secrets/{secret}Inject secret

Create query parameters

QueryValues
stream=1NDJSON create progress
wait=auto (empty), ssh, agent, userdata
timeout=Go duration, e.g. 3m
bash
curl -N --unix-socket ~/.grain/grain.sock \
  -H 'Accept: application/x-ndjson' \
  -H 'Content-Type: application/json' \
  -d '{"persistent":false}' \
  'http://grain/vms?stream=1&wait=agent&timeout=3m'

SDKs

Prefer typed clients when embedding: