---
title: "Updates a Kubernetes node pool in the project and returns the async operation."
method: PATCH
path: "/projects/{project_id}/kubernetes/nodepools/{node_pool_id}"
tags: ["Kubernetes Node Pools"]
---

# Updates a Kubernetes node pool in the project and returns the async operation.

`PATCH /projects/{project_id}/kubernetes/nodepools/{node_pool_id}`

## Path parameters

- `project_id` string, required
- `node_pool_id` string, required

## Request body

- KubernetesNodePoolPatchRequest
  - `action` 'RESERVE' | 'UNRESERVE' | 'UPDATE', required — Action to perform on the node pool: RESERVE, UNRESERVE, or UPDATE. RESERVE and UNRESERVE operations are done synchronously, and so will have succeeded with a 200 response. Defaults to UPDATE if no action is specified.
  - `count` integer, required — New number of nodes in the node pool.
  - `ephemeral_storage_for_containerd` boolean, required — Whether the first local ephemeral NVMe disk is used for containerd storage.
  - `node_labels` object, required — New labels for the node pool. Labels provided in the PATCH request do not modify existing nodes, but apply to any newly created nodes.
  - `node_pool_version` string, required — New Kubernetes node pool version for newly created VMs.
  - `node_taints` KubernetesNodeTaint[], required — New taints for nodes in this node pool. Taints provided in the PATCH request do not modify existing nodes, but apply to any newly created nodes. This field has three behaviors: Omitted (null): existing taints are left unchanged. Empty array ([]): all existing taints are cleared. Non-empty array: existing taints are fully replaced by the provided list. Each (key, effect) pair in the list must be unique. Up to 50 taints are allowed. See KubernetesNodeTaint for per-field format rules.
    - `effect` 'NoSchedule' | 'PreferNoSchedule' | 'NoExecute', required — Taint effect, controlling how pods are treated on matching nodes: NoSchedule: new pods are not scheduled unless they tolerate. PreferNoSchedule: new pods avoid the node if possible. NoExecute: new pods are not scheduled AND existing non-tolerating pods are evicted.
    - `key` string, required — Taint key. Follows the Kubernetes qualified-name format: an optional DNS subdomain prefix (up to 253 characters) followed by a '/', then a name segment (up to 63 characters). Allowed characters: alphanumerics, '-', '_', and '.'. Must start and end with an alphanumeric character. Keys beginning with "crusoe.ai/" are reserved for internal use.
    - `value` string — Taint value. May be empty. Follows the same format rules as a Kubernetes label value: up to 63 characters, alphanumerics and '-', '_', '.'.
  - `reservation_id` string, required — New reservation ID for the node pool.
  - `ssh_public_key` string, required — New SSH public key to use for all VMs created from this node pool.

## Response `200`

- AsyncOperationResponse
  - `operation` Operation, required — Individual resources that use Operations should populate the `metadata` field with resource-specific information.
    - `completed_at` string, required
    - `metadata` string, required
    - `operation_id` string, required
    - `result` string
    - `started_at` string, required
    - `state` 'IN_PROGRESS' | 'SUCCEEDED' | 'FAILED', required

## Other responses

- `401` — Error Authentication Failed
- `403` — Error Permissions
- `500` — Error Internal Server

---

[API](https://skmtc.dev/crusoecloud/apis/crusoe-cloud-api-gateway.md) · [All operations](https://skmtc.dev/crusoecloud/apis/crusoe-cloud-api-gateway/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/crusoecloud/crusoe-cloud-api-gateway/revisions/a3fd2dedc72b/schema)
