{
"openrpc": "1.2.6",
"info": {
"title": "Zinit RPC API",
"description": "Process supervisor and service manager with xinet socket activation proxy support",
"version": "0.3.0",
"license": {
"name": "Apache-2.0"
}
},
"methods": [
{
"name": "rpc.discover",
"summary": "Returns the OpenRPC specification",
"params": [],
"result": {
"name": "spec",
"schema": { "type": "object" }
}
},
{
"name": "system.ping",
"summary": "Check if server is alive",
"params": [],
"result": {
"name": "pong",
"schema": { "$ref": "#/components/schemas/PingResponse" }
}
},
{
"name": "system.shutdown",
"summary": "Shutdown the server and all services",
"params": [],
"result": {
"name": "success",
"schema": { "$ref": "#/components/schemas/OkResponse" }
}
},
{
"name": "system.reboot",
"summary": "Reboot the system (Linux only, requires PID 1)",
"params": [],
"result": {
"name": "success",
"schema": { "$ref": "#/components/schemas/OkResponse" }
}
},
{
"name": "system.prepare_restart",
"summary": "Prepare for hot restart by saving state to disk",
"description": "Saves supervisor state to disk for process adoption after restart. The daemon will exit after this call.",
"params": [],
"result": {
"name": "result",
"schema": { "$ref": "#/components/schemas/PrepareRestartResult" }
}
},
{
"name": "service.set",
"summary": "Create or update a service (always persisted)",
"description": "Stops the current service (if exists), deletes the config file, saves the new config, and registers it. Ensures no inconsistency between disk and server.",
"params": [
{
"name": "config",
"description": "Service configuration",
"required": true,
"schema": { "$ref": "#/components/schemas/ServiceDef" }
}
],
"result": {
"name": "result",
"schema": { "$ref": "#/components/schemas/AddServiceResult" }
}
},
{
"name": "service.get",
"summary": "Get service configuration",
"params": [
{
"name": "name",
"description": "Service name",
"required": true,
"schema": { "type": "string" }
}
],
"result": {
"name": "config",
"schema": { "$ref": "#/components/schemas/ServiceDef" }
}
},
{
"name": "service.delete",
"summary": "Delete a service (stop and remove)",
"params": [
{
"name": "name",
"description": "Service name",
"required": true,
"schema": { "type": "string" }
}
],
"result": {
"name": "success",
"schema": { "$ref": "#/components/schemas/OkResponse" }
}
},
{
"name": "service.list",
"summary": "List all service names",
"params": [],
"result": {
"name": "services",
"schema": {
"type": "array",
"items": { "type": "string" }
}
}
},
{
"name": "service.list_full",
"summary": "List all services with state information",
"params": [],
"result": {
"name": "services",
"schema": {
"type": "array",
"items": { "$ref": "#/components/schemas/ServiceInfo" }
}
}
},
{
"name": "service.start",
"summary": "Start a service",
"params": [
{
"name": "name",
"description": "Service name",
"required": true,
"schema": { "type": "string" }
}
],
"result": {
"name": "success",
"schema": { "$ref": "#/components/schemas/OkResponse" }
}
},
{
"name": "service.stop",
"summary": "Stop a service",
"params": [
{
"name": "name",
"description": "Service name",
"required": true,
"schema": { "type": "string" }
}
],
"result": {
"name": "success",
"schema": { "$ref": "#/components/schemas/OkResponse" }
}
},
{
"name": "service.restart",
"summary": "Restart a service",
"params": [
{
"name": "name",
"description": "Service name",
"required": true,
"schema": { "type": "string" }
}
],
"result": {
"name": "success",
"schema": { "$ref": "#/components/schemas/OkResponse" }
}
},
{
"name": "service.kill",
"summary": "Send a signal to a service",
"params": [
{
"name": "name",
"description": "Service name",
"required": true,
"schema": { "type": "string" }
},
{
"name": "signal",
"description": "Signal name (default: SIGTERM)",
"required": false,
"schema": { "type": "string", "default": "SIGTERM" }
}
],
"result": {
"name": "success",
"schema": { "$ref": "#/components/schemas/OkResponse" }
}
},
{
"name": "service.status",
"summary": "Get service status (simplified)",
"params": [
{
"name": "name",
"description": "Service name",
"required": true,
"schema": { "type": "string" }
}
],
"result": {
"name": "status",
"schema": { "$ref": "#/components/schemas/ServiceStatus" }
}
},
{
"name": "service.status_full",
"summary": "Get detailed service status with dependencies and uptime",
"params": [
{
"name": "name",
"description": "Service name",
"required": true,
"schema": { "type": "string" }
}
],
"result": {
"name": "status",
"schema": { "$ref": "#/components/schemas/ServiceStatusFull" }
}
},
{
"name": "service.stats",
"summary": "Get service resource usage",
"params": [
{
"name": "name",
"description": "Service name",
"required": true,
"schema": { "type": "string" }
}
],
"result": {
"name": "stats",
"schema": { "$ref": "#/components/schemas/ServiceStats" }
}
},
{
"name": "service.children",
"summary": "Get child processes for a service",
"description": "Returns all child processes spawned by the service's main process",
"params": [
{
"name": "name",
"description": "Service name",
"required": true,
"schema": { "type": "string" }
}
],
"result": {
"name": "children",
"schema": { "$ref": "#/components/schemas/ChildrenResponse" }
}
},
{
"name": "service.is_running",
"summary": "Check if a service is currently running",
"params": [
{
"name": "name",
"description": "Service name",
"required": true,
"schema": { "type": "string" }
}
],
"result": {
"name": "running",
"schema": { "type": "boolean" }
}
},
{
"name": "service.why",
"summary": "Explain why a service is blocked",
"params": [
{
"name": "name",
"description": "Service name",
"required": true,
"schema": { "type": "string" }
}
],
"result": {
"name": "info",
"schema": { "$ref": "#/components/schemas/WhyBlocked" }
}
},
{
"name": "service.tree",
"summary": "Get ASCII dependency tree visualization",
"params": [],
"result": {
"name": "tree",
"schema": { "$ref": "#/components/schemas/TreeResponse" }
}
},
{
"name": "logs.get",
"summary": "Get logs (simplified, returns strings)",
"params": [
{
"name": "name",
"description": "Service name (optional, omit for all logs)",
"required": false,
"schema": { "type": "string" }
},
{
"name": "lines",
"description": "Number of lines (default: 100)",
"required": false,
"schema": { "type": "integer", "default": 100 }
}
],
"result": {
"name": "logs",
"schema": {
"type": "array",
"items": { "type": "string" }
}
}
},
{
"name": "logs.tail",
"summary": "Get structured log entries",
"params": [
{
"name": "name",
"description": "Service name (optional)",
"required": false,
"schema": { "type": "string" }
},
{
"name": "lines",
"description": "Number of lines (default: 100)",
"required": false,
"schema": { "type": "integer", "default": 100 }
}
],
"result": {
"name": "logs",
"schema": {
"type": "array",
"items": { "$ref": "#/components/schemas/LogLine" }
}
}
},
{
"name": "logs.filter",
"summary": "Get filtered log entries",
"params": [
{
"name": "name",
"description": "Service name (optional)",
"required": false,
"schema": { "type": "string" }
},
{
"name": "stream",
"description": "Filter by stream type",
"required": false,
"schema": {
"type": "string",
"enum": ["stdout", "stderr", "syslog"]
}
},
{
"name": "since",
"description": "Return logs since this timestamp (ms)",
"required": false,
"schema": { "type": "integer" }
},
{
"name": "lines",
"description": "Number of lines (default: 100)",
"required": false,
"schema": { "type": "integer", "default": 100 }
}
],
"result": {
"name": "logs",
"schema": {
"type": "array",
"items": { "$ref": "#/components/schemas/LogLine" }
}
}
},
{
"name": "debug.state",
"summary": "Get full supervisor state for debugging",
"params": [],
"result": {
"name": "output",
"schema": {
"type": "object",
"properties": {
"output": { "type": "string" }
},
"required": ["output"]
}
}
},
{
"name": "debug.process_tree",
"summary": "Get process tree for a service",
"params": [
{
"name": "name",
"description": "Service name",
"required": true,
"schema": { "type": "string" }
}
],
"result": {
"name": "output",
"schema": {
"type": "object",
"properties": {
"output": { "type": "string" }
},
"required": ["output"]
}
}
},
{
"name": "xinet.set",
"summary": "Create or update an xinet proxy (replaces existing)",
"description": "Creates a new xinet proxy or replaces an existing one with the same name. If replacing, stops and removes the old proxy first.",
"params": [
{
"name": "config",
"description": "Proxy configuration",
"required": true,
"schema": { "$ref": "#/components/schemas/XinetDef" }
}
],
"result": {
"name": "success",
"schema": { "$ref": "#/components/schemas/OkResponse" }
}
},
{
"name": "xinet.delete",
"summary": "Delete an xinet proxy",
"params": [
{
"name": "name",
"description": "Proxy name",
"required": true,
"schema": { "type": "string" }
}
],
"result": {
"name": "success",
"schema": { "$ref": "#/components/schemas/OkResponse" }
}
},
{
"name": "xinet.list",
"summary": "List all xinet proxy names",
"params": [],
"result": {
"name": "proxies",
"schema": {
"type": "array",
"items": { "type": "string" }
}
}
},
{
"name": "xinet.status",
"summary": "Get xinet proxy status (simplified)",
"params": [
{
"name": "name",
"description": "Proxy name",
"required": true,
"schema": { "type": "string" }
}
],
"result": {
"name": "status",
"schema": { "$ref": "#/components/schemas/XinetStatus" }
}
},
{
"name": "xinet.status_all",
"summary": "Get status of all xinet proxies",
"params": [],
"result": {
"name": "statuses",
"schema": {
"type": "array",
"items": { "$ref": "#/components/schemas/XinetStatusFull" }
}
}
}
],
"components": {
"schemas": {
"ServiceDef": {
"type": "object",
"description": "Service definition (matches TOML config format)",
"required": ["service"],
"properties": {
"service": {
"type": "object",
"required": ["name", "exec"],
"properties": {
"name": {
"type": "string",
"description": "Service name (unique identifier)"
},
"exec": {
"type": "string",
"description": "Command to execute"
},
"dir": {
"type": "string",
"description": "Working directory"
},
"oneshot": {
"type": "boolean",
"default": false,
"description": "Run once and exit (no restart)"
},
"env": {
"type": "object",
"additionalProperties": { "type": "string" },
"description": "Environment variables"
},
"status": {
"type": "string",
"enum": ["start", "stop", "ignore"],
"default": "start",
"description": "Desired status: start=autostart, stop=keep stopped, ignore=manual control"
},
"class": {
"type": "string",
"enum": ["user", "system"],
"default": "user",
"description": "Service class: user=affected by bulk ops, system=protected"
},
"critical": {
"type": "boolean",
"default": false,
"description": "Failure triggers emergency shell (PID1 mode only)"
}
}
},
"dependencies": {
"type": "object",
"properties": {
"after": {
"type": "array",
"items": { "type": "string" },
"description": "Start after these services (ordering only)"
},
"requires": {
"type": "array",
"items": { "type": "string" },
"description": "Requires these services to be running"
},
"wants": {
"type": "array",
"items": { "type": "string" },
"description": "Wants these services (soft dependency)"
},
"conflicts": {
"type": "array",
"items": { "type": "string" },
"description": "Cannot run with these services"
}
}
},
"lifecycle": {
"type": "object",
"properties": {
"restart": {
"type": "string",
"enum": ["always", "on-failure", "never"],
"default": "on-failure",
"description": "Restart policy"
},
"restart_delay_ms": {
"type": "integer",
"default": 1000,
"description": "Initial restart delay (ms), doubles on each restart"
},
"restart_delay_max_ms": {
"type": "integer",
"default": 300000,
"description": "Maximum restart delay cap (ms)"
},
"max_restarts": {
"type": "integer",
"default": 10,
"description": "Maximum restart attempts (0=unlimited)"
},
"stability_period_ms": {
"type": "integer",
"default": 30000,
"description": "How long service must run before backoff resets (ms)"
},
"start_timeout_ms": {
"type": "integer",
"default": 30000,
"description": "Timeout for service to start (ms)"
},
"stop_timeout_ms": {
"type": "integer",
"default": 10000,
"description": "Timeout for graceful stop before SIGKILL (ms)"
},
"stop_signal": {
"type": "string",
"default": "SIGTERM",
"description": "Signal to send for graceful stop"
}
}
},
"health": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": ["tcp", "http", "exec"],
"description": "Health check type"
},
"target": {
"type": "string",
"description": "Target: host:port (tcp), URL (http), or command (exec)"
},
"expect_status": {
"type": "integer",
"default": 200,
"description": "Expected HTTP status code (http type only)"
},
"interval_ms": {
"type": "integer",
"default": 10000,
"description": "Health check interval (ms)"
},
"timeout_ms": {
"type": "integer",
"default": 5000,
"description": "Health check timeout (ms)"
},
"retries": {
"type": "integer",
"default": 3,
"description": "Number of retries before marking unhealthy"
},
"start_period_ms": {
"type": "integer",
"default": 0,
"description": "Grace period before health checks start (ms)"
}
}
},
"logging": {
"type": "object",
"properties": {
"buffer_lines": {
"type": "integer",
"default": 1000,
"description": "Number of log lines to buffer in memory"
},
"file": {
"type": "string",
"description": "Log file path (optional)"
},
"forward": {
"type": "string",
"description": "Syslog forward address (optional)"
}
}
}
}
},
"ServiceStatus": {
"type": "object",
"description": "Simplified service runtime status",
"required": ["name", "state"],
"properties": {
"name": { "type": "string" },
"state": {
"type": "string",
"enum": [
"inactive",
"blocked",
"starting",
"running",
"stopping",
"exited",
"failed"
]
},
"pid": {
"type": "integer",
"default": 0,
"description": "Process ID (0 if not running)"
},
"exit_code": {
"type": "integer",
"description": "Last exit code (if exited or failed)"
},
"error": {
"type": "string",
"description": "Error message (if failed or blocked)"
}
}
},
"ServiceStatusFull": {
"type": "object",
"description": "Detailed service status with dependencies and uptime",
"required": ["name", "state", "is_target", "dependencies"],
"properties": {
"name": { "type": "string" },
"state": { "$ref": "#/components/schemas/ServiceState" },
"is_target": {
"type": "boolean",
"description": "True if this is a target (virtual service)"
},
"dependencies": {
"type": "array",
"items": { "$ref": "#/components/schemas/DependencyInfo" }
},
"uptime_secs": {
"type": "integer",
"description": "Uptime in seconds (if running)"
}
}
},
"ServiceState": {
"type": "object",
"description": "Service state with associated data",
"oneOf": [
{
"type": "object",
"properties": { "state": { "const": "inactive" } },
"required": ["state"]
},
{
"type": "object",
"properties": {
"state": { "const": "blocked" },
"waiting_on": { "type": "array", "items": { "type": "string" } }
},
"required": ["state", "waiting_on"]
},
{
"type": "object",
"properties": {
"state": { "const": "starting" },
"pid": { "type": "integer" }
},
"required": ["state", "pid"]
},
{
"type": "object",
"properties": {
"state": { "const": "running" },
"pid": { "type": "integer" }
},
"required": ["state", "pid"]
},
{
"type": "object",
"properties": {
"state": { "const": "stopping" },
"pid": { "type": "integer" }
},
"required": ["state", "pid"]
},
{
"type": "object",
"properties": {
"state": { "const": "exited" },
"exit_code": { "type": "integer" }
},
"required": ["state"]
},
{
"type": "object",
"properties": {
"state": { "const": "failed" },
"reason": { "$ref": "#/components/schemas/FailureReason" }
},
"required": ["state", "reason"]
}
]
},
"FailureReason": {
"type": "object",
"description": "Reason why a service failed",
"oneOf": [
{
"type": "object",
"properties": {
"type": { "const": "exit_code" },
"code": { "type": "integer" }
},
"required": ["type", "code"]
},
{
"type": "object",
"properties": {
"type": { "const": "signal" },
"signal": { "type": "integer" }
},
"required": ["type", "signal"]
},
{
"type": "object",
"properties": { "type": { "const": "start_timeout" } },
"required": ["type"]
},
{
"type": "object",
"properties": { "type": { "const": "stop_timeout" } },
"required": ["type"]
},
{
"type": "object",
"properties": {
"type": { "const": "health_check_failed" },
"attempts": { "type": "integer" }
},
"required": ["type", "attempts"]
},
{
"type": "object",
"properties": {
"type": { "const": "dependency_failed" },
"service": { "type": "string" }
},
"required": ["type", "service"]
},
{
"type": "object",
"properties": {
"type": { "const": "spawn_error" },
"message": { "type": "string" }
},
"required": ["type", "message"]
},
{
"type": "object",
"properties": {
"type": { "const": "missing_dependency" },
"dependency": { "type": "string" }
},
"required": ["type", "dependency"]
}
]
},
"ServiceInfo": {
"type": "object",
"description": "Basic service information for list operations",
"required": ["name", "state", "is_target"],
"properties": {
"name": { "type": "string" },
"state": { "$ref": "#/components/schemas/ServiceState" },
"is_target": { "type": "boolean" }
}
},
"DependencyInfo": {
"type": "object",
"description": "Information about a service dependency",
"required": ["name", "dep_type", "state", "satisfied"],
"properties": {
"name": { "type": "string" },
"dep_type": {
"type": "string",
"enum": ["after", "requires", "wants", "conflicts"]
},
"state": { "$ref": "#/components/schemas/ServiceState" },
"satisfied": { "type": "boolean" }
}
},
"ServiceStats": {
"type": "object",
"description": "Service resource usage statistics",
"required": ["pid", "memory_bytes", "cpu_percent"],
"properties": {
"pid": { "type": "integer" },
"memory_bytes": { "type": "integer" },
"cpu_percent": { "type": "number" }
}
},
"ChildProcessInfo": {
"type": "object",
"description": "Information about a child process",
"required": ["pid", "name", "memory_bytes"],
"properties": {
"pid": { "type": "integer", "description": "Process ID" },
"name": { "type": "string", "description": "Process name" },
"memory_bytes": {
"type": "integer",
"description": "Memory usage in bytes"
}
}
},
"ChildrenResponse": {
"type": "object",
"description": "Response containing child processes",
"required": ["children"],
"properties": {
"children": {
"type": "array",
"items": { "$ref": "#/components/schemas/ChildProcessInfo" },
"description": "List of child processes"
}
}
},
"WhyBlocked": {
"type": "object",
"description": "Explanation of why a service is blocked",
"required": [
"name",
"blocked",
"waiting_on",
"conflicts_with",
"ascii"
],
"properties": {
"name": { "type": "string" },
"blocked": { "type": "boolean" },
"waiting_on": {
"type": "array",
"items": { "type": "string" },
"description": "Services this one is waiting for"
},
"conflicts_with": {
"type": "array",
"items": { "type": "string" },
"description": "Running services that conflict"
},
"ascii": {
"type": "string",
"description": "ASCII visualization of blocked dependencies"
}
}
},
"TreeResponse": {
"type": "object",
"description": "ASCII dependency tree visualization",
"required": ["ascii"],
"properties": {
"ascii": { "type": "string" }
}
},
"LogLine": {
"type": "object",
"description": "Structured log entry",
"required": ["timestamp_ms", "service", "stream", "content"],
"properties": {
"timestamp_ms": {
"type": "integer",
"description": "Unix timestamp in milliseconds"
},
"service": { "type": "string" },
"stream": {
"type": "string",
"enum": ["stdout", "stderr", "syslog"]
},
"content": { "type": "string" }
}
},
"PingResponse": {
"type": "object",
"required": ["version"],
"properties": {
"version": { "type": "string" }
}
},
"OkResponse": {
"type": "object",
"required": ["ok"],
"properties": {
"ok": { "type": "boolean", "default": true }
}
},
"CreateResult": {
"type": "object",
"required": ["name"],
"properties": {
"name": { "type": "string" }
}
},
"AddServiceResult": {
"type": "object",
"description": "Result of adding a service",
"required": ["name"],
"properties": {
"name": { "type": "string" },
"path": {
"type": "string",
"description": "Config file path (if persisted)"
},
"warnings": {
"type": "array",
"items": { "type": "string" },
"description": "Any warnings during add"
}
}
},
"PrepareRestartResult": {
"type": "object",
"description": "Result of prepare_restart operation",
"required": ["state_path", "ready"],
"properties": {
"state_path": {
"type": "string",
"description": "Path where state was saved"
},
"ready": {
"type": "boolean",
"description": "True if ready for restart"
}
}
},
"ReloadResult": {
"type": "object",
"description": "Result of reload operation",
"required": ["added", "removed", "changed"],
"properties": {
"added": {
"type": "array",
"items": { "type": "string" },
"description": "Newly added services"
},
"removed": {
"type": "array",
"items": { "type": "string" },
"description": "Removed services"
},
"changed": {
"type": "array",
"items": { "type": "string" },
"description": "Changed services"
},
"config_errors": {
"type": "array",
"items": {
"type": "array",
"items": { "type": "string" },
"minItems": 2,
"maxItems": 2
},
"description": "Config errors as [filename, error] pairs"
}
}
},
"BulkStartResult": {
"type": "object",
"required": ["started", "count"],
"properties": {
"started": {
"type": "array",
"items": { "type": "string" }
},
"count": { "type": "integer" }
}
},
"BulkStopResult": {
"type": "object",
"required": ["stopped", "count"],
"properties": {
"stopped": {
"type": "array",
"items": { "type": "string" }
},
"count": { "type": "integer" }
}
},
"BulkDeleteResult": {
"type": "object",
"required": ["deleted", "count"],
"properties": {
"deleted": {
"type": "array",
"items": { "type": "string" }
},
"count": { "type": "integer" }
}
},
"XinetDef": {
"type": "object",
"description": "Xinet socket activation proxy definition",
"required": ["name", "listen", "backend", "service"],
"properties": {
"name": {
"type": "string",
"description": "Proxy name (unique identifier)"
},
"listen": {
"oneOf": [
{ "type": "string" },
{ "type": "array", "items": { "type": "string" } }
],
"description": "Listen address(es): 'host:port', 'unix:/path', or array of addresses"
},
"backend": {
"type": "string",
"description": "Backend address: 'host:port' or 'unix:/path'"
},
"service": {
"type": "string",
"description": "Zinit service name to start on connection"
},
"connect_timeout": {
"type": "integer",
"default": 30,
"description": "Timeout (seconds) to wait for backend after starting service"
},
"idle_timeout": {
"type": "integer",
"default": 0,
"description": "Stop service after idle for this many seconds (0=never)"
},
"single_connection": {
"type": "boolean",
"default": false,
"description": "Allow only one connection at a time"
}
}
},
"XinetStatus": {
"type": "object",
"description": "Simplified xinet proxy status",
"required": ["name", "running", "connections"],
"properties": {
"name": { "type": "string" },
"running": { "type": "boolean" },
"connections": {
"type": "integer",
"description": "Active connections"
}
}
},
"XinetStatusFull": {
"type": "object",
"description": "Detailed xinet proxy status with traffic stats",
"required": [
"name",
"listen",
"backend",
"service",
"running",
"active_connections",
"total_connections",
"bytes_to_backend",
"bytes_from_backend"
],
"properties": {
"name": { "type": "string" },
"listen": {
"type": "string",
"description": "Listen address(es)"
},
"backend": {
"type": "string",
"description": "Backend address"
},
"service": {
"type": "string",
"description": "Backend service name"
},
"running": { "type": "boolean" },
"active_connections": {
"type": "integer",
"description": "Currently active connections"
},
"total_connections": {
"type": "integer",
"description": "Total connections handled"
},
"bytes_to_backend": {
"type": "integer",
"description": "Total bytes forwarded to backend"
},
"bytes_from_backend": {
"type": "integer",
"description": "Total bytes forwarded from backend"
}
}
}
},
"errors": {
"ParseError": {
"code": -32700,
"message": "Parse error",
"description": "Invalid JSON was received"
},
"InvalidRequest": {
"code": -32600,
"message": "Invalid Request",
"description": "The JSON sent is not a valid Request object"
},
"MethodNotFound": {
"code": -32601,
"message": "Method not found",
"description": "The method does not exist"
},
"InvalidParams": {
"code": -32602,
"message": "Invalid params",
"description": "Invalid method parameter(s)"
},
"InternalError": {
"code": -32603,
"message": "Internal error",
"description": "Internal JSON-RPC error"
},
"ServiceNotFound": {
"code": -32000,
"message": "Service not found",
"description": "The specified service does not exist"
},
"ServiceExists": {
"code": -32001,
"message": "Service exists",
"description": "A service with this name already exists"
},
"ServiceRunning": {
"code": -32002,
"message": "Service is running",
"description": "Operation not allowed while service is running"
},
"ServiceNotRunning": {
"code": -32003,
"message": "Service not running",
"description": "Operation requires service to be running"
}
}
}
}