JSON-RPC Protocol
Both SDKs are thin wrappers around a JSON-RPC API served over HTTP on port 9473.
You can call the API directly with curl or any HTTP client — useful for languages without an official SDK, debugging, or quick scripting.
Request format
All requests are HTTP POST to:
http://<host>:9473/rpc/<MethodName>With a JSON body containing authentication and method-specific parameters.
With API token
{
"apiToken": "csk_your_token",
"vmID": "abc-123-...",
"other_params": "..."
}With node ID
{
"callerNodeID": "your-node-uuid",
"vmID": "abc-123-...",
"other_params": "..."
}Response format
Success (data-returning):
{
"vms": [...],
"someField": "value"
}Success (mutation):
{
"success": true,
"message": "Operation completed"
}Error:
{
"success": false,
"error": "VM not found"
}Complete endpoint table
| # | Endpoint | Mutating | Description |
|---|---|---|---|
| 1 | GetNodeInfo | No | Node hardware/software info |
| 2 | GetNodeStats | No | Real-time resource statistics |
| 3 | GetTasks | No | Background task list |
| 4 | ListVMs | No | List all VMs |
| 5 | StartVM | Yes | Start a VM |
| 6 | StopVM | Yes | Stop a VM |
| 7 | SuspendVM | Yes | Suspend (pause) a VM |
| 8 | StartVMRecovery | Yes | Boot into macOS Recovery Mode |
| 9 | ListSnapshots | No | List VM snapshots |
| 10 | CreateSnapshot | Yes | Create a snapshot |
| 11 | RestoreSnapshot | Yes | Restore a snapshot |
| 12 | DeleteSnapshot | Yes | Delete a snapshot |
| 13 | CloneVM | Yes | Clone a VM |
| 14 | RenameVM | Yes | Rename a VM |
| 15 | DeleteVM | Yes | Delete a VM |
| 16 | GetVMSettings | No | Get VM configuration |
| 17 | UpdateVMSettings | Yes | Update VM configuration |
| 18 | PushImage | Yes | Push VM as OCI image |
| 19 | GetRemoteResources | No | Node resource availability |
| 20 | ListRemoteIPSWs | No | List IPSW files |
| 21 | DownloadIPSWOnNode | Yes | Download an IPSW |
| 22 | ListRemoteOCIImages | No | List cached OCI images |
| 23 | PullOCIImageOnNode | Yes | Pull an OCI image |
| 24 | CreateVMOnNode | Yes | Create a VM |
| 25 | ExecCommand | Yes | Execute command via SSH |
| 26 | GetFleetOverview | No | Aggregated fleet status |
| 27 | GetFleetEvents | No | Fleet activity log |
| 28 | GenerateAPIToken | Yes | Create an API token |
| 29 | RevokeAPIToken | Yes | Revoke an API token |
| 30 | ListAPITokens | No | List API tokens (redacted) |
| 31 | ListTemplates | No | List VM templates |
| 32 | GetTemplate | No | Get a template by ID or name |
| 33 | CreateTemplateFromVM | Yes | Create template from VM |
| 34 | DeleteTemplate | Yes | Delete a template |
| 35 | ListSharedFolders | No | List VM shared folders |
| 36 | AddSharedFolder | Yes | Add a shared folder |
| 37 | RemoveSharedFolder | Yes | Remove a shared folder |
| 38 | SetSharedFolderEnabled | Yes | Toggle shared folder |
| 39 | Unpair | Yes | Remove a trusted node |
| 40 | CleanupVMs | Yes | Clean up expired VMs |
| 41 | GetIPSWInfo | No | Get IPSW file metadata |
| 42 | RequestPairing | — | Initiate pairing (no auth needed) |
| 43 | CompletePairing | — | Complete pairing (no auth needed) |
Mutating endpoints require a fullAccess API token. Read-only tokens can only call non-mutating endpoints.
Internal endpoints
These are used for node-to-node VM migration and are not exposed in the SDKs:
| Endpoint | Description |
|---|---|
PrepareMigration | Prepare source VM for migration |
GetMigrationChunk | Read a chunk of VM data |
CompleteMigration | Finalize source after migration |
CancelMigration | Cancel an in-progress migration |
PrepareReceive | Prepare target for incoming migration |
ReceiveChunk | Write a chunk of VM data |
FinalizeMigration | Finalize target after migration |
curl examples
List VMs
curl -s -X POST http://192.168.1.100:9473/rpc/ListVMs \
-H "Content-Type: application/json" \
-d '{"apiToken": "csk_your_token"}' | jqStart a VM
curl -s -X POST http://192.168.1.100:9473/rpc/StartVM \
-H "Content-Type: application/json" \
-d '{"apiToken": "csk_your_token", "vmID": "abc-123-..."}' | jqStop a VM
curl -s -X POST http://192.168.1.100:9473/rpc/StopVM \
-H "Content-Type: application/json" \
-d '{"apiToken": "csk_your_token", "vmID": "abc-123-..."}' | jqSuspend a VM
curl -s -X POST http://192.168.1.100:9473/rpc/SuspendVM \
-H "Content-Type: application/json" \
-d '{"apiToken": "csk_your_token", "vmID": "abc-123-..."}' | jqExecute a command
curl -s -X POST http://192.168.1.100:9473/rpc/ExecCommand \
-H "Content-Type: application/json" \
-d '{
"apiToken": "csk_your_token",
"vmID": "abc-123-...",
"command": "uname -a",
"sshUser": "admin",
"sshPassword": "password",
"timeout": 30
}' | jqUpdate VM settings
curl -s -X POST http://192.168.1.100:9473/rpc/UpdateVMSettings \
-H "Content-Type: application/json" \
-d '{
"apiToken": "csk_your_token",
"vmID": "abc-123-...",
"cpuCount": 8,
"memorySize": 16384,
"intent": "ci",
"ttlSeconds": 3600
}' | jqCreate a snapshot
curl -s -X POST http://192.168.1.100:9473/rpc/CreateSnapshot \
-H "Content-Type: application/json" \
-d '{
"apiToken": "csk_your_token",
"vmID": "abc-123-...",
"name": "before-test",
"description": "Clean state before integration tests"
}' | jqList templates
curl -s -X POST http://192.168.1.100:9473/rpc/ListTemplates \
-H "Content-Type: application/json" \
-d '{"apiToken": "csk_your_token"}' | jqCreate template from VM
curl -s -X POST http://192.168.1.100:9473/rpc/CreateTemplateFromVM \
-H "Content-Type: application/json" \
-d '{
"apiToken": "csk_your_token",
"vmID": "abc-123-...",
"name": "CI Runner Base",
"description": "macOS with Xcode 16",
"category": "cicd"
}' | jqGet fleet overview
curl -s -X POST http://192.168.1.100:9473/rpc/GetFleetOverview \
-H "Content-Type: application/json" \
-d '{"apiToken": "csk_your_token"}' | jqGet fleet events
curl -s -X POST http://192.168.1.100:9473/rpc/GetFleetEvents \
-H "Content-Type: application/json" \
-d '{"apiToken": "csk_your_token", "limit": 20}' | jqGet node info
curl -s -X POST http://192.168.1.100:9473/rpc/GetNodeInfo \
-H "Content-Type: application/json" \
-d '{"apiToken": "csk_your_token"}' | jqGet node stats
curl -s -X POST http://192.168.1.100:9473/rpc/GetNodeStats \
-H "Content-Type: application/json" \
-d '{"apiToken": "csk_your_token"}' | jqPull an OCI image
curl -s -X POST http://192.168.1.100:9473/rpc/PullOCIImageOnNode \
-H "Content-Type: application/json" \
-d '{
"apiToken": "csk_your_token",
"imageReference": "ghcr.io/myorg/macos-base:latest"
}' | jqPull with credentials (private registry)
curl -s -X POST http://192.168.1.100:9473/rpc/PullOCIImageOnNode \
-H "Content-Type: application/json" \
-d '{
"apiToken": "csk_your_token",
"imageReference": "ghcr.io/myorg/private:v1",
"credentials": {
"username": "user",
"password": "ghp_token..."
}
}' | jqCreate a VM
curl -s -X POST http://192.168.1.100:9473/rpc/CreateVMOnNode \
-H "Content-Type: application/json" \
-d '{
"apiToken": "csk_your_token",
"name": "ci-runner",
"cpuCount": 4,
"memoryMB": 8192,
"diskGB": 64,
"ociImage": "ghcr.io/myorg/macos-base:latest"
}' | jqCleanup expired VMs
curl -s -X POST http://192.168.1.100:9473/rpc/CleanupVMs \
-H "Content-Type: application/json" \
-d '{"apiToken": "csk_your_token", "force": false}' | jqAdd a shared folder
curl -s -X POST http://192.168.1.100:9473/rpc/AddSharedFolder \
-H "Content-Type: application/json" \
-d '{
"apiToken": "csk_your_token",
"vmID": "abc-123-...",
"name": "project-src",
"hostPath": "/Users/dev/project",
"readOnly": false
}' | jqSee also
- API Reference — SDK method mapping to RPC endpoints
- JavaScript / TypeScript SDK — Typed wrapper
- Python SDK — Typed wrapper
- CLI Reference — Terminal-based management