---
title: "Create nodes"
method: POST
path: "/v1/nodes"
tags: ["Nodes"]
---

# Create nodes

`POST /v1/nodes`

Create VM nodes

## Request body

- NodeApiCreateNodesRequest
  - `desired_count` integer, required
  - `zone` string — Zone to create the nodes in. Required for auto reserved nodes if any_zone is false.
  - `any_zone` boolean — Allow auto reserved nodes to be created in any zone that meets the requirements
  - `max_price_per_node_hour` integer, required — Max price per hour for a node in cents
  - `start_at` integer — Start time as Unix timestamp in seconds Optional for reserved nodes. If not provided, defaults to now
  - `end_at` integer, nullable — End time as Unix timestamp in seconds If provided, end time must be aligned to the hour If not provided, the node will be created as an autoreserved node
  - `node_type` 'autoreserved' | 'reserved'
  - `names` string[] — Custom node names Names cannot begin with 'vm_' or 'n_' as this is reserved for system-generated IDs Names cannot be numeric strings Names cannot exceed 256 characters
  - `cloud_init_user_data` string, byte — User script to be executed during the VM's boot process Data should be base64 encoded
  - `image_id` string — Custom image ID to use for the VM instances
  - `forward_443` boolean — (Optional) If set, enables forwarding to the VM on port 443.
  - `_preview_enable_infiniband` boolean — **Experimental — subject to change or removal without notice.** Enables InfiniBand. Requires hardware in the chosen zone that supports InfiniBand.

## Response `201`

Nodes created successfully

- NodeApiListResponseNode
  - `object` string, required
  - `data` object[], required
    - `object` string, required
    - `id` string, required
    - `name` string, required
    - `zone` string, nullable
    - `gpu_type` 'H100' | 'H200', required
    - `owner` string, required
    - `status` 'pending' | 'awaitingcapacity' | 'running' | 'released' | 'terminated' | 'deleted' | 'failed' | 'unknown', required — Node Status
    - `created_at` integer, nullable — Creation time as Unix timestamp in seconds
    - `updated_at` integer, nullable — Last updated time as Unix timestamp in seconds
    - `start_at` integer, nullable — Start time as Unix timestamp in seconds
    - `end_at` integer, nullable — End time as Unix timestamp in seconds
    - `deleted_at` integer, nullable — Deletion time as Unix timestamp in seconds
    - `procurement_id` string, nullable
    - `max_price_per_node_hour` integer, nullable — Max price per hour you're willing to pay for a node in cents
    - `node_type` 'autoreserved' | 'reserved', required
    - `vms` NodeApiVmList
      - `object` string, required
      - `data` NodeApiVm[], required
        - `object` string, required
        - `id` string, required
        - `status` 'Pending' | 'Running' | 'Destroyed' | 'NodeFailure' | 'Unspecified', required
        - `created_at` integer, required
        - `updated_at` integer, required
        - `start_at` integer, nullable, required
        - `end_at` integer, nullable, required
        - `image_id` string, nullable
        - `zone` string, required
    - `current_vm` NodeApiVm
      - `object` string, required
      - `id` string, required
      - `status` 'Pending' | 'Running' | 'Destroyed' | 'NodeFailure' | 'Unspecified', required
      - `created_at` integer, required
      - `updated_at` integer, required
      - `start_at` integer, nullable, required
      - `end_at` integer, nullable, required
      - `image_id` string, nullable
      - `zone` string, required

## Other responses

- `400` — Bad request
- `401` — Unauthorized request
- `402` — Payment Required
- `403` — Forbidden
- `500` — Internal server error

## Changes

- **2026-05-15** `63632dd3473b` — 1 warning, 1 info
  - removed the request property `enable_infiniband`
  - added the new optional request property `_preview_enable_infiniband`
- **2026-05-15** `b819ba3108b3` — 4 warning, 61 info
  - removed the optional property `error/details` from the response with the `401` status
  - removed the optional property `error/details` from the response with the `402` status
  - removed the optional property `error/details` from the response with the `403` status
  - removed the optional property `error/details` from the response with the `500` status
  - …61 more
- **2026-01-24** `efc2aea65f9b` — 1 info
  - added the new optional request property `forward_443`
- **2025-12-19** `03edf542ab39` — 5 info
  - removed the `resource_unavailable` enum value from the `error/type` response property for the response status `400`
  - removed the `resource_unavailable` enum value from the `error/type` response property for the response status `401`
  - removed the `resource_unavailable` enum value from the `error/type` response property for the response status `402`
  - removed the `resource_unavailable` enum value from the `error/type` response property for the response status `403`
  - …1 more
- …earlier changes not shown

[Full history](https://skmtc.dev/sfcompute/apis/san-francisco-compute-documentation/changes/v1/nodes/post.md)

---

[API](https://skmtc.dev/sfcompute/apis/san-francisco-compute-documentation.md) · [All operations](https://skmtc.dev/sfcompute/apis/san-francisco-compute-documentation/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/sfcompute/san-francisco-compute-documentation/revisions/93dd7661e9bb/schema)
