# List machines

URL: https://docs.hanzo.ai/docs/openapi/compute/listmachines

> Returns every machine the caller's org has — Visor's registry, the live DigitalOcean droplets and the DOKS worker nodes (deduped into one union), plus the BYO machines that dialed in via `hanzo link` (provider "byo").

`GET /v1/compute/machines`

> [Compute →](https://docs.hanzo.ai/docs/openapi/compute) · [All API references →](https://docs.hanzo.ai/docs/openapi) · [Get started →](https://docs.hanzo.ai/docs/guides)

|               |                                            |
| ------------- | ------------------------------------------ |
| **Address**   | `https://api.hanzo.ai/v1/compute/machines` |
| **Method**    | `GET`                                      |
| **Operation** | `listMachines`                             |
| **Auth**      | `Authorization: Bearer $HANZO_API_KEY`     |

Returns every machine the caller's org has — Visor's registry, the
live DigitalOcean droplets and the DOKS worker nodes (deduped into one union),
plus the BYO machines that dialed in via `hanzo link` (provider "byo").

A source Visor cannot answer for is logged and skipped, never an error: one
wedged upstream must not hide the machines the other sources can see.

## Request

1 field.

| Field  | In    | Type   | Required | Description |
| ------ | ----- | ------ | -------- | ----------- |
| `kind` | query | string | —        |             |

## Response

| Status    | Body                | Meaning |
| --------- | ------------------- | ------- |
| `200`     | compute.machineList | ok      |
| `default` | problem-details     | refused |

`200` body — 29 fields.

| Field                            | In   | Type                   | Always | Description                                                                                                                                                                                                             |
| -------------------------------- | ---- | ---------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `machines`                       | body | compute.machineView\[] | —      | Machines is every machine the org has: Visor-provisioned and BYO together.                                                                                                                                              |
| `machines[].agent`               | body | string                 | —      | Agent is the cloud Agent this machine runs, lifted out of the binding so a list reads without following one.                                                                                                            |
| `machines[].binding`             | body | compute.agentBinding   | —      |                                                                                                                                                                                                                         |
| `machines[].binding.agentName`   | body | string                 | —      | AgentName is the cloud Agent (/v1/agent) this machine runs — the agent a message to the bot is actually run against.                                                                                                    |
| `machines[].binding.botVersion`  | body | string                 | —      | BotVersion pins the @hanzo/bot runtime version the machine runs.                                                                                                                                                        |
| `machines[].binding.createdTime` | body | string                 | —      | CreatedTime is when the binding was first made.                                                                                                                                                                         |
| `machines[].binding.machineId`   | body | string                 | —      | MachineId is the bound machine as vm addresses it, owner-qualified ("\<org>/\<machine>").                                                                                                                               |
| `machines[].binding.message`     | body | string                 | —      | Message is vm's human-readable detail on Status ("machine provisioning; @hanzo/bot runtime not yet confirmed") — the reason behind the state, not a second state.                                                       |
| `machines[].binding.name`        | body | string                 | —      | Name is the binding's own key, which is the machine's id: a machine hosts at most one agent, so the binding is named for it.                                                                                            |
| `machines[].binding.org`         | body | string                 | —      | Org is the Hanzo tenant the binding belongs to.                                                                                                                                                                         |
| `machines[].binding.owner`       | body | string                 | —      | Owner is the tenant vm filed the binding under, resolved from the ?owner it was called with — which is the caller's validated org and never a body field.                                                               |
| `machines[].binding.provider`    | body | string                 | —      | Provider is the cloud the bound machine runs on, carried here so a bindings list says where each bot lives without a second read per machine.                                                                           |
| `machines[].binding.publicIp`    | body | string                 | —      | PublicIp is the bound machine's public address as vm recorded it on the binding.                                                                                                                                        |
| `machines[].binding.status`      | body | string                 | —      | Status is the binding's lifecycle in VM's OWN words — "Pending" while the machine provisions and the runtime is unconfirmed, "running" once vm has confirmed it.                                                        |
| `machines[].binding.updatedTime` | body | string                 | —      | UpdatedTime is when vm last reconciled it — the age of Status.                                                                                                                                                          |
| `machines[].createdTime`         | body | string                 | —      | CreatedTime is when the machine came into being: the provider's own creation timestamp for a Visor machine, passed through in whatever form it states it, and for a BYO machine the RFC 3339 moment it first dialed in. |
| `machines[].gpu`                 | body | string                 | —      | GPU names the accelerators this machine holds ("H100", or "2× NVIDIA GB10" for a BYO machine reporting a matched pair).                                                                                                 |
| `machines[].id`                  | body | string                 | —      | ID addresses this machine on the /v1/compute/machines/:id routes: the org-scoped NAME Visor keys a machine by, falling back to the provider id for a machine that has no name.                                          |
| `machines[].image`               | body | string                 | —      | Image is the OS image the machine booted from, as the provider names it.                                                                                                                                                |
| `machines[].mem`                 | body | string                 | —      | Mem is system RAM rendered for a human ("8 GB"), not a number to compute with.                                                                                                                                          |
| `machines[].name`                | body | string                 | —      | Name is the label to show a human — Visor's displayName, or the machine name when it carries none.                                                                                                                      |
| `machines[].os`                  | body | string                 | —      | Os is the operating system on the machine — Visor's record for a provisioned one, the host's own report (linux, darwin, windows) for a BYO one.                                                                         |
| `machines[].privateIp`           | body | string                 | —      | PrivateIp is the address on the provider's own network, reachable from the org's other machines in the same region.                                                                                                     |
| `machines[].provider`            | body | string                 | —      | Provider is the cloud that runs the machine ("digitalocean"), or "byo" for one the operator dialed in with `hanzo link`.                                                                                                |
| `machines[].publicIp`            | body | string                 | —      | PublicIp is the internet-facing address the provider assigned.                                                                                                                                                          |
| `machines[].region`              | body | string                 | —      | Region is the provider region slug ("sfo3"), or the zone when the provider reports only that.                                                                                                                           |
| `machines[].status`              | body | string                 | —      | Status is the lifecycle state in the PROVIDER's own words ("active", "running", "off"), passed through rather than mapped onto a vocabulary of ours.                                                                    |
| `machines[].type`                | body | string                 | —      | Type is the provider SIZE SLUG the machine runs at ("s-2vcpu-4gb", "gpu-h100x8-640gb") — the value a launch asks for, and what Vcpu/Mem/GPU are read out of when the provider states them no other way.                 |
| `machines[].vcpu`                | body | integer (int64)        | —      | Vcpu is logical cores — the provider's own cpuSize when that is a clean integer, else the count read out of the size slug (4 from "s-4vcpu-8gb").                                                                       |

Failure carries the platform error shape — see [Errors](https://docs.hanzo.ai/docs/errors).

## Examples

**CLI**

```bash
hanzo compute machines list
```

**SDK**

**.ts**

```ts
import { Configuration, ComputeApi } from 'hanzoai';

const api = new ComputeApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.listMachines();
```

**.py**

```python
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import ComputeApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = ComputeApi(client).list_machines()
```

**.go**

```go
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.ComputeAPI.ListMachines(context.Background()).Execute()
if err != nil {
	return err
}
```

**.rs**

```rust
use hanzo_client::apis::{configuration::Configuration, compute_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = compute_api::list_machines(&cfg, Default::default()).await?;
```

**.java**

```java
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.ComputeApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new ComputeApi(client).listMachines();
```

**HTTP**

```bash
curl https://api.hanzo.ai/v1/compute/machines \
  -H "Authorization: Bearer $HANZO_API_KEY"
```

**MCP**

Tool `compute`, op `listMachines` — POST the JSON-RPC envelope to `https://api.hanzo.ai/v1/mcp`.

```bash
curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "compute",
         "arguments": {
           "op": "listMachines",
           "input": {}
         }
       }
     }'
```

---

[Compute API](https://docs.hanzo.ai/docs/openapi/compute) · [All Hanzo APIs](https://docs.hanzo.ai/docs/openapi) · [Interactive reference](https://docs.hanzo.ai/docs/openapi/reference)
