---
title: Machines
description: The Machines API lets you update machines.
---

# Machines

The Machines API lets you update machines.

> **Auto-generated** from the public OpenAPI spec — this page never
> drifts from the running API. Base URL `https://api.arcnm.io`. Authenticate with
> the `X-API-Key` header (see [Authentication](../authentication.md)).

## Update Machine

`PATCH /api/v1/machines/{machine_id}`

**Parameters**

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `machine_id` | path | string | yes | Identifier of the machine. |

**Request body** (`application/json`)

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `capability_overrides` | object | no | Capability fields to change. For a library-derived machine these merge over the library default (sparse override); for a bespoke machine they merge into its own capability matrix. |
| `hourly_rate_eur` | number | no | New flat machine-hour rate in EUR/h; omit to leave. |
| `klass` | `milling.3axis_vmc` \| `milling.5axis_full` \| `milling.indexable_3plus2` \| `turning.2axis_cnc` \| `turning.live_tool` \| `turning.swiss_type` \| `turning.mill_integrex` \| `press_brake` \| `laser_cutter` \| `plasma_cutter` \| `guillotine_shear` \| `tube_bender` \| `turret_punch` \| `waterjet` \| `wire_edm` \| `sinter.dmls` \| `fdm_industrial` \| `injection_molding_press` \| `grinder.surface` \| `grinder.cylindrical` \| `saw.band` \| `saw.circular` | no | Correct the machine's process class (e.g. a lathe entered from a milling template). The machine is re-based on the new class's standard capability matrix and detached from its catalogue entry, because that entry describes a different kind of machine; name, rates and fleet memberships are kept. Omit to leave. |
| `name` | string | no | New machine name; omit to leave. |
| `rate_operator_eur_per_h` | number | no | Operator wage already contained in hourly_rate_eur, in EUR/h; omit to leave. 0 means the rate covers the machine only and operator labour is billed separately — the default. Set it when the rate is all-in, so the operator is not charged twice. |
| `rate_operator_share` | number | no | Share of an operator this machine consumes while it runs (0-1); omit to leave. Setup is always fully attended. Unset falls back to the machine class default. |

**Request**

<CodeTabs>

```bash title="cURL"
curl -X PATCH https://api.arcnm.io/api/v1/machines/{machine_id} \
  -H "X-API-Key: $ARCNM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "capability_overrides": {},
    "hourly_rate_eur": 0,
    "klass": "milling.3axis_vmc",
    "name": "string",
    "rate_operator_eur_per_h": 0,
    "rate_operator_share": 0
  }'
```

```python title="Python"
import requests

resp = requests.patch(
    "https://api.arcnm.io/api/v1/machines/{machine_id}",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "capability_overrides": {},
        "hourly_rate_eur": 0,
        "klass": "milling.3axis_vmc",
        "name": "string",
        "rate_operator_eur_per_h": 0,
        "rate_operator_share": 0
    },
)
resp.raise_for_status()
print(resp.json())
```

```typescript title="TypeScript"
const resp = await fetch("https://api.arcnm.io/api/v1/machines/{machine_id}", {
  method: "PATCH",
  headers: {
    "X-API-Key": process.env.ARCNM_API_KEY!,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "capability_overrides": {},
    "hourly_rate_eur": 0,
    "klass": "milling.3axis_vmc",
    "name": "string",
    "rate_operator_eur_per_h": 0,
    "rate_operator_share": 0
  }),
})
const data = await resp.json()
```

</CodeTabs>

**Responses**

| Status | Description |
| --- | --- |
| `200` | Successful Response |
| `422` | Validation Error |

**Errors**

Standard error responses — see the [Errors catalog](../errors.md) for the full envelope, `request_id`, and retry-safety table.

| Status | Code | When |
| --- | --- | --- |
| `401` | `invalid_api_key` | Missing, malformed, or revoked API key. |
| `403` | `insufficient_scope` | The key is valid but lacks a scope this endpoint requires. |
| `404` | `not_found` | A referenced resource doesn't exist or isn't visible to your organisation. |
| `409` | `conflict` | A conflicting change, or an `Idempotency-Key` reused with a different body. |
| `429` | `rate_limited` | Per-key or per-org rate limit exceeded — back off with jitter and retry. |


**Response body** `200`

| Field | Type | Description |
| --- | --- | --- |
| `burden_rate_eur` | number | Overhead burden added on top of the machine-hour rate, in EUR per hour. |
| `capabilities` | object | Raw stored capability matrix; empty for library-derived instances (see effective_capabilities). |
| `hourly_rate_eur` | number | Machine-hour rate in EUR per hour. |
| `id` | string | Unique identifier of the machine definition. |
| `klass` | string | Machine class (e.g. milling, turning, laser_cutter). |
| `model_no` | string | Vendor model number of the machine. |
| `name` | string | Human-readable name of the machine. |
| `rate_operator_eur_per_h` | number | Operator wage already contained in hourly_rate_eur, in EUR per hour. 0 means the rate covers the machine only and operator labour is billed separately. |
| `rate_operator_share` | number | Share of an operator this machine consumes while it runs (0-1); setup is always fully attended. Null falls back to the machine class default. |
| `source` | string | 'library' if instantiated from a catalog entry, else 'custom'. |
| `subclass` | string | Machine subclass refining the class (e.g. small, medium, large). |
| `valid_from` | string | ISO date (YYYY-MM-DD) from which this machine definition is effective. |
| `valid_to` | string | ISO date (YYYY-MM-DD) the machine stops being effective; null = open-ended. |
| `vendor` | string | Manufacturer or vendor of the machine. |

**Example response**

```json
{
  "burden_rate_eur": 0,
  "capabilities": {},
  "hourly_rate_eur": 0,
  "id": "string",
  "klass": "string",
  "model_no": "string",
  "name": "string",
  "rate_operator_eur_per_h": 0,
  "rate_operator_share": 0,
  "source": "custom",
  "subclass": "string",
  "valid_from": "string",
  "valid_to": "string",
  "vendor": "string"
}
```
