> This page is for NVIDIA Infra Controller.

> 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.

# Replace all Expected Racks

PUT https://nico-rest-api.nico.svc.cluster.local/v2/org/{org}/nico/expected-rack
Content-Type: application/json

Deprecated compatibility route. Use `PUT /v2/org/{org}/nico/expected-rack/all` instead. This route preserves the same Site scoping, authorization, validation, response, and mutation semantics during migration.

Replace the full set of Expected Racks for a Site with the provided list. All existing Expected Racks for the Site that are not in the request body will be deleted, and any new Expected Racks in the request will be created. Existing Expected Racks with matching `rackId` values will be updated.

Every entry in `expectedRacks` must reference the same `siteId` as the top-level `siteId`. `rackId` values must be unique within the request. The `expectedRacks` array may be empty to clear all Expected Racks for the Site.

Org must have an Infrastructure Provider entity. User must have authorization role with `PROVIDER_ADMIN` suffix.

Alternatively, Tenant Admins with `TargetedInstanceCreation` capability can also replace Expected Racks if they have an account with the Site's Infrastructure Provider.

Reference: https://docs.nvidia.com/infra-controller/rest-api-reference/api-reference/expected-rack/replace-all-expected-rack-legacy

## Authentication

- `Authorization` header (bearer token, required) — ``` 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 ```

## Request

### Path parameters

- `org` (string, required) — Name of the Org

### Body (application/json)

This endpoint expects an ExpectedRackList.

- `siteId` (string, required) — ID of the Site whose Expected Racks should be replaced
- `expectedRacks` (list of ExpectedRackCreateRequest, required) — The full desired set of Expected Racks for the Site. Every entry must reference the same `siteId` as the top-level field, and `rackId` values must be unique within the request. May be empty to clear all Expected Racks for the Site.

## Response

### 200

OK

- `list of ExpectedRack`

## Errors

### 400 Bad Request Error

Error response when request data cannot be validated

- `source` (string, optional) — Source of the error, taken from `api.name` in the REST API server configuration file (`/app/config.yaml` in the supplied Kubernetes deployment; default API name `nico`). This is a configurable string, for example `nico` or `carbide`
- `message` (string, optional) — Message describing the error
- `data` (NiCoApiErrorData, optional, nullable) — Additional data about the error
- `retryable` (boolean, optional) — True permits bounded retries with backoff, without guaranteeing success. False prohibits automatic retries. Omission means unclassified.

### 403 Forbidden Error

Error response when user is not authorized to call an endpoint or retrieve/modify objects

- `source` (string, optional) — Source of the error, taken from `api.name` in the REST API server configuration file (`/app/config.yaml` in the supplied Kubernetes deployment; default API name `nico`). This is a configurable string, for example `nico` or `carbide`
- `message` (string, optional) — Message describing the error
- `data` (NiCoApiErrorData, optional, nullable) — Additional data about the error
- `retryable` (boolean, optional) — True permits bounded retries with backoff, without guaranteeing success. False prohibits automatic retries. Omission means unclassified.

### 409 Conflict Error

Error response when the request conflicts with an existing resource or operation

- `source` (string, optional) — Source of the error, taken from `api.name` in the REST API server configuration file (`/app/config.yaml` in the supplied Kubernetes deployment; default API name `nico`). This is a configurable string, for example `nico` or `carbide`
- `message` (string, optional) — Message describing the error
- `data` (NiCoApiErrorData, optional, nullable) — Additional data about the error
- `retryable` (boolean, optional) — True permits bounded retries with backoff, without guaranteeing success. False prohibits automatic retries. Omission means unclassified.

## Types

### ExpectedRackCreateRequest

Request data to create a new Expected Rack. Core finds the unique ExpectedRackGroup containing rackId; zero or multiple matches return an explicit validation error. rackGroupId is output-only, not a creation parameter. Core persists the inferred group ID and derives the profile as UPPERCASE_TOPOLOGY_VENDOR, appending _NO_POWERSHELF when that rack has no power shelf members. For protocol NVLINK_V6, a topology beginning with `gb` followed by digits and `_` is normalized to the `vr_` topology family for profile derivation, and Core records a warning. Across that rack's compute, switch, and power shelf manufacturers, case-insensitive matches select WIWYNN first, then LENOVO, then SMC (including Supermicro); otherwise the vendor is NVIDIA. For example, WiWynn compute trays, NVIDIA switches, and NVIDIA power shelves produce GB200_NVL72R1_C2G4_WIWYNN; without power shelf members they produce GB200_NVL72R1_C2G4_WIWYNN_NO_POWERSHELF. Compute and switch members are required, manufacturers must be nonblank, and the generated ID must exist in Core rack profile configuration. The `rackId` is an operator-supplied string identifier (not a UUID) that must be unique within the Site. Chassis identity and physical location information are conveyed via well-known label keys in `labels`: - `chassis.manufacturer`, `chassis.serial-number`, `chassis.model` - `location.region`, `location.datacenter`, `location.room`, `location.position`

- `siteId` (string, required) — ID of the Site the Expected Rack belongs to
- `rackId` (string, required) — Operator-supplied identifier for the rack (string, not UUID). Must be non-empty and unique within the Site.
- `name` (string, optional, nullable) — Human-readable name of the Expected Rack
- `description` (string, optional, nullable) — Human-readable description of the Expected Rack
- `labels` (map from string to string, optional) — User-defined key-value pairs for organizing and categorizing Expected Racks. Well-known keys (`chassis.*`, `location.*`) are used to convey chassis identity and physical location.
- `rackProfileId` (string, optional, deprecated) — Ignored compatibility field. Core derives the profile from the matching ExpectedRackGroup; omit this field.

### ExpectedRack

An Expected Rack represents a rack that is expected to be discovered at a Site. The `rackId` is an operator-supplied string identifier (not a UUID) that uniquely identifies the rack within the Site. Each Expected Rack references a Rack Profile that describes the rack's expected layout and capabilities. Chassis identity and physical location information are conveyed via well-known label keys in `labels`: - `chassis.manufacturer`, `chassis.serial-number`, `chassis.model` - `location.region`, `location.datacenter`, `location.room`, `location.position`

- `id` (string, optional) — Unique identifier (UUID) for the Expected Rack
- `rackId` (string, optional) — Operator-supplied identifier for the rack (string, not UUID). Unique within a Site.
- `siteId` (string, optional) — ID of the Site the Expected Rack belongs to
- `rackProfileId` (string, optional) — Identifier of the Rack Profile this rack conforms to
- `rackGroupId` (string, optional, nullable) — External rack group ID selected and persisted at creation together with rackProfileId. Null for legacy rows without a recorded group; metadata updates preserve it.
- `name` (string, optional) — Human-readable name of the Expected Rack
- `description` (string, optional) — Human-readable description of the Expected Rack
- `labels` (map from string to string, optional) — User-defined key-value pairs for organizing and categorizing Expected Racks. Well-known keys (`chassis.*`, `location.*`) are used to convey chassis identity and physical location.
- `created` (datetime, optional) — ISO 8601 datetime when the Expected Rack was created
- `updated` (datetime, optional) — ISO 8601 datetime when the Expected Rack was last updated

### NiCoApiErrorData

Additional data about the error

## Examples

**Request**

```json
{
  "siteId": "f97df110-f4de-492e-8849-4a6af68026b0",
  "expectedRacks": [
    {
      "siteId": "f97df110-f4de-492e-8849-4a6af68026b0",
      "rackId": "rack-01",
      "name": "Rack 01",
      "description": "Production rack in row A",
      "labels": {
        "chassis.manufacturer": "NVIDIA",
        "chassis.model": "GB200-NVL72",
        "chassis.serial-number": "NVRK0001001",
        "location.datacenter": "phx-dc01",
        "location.position": "A1"
      }
    },
    {
      "siteId": "f97df110-f4de-492e-8849-4a6af68026b0",
      "rackId": "rack-02",
      "name": "Rack 02",
      "description": "Production rack in row A",
      "labels": {
        "chassis.manufacturer": "NVIDIA",
        "chassis.model": "GB200-NVL72",
        "chassis.serial-number": "NVRK0001002",
        "location.datacenter": "phx-dc01",
        "location.position": "A2"
      }
    }
  ]
}
```

**Response**

```json
[
  {
    "id": "string",
    "rackId": "string",
    "siteId": "string",
    "rackProfileId": "string",
    "rackGroupId": "group-01",
    "name": "string",
    "description": "string",
    "labels": {},
    "created": "2024-01-15T09:30:00Z",
    "updated": "2024-01-15T09:30:00Z"
  }
]
```

**SDK Code**

```python example-1
import requests

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

payload = {
    "siteId": "f97df110-f4de-492e-8849-4a6af68026b0",
    "expectedRacks": [
        {
            "siteId": "f97df110-f4de-492e-8849-4a6af68026b0",
            "rackId": "rack-01",
            "name": "Rack 01",
            "description": "Production rack in row A",
            "labels": {
                "chassis.manufacturer": "NVIDIA",
                "chassis.model": "GB200-NVL72",
                "chassis.serial-number": "NVRK0001001",
                "location.datacenter": "phx-dc01",
                "location.position": "A1"
            }
        },
        {
            "siteId": "f97df110-f4de-492e-8849-4a6af68026b0",
            "rackId": "rack-02",
            "name": "Rack 02",
            "description": "Production rack in row A",
            "labels": {
                "chassis.manufacturer": "NVIDIA",
                "chassis.model": "GB200-NVL72",
                "chassis.serial-number": "NVRK0001002",
                "location.datacenter": "phx-dc01",
                "location.position": "A2"
            }
        }
    ]
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript example-1
const url = 'https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/expected-rack';
const options = {
  method: 'PUT',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"siteId":"f97df110-f4de-492e-8849-4a6af68026b0","expectedRacks":[{"siteId":"f97df110-f4de-492e-8849-4a6af68026b0","rackId":"rack-01","name":"Rack 01","description":"Production rack in row A","labels":{"chassis.manufacturer":"NVIDIA","chassis.model":"GB200-NVL72","chassis.serial-number":"NVRK0001001","location.datacenter":"phx-dc01","location.position":"A1"}},{"siteId":"f97df110-f4de-492e-8849-4a6af68026b0","rackId":"rack-02","name":"Rack 02","description":"Production rack in row A","labels":{"chassis.manufacturer":"NVIDIA","chassis.model":"GB200-NVL72","chassis.serial-number":"NVRK0001002","location.datacenter":"phx-dc01","location.position":"A2"}}]}'
};

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

```go example-1
package main

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

func main() {

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

	payload := strings.NewReader("{\n  \"siteId\": \"f97df110-f4de-492e-8849-4a6af68026b0\",\n  \"expectedRacks\": [\n    {\n      \"siteId\": \"f97df110-f4de-492e-8849-4a6af68026b0\",\n      \"rackId\": \"rack-01\",\n      \"name\": \"Rack 01\",\n      \"description\": \"Production rack in row A\",\n      \"labels\": {\n        \"chassis.manufacturer\": \"NVIDIA\",\n        \"chassis.model\": \"GB200-NVL72\",\n        \"chassis.serial-number\": \"NVRK0001001\",\n        \"location.datacenter\": \"phx-dc01\",\n        \"location.position\": \"A1\"\n      }\n    },\n    {\n      \"siteId\": \"f97df110-f4de-492e-8849-4a6af68026b0\",\n      \"rackId\": \"rack-02\",\n      \"name\": \"Rack 02\",\n      \"description\": \"Production rack in row A\",\n      \"labels\": {\n        \"chassis.manufacturer\": \"NVIDIA\",\n        \"chassis.model\": \"GB200-NVL72\",\n        \"chassis.serial-number\": \"NVRK0001002\",\n        \"location.datacenter\": \"phx-dc01\",\n        \"location.position\": \"A2\"\n      }\n    }\n  ]\n}")

	req, _ := http.NewRequest("PUT", 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 example-1
require 'uri'
require 'net/http'

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

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

request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"siteId\": \"f97df110-f4de-492e-8849-4a6af68026b0\",\n  \"expectedRacks\": [\n    {\n      \"siteId\": \"f97df110-f4de-492e-8849-4a6af68026b0\",\n      \"rackId\": \"rack-01\",\n      \"name\": \"Rack 01\",\n      \"description\": \"Production rack in row A\",\n      \"labels\": {\n        \"chassis.manufacturer\": \"NVIDIA\",\n        \"chassis.model\": \"GB200-NVL72\",\n        \"chassis.serial-number\": \"NVRK0001001\",\n        \"location.datacenter\": \"phx-dc01\",\n        \"location.position\": \"A1\"\n      }\n    },\n    {\n      \"siteId\": \"f97df110-f4de-492e-8849-4a6af68026b0\",\n      \"rackId\": \"rack-02\",\n      \"name\": \"Rack 02\",\n      \"description\": \"Production rack in row A\",\n      \"labels\": {\n        \"chassis.manufacturer\": \"NVIDIA\",\n        \"chassis.model\": \"GB200-NVL72\",\n        \"chassis.serial-number\": \"NVRK0001002\",\n        \"location.datacenter\": \"phx-dc01\",\n        \"location.position\": \"A2\"\n      }\n    }\n  ]\n}"

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

```java example-1
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.put("https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/expected-rack")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"siteId\": \"f97df110-f4de-492e-8849-4a6af68026b0\",\n  \"expectedRacks\": [\n    {\n      \"siteId\": \"f97df110-f4de-492e-8849-4a6af68026b0\",\n      \"rackId\": \"rack-01\",\n      \"name\": \"Rack 01\",\n      \"description\": \"Production rack in row A\",\n      \"labels\": {\n        \"chassis.manufacturer\": \"NVIDIA\",\n        \"chassis.model\": \"GB200-NVL72\",\n        \"chassis.serial-number\": \"NVRK0001001\",\n        \"location.datacenter\": \"phx-dc01\",\n        \"location.position\": \"A1\"\n      }\n    },\n    {\n      \"siteId\": \"f97df110-f4de-492e-8849-4a6af68026b0\",\n      \"rackId\": \"rack-02\",\n      \"name\": \"Rack 02\",\n      \"description\": \"Production rack in row A\",\n      \"labels\": {\n        \"chassis.manufacturer\": \"NVIDIA\",\n        \"chassis.model\": \"GB200-NVL72\",\n        \"chassis.serial-number\": \"NVRK0001002\",\n        \"location.datacenter\": \"phx-dc01\",\n        \"location.position\": \"A2\"\n      }\n    }\n  ]\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('PUT', 'https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/expected-rack', [
  'body' => '{
  "siteId": "f97df110-f4de-492e-8849-4a6af68026b0",
  "expectedRacks": [
    {
      "siteId": "f97df110-f4de-492e-8849-4a6af68026b0",
      "rackId": "rack-01",
      "name": "Rack 01",
      "description": "Production rack in row A",
      "labels": {
        "chassis.manufacturer": "NVIDIA",
        "chassis.model": "GB200-NVL72",
        "chassis.serial-number": "NVRK0001001",
        "location.datacenter": "phx-dc01",
        "location.position": "A1"
      }
    },
    {
      "siteId": "f97df110-f4de-492e-8849-4a6af68026b0",
      "rackId": "rack-02",
      "name": "Rack 02",
      "description": "Production rack in row A",
      "labels": {
        "chassis.manufacturer": "NVIDIA",
        "chassis.model": "GB200-NVL72",
        "chassis.serial-number": "NVRK0001002",
        "location.datacenter": "phx-dc01",
        "location.position": "A2"
      }
    }
  ]
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp example-1
using RestSharp;

var client = new RestClient("https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/expected-rack");
var request = new RestRequest(Method.PUT);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"siteId\": \"f97df110-f4de-492e-8849-4a6af68026b0\",\n  \"expectedRacks\": [\n    {\n      \"siteId\": \"f97df110-f4de-492e-8849-4a6af68026b0\",\n      \"rackId\": \"rack-01\",\n      \"name\": \"Rack 01\",\n      \"description\": \"Production rack in row A\",\n      \"labels\": {\n        \"chassis.manufacturer\": \"NVIDIA\",\n        \"chassis.model\": \"GB200-NVL72\",\n        \"chassis.serial-number\": \"NVRK0001001\",\n        \"location.datacenter\": \"phx-dc01\",\n        \"location.position\": \"A1\"\n      }\n    },\n    {\n      \"siteId\": \"f97df110-f4de-492e-8849-4a6af68026b0\",\n      \"rackId\": \"rack-02\",\n      \"name\": \"Rack 02\",\n      \"description\": \"Production rack in row A\",\n      \"labels\": {\n        \"chassis.manufacturer\": \"NVIDIA\",\n        \"chassis.model\": \"GB200-NVL72\",\n        \"chassis.serial-number\": \"NVRK0001002\",\n        \"location.datacenter\": \"phx-dc01\",\n        \"location.position\": \"A2\"\n      }\n    }\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift example-1
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "siteId": "f97df110-f4de-492e-8849-4a6af68026b0",
  "expectedRacks": [
    [
      "siteId": "f97df110-f4de-492e-8849-4a6af68026b0",
      "rackId": "rack-01",
      "name": "Rack 01",
      "description": "Production rack in row A",
      "labels": [
        "chassis.manufacturer": "NVIDIA",
        "chassis.model": "GB200-NVL72",
        "chassis.serial-number": "NVRK0001001",
        "location.datacenter": "phx-dc01",
        "location.position": "A1"
      ]
    ],
    [
      "siteId": "f97df110-f4de-492e-8849-4a6af68026b0",
      "rackId": "rack-02",
      "name": "Rack 02",
      "description": "Production rack in row A",
      "labels": [
        "chassis.manufacturer": "NVIDIA",
        "chassis.model": "GB200-NVL72",
        "chassis.serial-number": "NVRK0001002",
        "location.datacenter": "phx-dc01",
        "location.position": "A2"
      ]
    ]
  ]
] 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/expected-rack")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "PUT"
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()
```