> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.nvidia.com/infra-controller/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.nvidia.com/infra-controller/_mcp/server.

# Update SKU

PATCH https://nico-rest-api.nico.svc.cluster.local/v2/org/{org}/nico/sku/{skuId}
Content-Type: application/json

Update selected mutable fields on a SKU. The Site is determined from the saved SKU record.

Fields omitted from the request retain their current values. If a user updates the components field,
the schema version will be updated to the current version (5).

The Org must have an Infrastructure Provider that owns the SKU's Site. The user must have an authorization role with the `PROVIDER_ADMIN` suffix.

Reference: https://docs.nvidia.com/infra-controller/infra-controller/rest-api-reference/api-reference/sku/update-sku

## OpenAPI Specification

```yaml
openapi: 3.1.0
info:
  title: NVIDIA Infra Controller REST API
  version: 1.0.0
paths:
  /v2/org/{org}/nico/sku/{skuId}:
    patch:
      operationId: update-sku
      summary: Update SKU
      description: >-
        Update selected mutable fields on a SKU. The Site is determined from the
        saved SKU record.


        Fields omitted from the request retain their current values. If a user
        updates the components field,

        the schema version will be updated to the current version (5).


        The Org must have an Infrastructure Provider that owns the SKU's Site.
        The user must have an authorization role with the `PROVIDER_ADMIN`
        suffix.
      tags:
        - sku
      parameters:
        - name: org
          in: path
          description: Name of the Org
          required: true
          schema:
            type: string
        - name: skuId
          in: path
          description: ID of the SKU
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: >-
            ```

            export JWT_BEARER_TOKEN="<jwt-bearer-token>"


            # Example org name: "acme-inc

            export ORG_NAME=<org-name>


            # Use the JWT bearer token in your API request auth header:

            curl -v -X GET -H "Content-Type: application/json" -H
            "Authorization: Bearer $JWT_BEARER_TOKEN"
            https://nico-rest-api.nico.svc.cluster.local/v2/org/$ORG_NAME/nico/user/current

            ```
          required: true
          schema:
            type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Sku'
        '400':
          description: Error response when request data cannot be validated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NICoAPIError'
        '403':
          description: >-
            Error response when user is not authorized to call an endpoint or
            retrieve/modify objects
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NICoAPIError'
        '404':
          description: Error response when requested object is not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NICoAPIError'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SkuUpdateRequest'
servers:
  - url: https://nico-rest-api.nico.svc.cluster.local
    description: Kubernetes Cluster
components:
  schemas:
    SkuCpu:
      type: object
      properties:
        vendor:
          type: string
          description: Vendor of the CPU
        model:
          type: string
          description: Model of the CPU
        threadCount:
          type: integer
          format: uint
          description: Number of threads for the CPU
        count:
          type: integer
          format: uint
          description: Number of CPUs present
      description: CPU component in a SKU
      title: SkuCpu
    SkuGpu:
      type: object
      properties:
        vendor:
          type: string
          description: Vendor of the GPU
        model:
          type: string
          description: Model of the GPU
        totalMemory:
          type: string
          description: Total memory of the GPU (e.g. "80GB HBM3")
        count:
          type: integer
          format: uint
          description: Number of GPUs present
      description: GPU component in a SKU
      title: SkuGpu
    SkuMemory:
      type: object
      properties:
        capacityMb:
          type: integer
          format: uint
          description: Capacity in megabytes
        memoryType:
          type: string
          description: Type of memory (e.g. "DDR4", "DDR5")
        count:
          type: integer
          format: uint
          description: Number of memory modules present
      description: Memory component in a SKU
      title: SkuMemory
    SkuStorage:
      type: object
      properties:
        vendor:
          type: string
          description: >-
            Storage vendor used for schema version 4 matching. Read-only in REST
            mutation requests and preserved in responses for legacy SKUs. Schema
            version 5 does not use this field.
        model:
          type: string
          description: >-
            Informational storage model. Starting with the 2.1 release, NICo
            does not use this field for storage matching or validation.
        capacityMb:
          type: integer
          format: uint
          description: >-
            Storage capacity in megabytes used for schema version 4 matching.
            Read-only in REST mutation requests and preserved in responses for
            legacy SKUs. Schema version 5 uses minSizeMiB and maxSizeMiB
            instead.
        count:
          type: integer
          format: uint
          description: Number of storage devices present
        minSizeMiB:
          type:
            - integer
            - 'null'
          format: uint
          description: >-
            Inclusive minimum size in MiB for each storage device. Null or
            omission means no lower bound. Used for SKU schema version 5 and
            later.
        maxSizeMiB:
          type:
            - integer
            - 'null'
          format: uint
          description: >-
            Inclusive maximum size in MiB for each storage device. Null or
            omission means no upper bound. Used for SKU schema version 5 and
            later.
        pciPatterns:
          type: array
          items:
            type: string
          description: >-
            Regular expressions matched against storage sysfs PCI paths. An
            empty or omitted list disables PCI location matching. Used for SKU
            schema version 5 and later.
      description: Storage component in a SKU
      title: SkuStorage
    SkuChassis:
      type: object
      properties:
        vendor:
          type: string
          description: Vendor of the chassis
        model:
          type: string
          description: Model of the chassis
        architecture:
          type: string
          description: Architecture of the chassis
      description: Chassis component in a SKU
      title: SkuChassis
    SkuEthernetDevice:
      type: object
      properties:
        vendor:
          type: string
          description: Vendor of the ethernet device
        model:
          type: string
          description: Model of the ethernet device
        count:
          type: integer
          format: uint
          description: Number of ethernet devices present
        isConnected:
          type: boolean
          description: Whether the ethernet device is connected
      description: Ethernet device component in a SKU
      title: SkuEthernetDevice
    SkuInfinibandDevice:
      type: object
      properties:
        vendor:
          type: string
          description: Vendor of the infiniband device
        model:
          type: string
          description: Model of the infiniband device
        count:
          type: integer
          format: uint
          description: Number of infiniband devices present
        inactiveDevices:
          type: array
          items:
            type: integer
            format: uint
          description: Zero-based indexes of inactive devices
      description: Infiniband device component in a SKU
      title: SkuInfinibandDevice
    SkuTpm:
      type: object
      properties:
        vendor:
          type: string
          description: Vendor of the TPM
        version:
          type: string
          description: Version of the TPM
      description: TPM component in a SKU
      title: SkuTpm
    SkuComponents:
      type: object
      properties:
        cpus:
          type: array
          items:
            $ref: '#/components/schemas/SkuCpu'
          description: CPU components
        gpus:
          type: array
          items:
            $ref: '#/components/schemas/SkuGpu'
          description: GPU components
        memory:
          type: array
          items:
            $ref: '#/components/schemas/SkuMemory'
          description: Memory components
        storage:
          type: array
          items:
            $ref: '#/components/schemas/SkuStorage'
          description: Storage components
        chassis:
          $ref: '#/components/schemas/SkuChassis'
          description: Chassis component
        ethernetDevices:
          type: array
          items:
            $ref: '#/components/schemas/SkuEthernetDevice'
          description: Ethernet device components
        infinibandDevices:
          type: array
          items:
            $ref: '#/components/schemas/SkuInfinibandDevice'
          description: Infiniband device components
        tpm:
          type: array
          items:
            $ref: '#/components/schemas/SkuTpm'
          description: TPM components
      description: Hardware components that make up a SKU
      title: SkuComponents
    SkuUpdateRequest:
      type: object
      properties:
        description:
          type: string
          description: Replacement SKU description
        deviceType:
          type: string
          description: Replacement device type identifier
        components:
          $ref: '#/components/schemas/SkuComponents'
      description: |-
        Request data to update a SKU.
        At least one of description, deviceType, or components must be provided.
        The service preserves the schema version for metadata-only updates.
        Component updates replace the SKU using the current schema version,
        migrating legacy SKU schemas to the current format.
      title: SkuUpdateRequest
    Sku:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier for the SKU
        siteId:
          type: string
          format: uuid
          description: ID of the Site this SKU belongs to
        description:
          type: string
          description: Human-readable SKU description
        schemaVersion:
          type: integer
          format: uint
          description: Core SKU schema version when available
        deviceType:
          type:
            - string
            - 'null'
          description: Optional device type identifier (e.g. "gpu", "cpu", "storage")
        associatedMachineIds:
          type: array
          items:
            type: string
          description: List of machine IDs associated with this SKU
        components:
          $ref: '#/components/schemas/SkuComponents'
          description: Hardware components of this SKU
        created:
          type: string
          format: date-time
          description: ISO 8601 datetime when the SKU was created
        updated:
          type: string
          format: date-time
          description: ISO 8601 datetime when the SKU was last updated
      description: >-
        A SKU (Stock Keeping Unit) represents a unique hardware configuration
        discovered at a site.

        SKUs are automatically derived from machine hardware characteristics and
        used to group similar machines.
      title: Sku
    NiCoApiErrorSource:
      type: string
      enum:
        - nico
      description: Source of the error.
      title: NiCoApiErrorSource
    NiCoApiErrorData:
      type: object
      properties: {}
      description: Additional data about the error
      title: NiCoApiErrorData
    NICoAPIError:
      type: object
      properties:
        source:
          $ref: '#/components/schemas/NiCoApiErrorSource'
          description: Source of the error.
        message:
          type: string
          description: Message describing the error
        data:
          oneOf:
            - $ref: '#/components/schemas/NiCoApiErrorData'
            - type: 'null'
          description: Additional data about the error
      description: Describes the error response from NVIDIA Infra Controller REST API
      title: NICoAPIError
  securitySchemes:
    JWTBearerToken:
      type: http
      scheme: bearer
      description: >-
        ```

        export JWT_BEARER_TOKEN="<jwt-bearer-token>"


        # Example org name: "acme-inc

        export ORG_NAME=<org-name>


        # Use the JWT bearer token in your API request auth header:

        curl -v -X GET -H "Content-Type: application/json" -H "Authorization:
        Bearer $JWT_BEARER_TOKEN"
        https://nico-rest-api.nico.svc.cluster.local/v2/org/$ORG_NAME/nico/user/current

        ```

```

## Examples



**Request**

```json
{
  "description": "DGX H100 compute node with InfiniBand",
  "components": {
    "infinibandDevices": [
      {
        "vendor": "Mellanox Technologies",
        "model": "MT2910 Family [ConnectX-7]",
        "count": 4,
        "inactiveDevices": []
      }
    ]
  }
}
```

**Response**

```json
{
  "id": "lenovo.sr650v2.cpu.1",
  "siteId": "60189e9c-7d12-438c-b9ca-6998d9c364b1",
  "description": "Lenovo SR650 V2 compute node",
  "schemaVersion": 5,
  "deviceType": "gpu",
  "associatedMachineIds": [
    "fm100ht4v4mce2qstjnl8970nnj3ie6ecek4mtjn27pea4kre5gsa49jg0g"
  ],
  "components": {
    "cpus": [
      {
        "vendor": "Intel",
        "model": "Xeon Platinum 8480+",
        "threadCount": 112,
        "count": 2
      }
    ],
    "gpus": [
      {
        "vendor": "NVIDIA",
        "model": "H100 SXM5",
        "totalMemory": "80GB HBM3",
        "count": 8
      }
    ],
    "memory": [
      {
        "capacityMb": 65536,
        "memoryType": "DDR5",
        "count": 16
      }
    ],
    "storage": [
      {
        "vendor": "Samsung",
        "model": "PM9A3",
        "capacityMb": 7680000,
        "count": 4
      }
    ],
    "chassis": {
      "vendor": "Supermicro",
      "model": "SYS-420GP-TNR"
    }
  },
  "created": "2019-08-24T14:15:22Z",
  "updated": "2019-08-24T14:15:22Z"
}
```

**SDK Code**

```python
import requests

url = "https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/sku/skuId"

payload = {
    "description": "DGX H100 compute node with InfiniBand",
    "components": { "infinibandDevices": [
            {
                "vendor": "Mellanox Technologies",
                "model": "MT2910 Family [ConnectX-7]",
                "count": 4,
                "inactiveDevices": []
            }
        ] }
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.patch(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/sku/skuId';
const options = {
  method: 'PATCH',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"description":"DGX H100 compute node with InfiniBand","components":{"infinibandDevices":[{"vendor":"Mellanox Technologies","model":"MT2910 Family [ConnectX-7]","count":4,"inactiveDevices":[]}]}}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/sku/skuId"

	payload := strings.NewReader("{\n  \"description\": \"DGX H100 compute node with InfiniBand\",\n  \"components\": {\n    \"infinibandDevices\": [\n      {\n        \"vendor\": \"Mellanox Technologies\",\n        \"model\": \"MT2910 Family [ConnectX-7]\",\n        \"count\": 4,\n        \"inactiveDevices\": []\n      }\n    ]\n  }\n}")

	req, _ := http.NewRequest("PATCH", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/sku/skuId")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"description\": \"DGX H100 compute node with InfiniBand\",\n  \"components\": {\n    \"infinibandDevices\": [\n      {\n        \"vendor\": \"Mellanox Technologies\",\n        \"model\": \"MT2910 Family [ConnectX-7]\",\n        \"count\": 4,\n        \"inactiveDevices\": []\n      }\n    ]\n  }\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.patch("https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/sku/skuId")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"description\": \"DGX H100 compute node with InfiniBand\",\n  \"components\": {\n    \"infinibandDevices\": [\n      {\n        \"vendor\": \"Mellanox Technologies\",\n        \"model\": \"MT2910 Family [ConnectX-7]\",\n        \"count\": 4,\n        \"inactiveDevices\": []\n      }\n    ]\n  }\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/sku/skuId', [
  'body' => '{
  "description": "DGX H100 compute node with InfiniBand",
  "components": {
    "infinibandDevices": [
      {
        "vendor": "Mellanox Technologies",
        "model": "MT2910 Family [ConnectX-7]",
        "count": 4,
        "inactiveDevices": []
      }
    ]
  }
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/sku/skuId");
var request = new RestRequest(Method.PATCH);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"description\": \"DGX H100 compute node with InfiniBand\",\n  \"components\": {\n    \"infinibandDevices\": [\n      {\n        \"vendor\": \"Mellanox Technologies\",\n        \"model\": \"MT2910 Family [ConnectX-7]\",\n        \"count\": 4,\n        \"inactiveDevices\": []\n      }\n    ]\n  }\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "description": "DGX H100 compute node with InfiniBand",
  "components": ["infinibandDevices": [
      [
        "vendor": "Mellanox Technologies",
        "model": "MT2910 Family [ConnectX-7]",
        "count": 4,
        "inactiveDevices": []
      ]
    ]]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/sku/skuId")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "PATCH"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```