---
title: "Create a node pool"
method: POST
path: "/lks/clusters/{cluster_id}/nodepools"
tags: ["LKS"]
---

# Create a node pool

`POST /lks/clusters/{cluster_id}/nodepools`

Adds a node pool to an LKS cluster. The platform provisions `count` servers of `plan` from stock, so both fields are required.

`kubernetes_version` defaults to the control-plane patch and may never be newer than it. `max_pods_per_node` is set once, here — it cannot be changed later.

## Path parameters

- `cluster_id` string, required

## Request body

- CreateLksNodePool
  - `data` object, required
    - `type` 'lks_node_pools', required
    - `attributes` object, required
      - `type` 'bare_metal'
      - `plan` string, required — Plan the pool nodes are provisioned from
      - `count` integer, required — Number of nodes; must be >= 1
      - `kubernetes_version` string — Patch; defaults to the cluster control-plane patch. Must not be newer than the control-plane patch (422 VERSION_SKEW)
      - `max_pods_per_node` integer — kubelet --max-pods for every node in the pool. Set once, at creation: it is immutable afterwards and a PATCH that carries it is rejected with 422. Omit to get the platform default (110).
      - `name` string — Optional; generated when omitted
      - `description` string
      - `labels` object — Kubernetes labels (max 50). Keys use Kubernetes label-key syntax; reserved prefixes (kubernetes.io, k8s.io, cluster.x-k8s.io, lks.latitude.sh and their subdomains) are rejected with 422. Values may be empty. The whole map is stored as sent.
      - `taints` LksNodePoolTaint[] — Kubernetes taints (max 50). Each (key, effect) pair must be unique. Key follows the same syntax and reserved-prefix rules as a label key.
        - `key` string, required
        - `value` string, nullable — May be empty; max 63 chars. Absent or null when the taint carries no value.
        - `effect` 'NoSchedule' | 'PreferNoSchedule' | 'NoExecute', required

## Response `201`

Created

## Other responses

- `403` — Forbidden
- `404` — Not Found
- `422` — Unprocessable Entity
- `502` — Bad Gateway — NetBox is temporarily unavailable

## Changes

- **2026-09-17** `e152782042e7` — 5 info
  - the request property `data/attributes/taints/items/value` became nullable (media type: application/json)
  - the request property `data/attributes/taints/items/value` became nullable (media type: application/vnd.api+json)
  - added the optional property `data/attributes/taints/items/value` to the response with the `201` status
  - added the required property `data/attributes/taints/items/effect` to the response with the `201` status
  - …1 more
- **2026-09-16** `2e0ac09a58ac` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/latitude/apis/latitude-sh-api/changes/lks/clusters/:cluster_id/nodepools/post.md)

---

[API](https://skmtc.dev/latitude/apis/latitude-sh-api.md) · [All operations](https://skmtc.dev/latitude/apis/latitude-sh-api/llms.txt) · [OpenAPI document](https://skmtc.dev/latitude/apis/latitude-sh-api/revisions/3a64859195ed?raw)
