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

# Power control NVLink Domains

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

Power control one or more NVLink Domains identified by their case-sensitive IDs.

Supported power states: `On`, `Off`, `Cycle`, `ForceOff`, `ForceCycle`, `ACPowerCycle`.
Exact lowercase forms remain accepted for compatibility. `ACPowerCycle` removes and restores AC power and is unsupported on Viking systems.

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

Reference: https://docs.nvidia.com/infra-controller/rest-api-reference/api-reference/domain/power-control-nvlink-domains

## 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 a BatchUpdateNVLinkDomainPowerStateRequest.

- `siteId` (string, required) — ID of the Site
- `domainIds` (list of string, required) — Nonblank, case-sensitive IDs of the NVLink Domains to power control. Exact duplicate IDs are rejected.
- `state` (enum, required) — Target power state. Exact lowercase forms are also accepted for compatibility.
  - Allowed values: `On`, `Off`, `Cycle`, `ForceOff`, `ForceCycle`, `ACPowerCycle`, `on`, `off`, `cycle`, `forceoff`, `forcecycle`, `acpowercycle`
- `ruleId` (string, optional) — Optional Operation Rule UUID. When set, pins every task spawned by this operation to the named rule and overrides Flow's default rule resolution.
- `overrideReadinessCheck` (boolean, optional, default: false) — When true, proceed even if one or more target components (or hosts on the owning rack for rack-scoped components) are reported as not ready by their persisted status. Intended for operator-supervised maintenance.

## Response

### 200

OK

- `taskIds` (list of string, optional) — List of task IDs created for the power control operation (one per rack)

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

### 404 Not Found Error

Error response when requested object is not found

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

### 500 Internal Server Error

Response when the API handler encounters an unexpected error

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

### 503 Service Unavailable Error

Response when the API handler encounters an unexpected error

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

### 504 Gateway Timeout Error

The Site did not return a result within the request budget allocated to Site communication within the request cycle. This can occur if the Site Controller is down or under heavy request load. Operations are in general safe to retry. In rare cases, operations that create or update resources may succeed even if timeout is returned.

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

### NiCoApiErrorData

Additional data about the error

## Examples

**Request**

```json
{
  "siteId": "550e8400-e29b-41d4-a716-446655440000",
  "domainIds": [
    "650e8400-e29b-41d4-a716-446655440001",
    "750e8400-e29b-41d4-a716-446655440002"
  ],
  "state": "Off"
}
```

**Response**

```json
{
  "taskIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}
```

**SDK Code**

```python power-off-domains
import requests

url = "https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/domain/nvlink/power"

payload = {
    "siteId": "550e8400-e29b-41d4-a716-446655440000",
    "domainIds": ["650e8400-e29b-41d4-a716-446655440001", "750e8400-e29b-41d4-a716-446655440002"],
    "state": "Off"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript power-off-domains
const url = 'https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/domain/nvlink/power';
const options = {
  method: 'PATCH',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"siteId":"550e8400-e29b-41d4-a716-446655440000","domainIds":["650e8400-e29b-41d4-a716-446655440001","750e8400-e29b-41d4-a716-446655440002"],"state":"Off"}'
};

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

```go power-off-domains
package main

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

func main() {

	url := "https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/domain/nvlink/power"

	payload := strings.NewReader("{\n  \"siteId\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"domainIds\": [\n    \"650e8400-e29b-41d4-a716-446655440001\",\n    \"750e8400-e29b-41d4-a716-446655440002\"\n  ],\n  \"state\": \"Off\"\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 power-off-domains
require 'uri'
require 'net/http'

url = URI("https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/domain/nvlink/power")

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  \"siteId\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"domainIds\": [\n    \"650e8400-e29b-41d4-a716-446655440001\",\n    \"750e8400-e29b-41d4-a716-446655440002\"\n  ],\n  \"state\": \"Off\"\n}"

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

```java power-off-domains
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/domain/nvlink/power")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"siteId\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"domainIds\": [\n    \"650e8400-e29b-41d4-a716-446655440001\",\n    \"750e8400-e29b-41d4-a716-446655440002\"\n  ],\n  \"state\": \"Off\"\n}")
  .asString();
```

```php power-off-domains
<?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/domain/nvlink/power', [
  'body' => '{
  "siteId": "550e8400-e29b-41d4-a716-446655440000",
  "domainIds": [
    "650e8400-e29b-41d4-a716-446655440001",
    "750e8400-e29b-41d4-a716-446655440002"
  ],
  "state": "Off"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp power-off-domains
using RestSharp;

var client = new RestClient("https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/domain/nvlink/power");
var request = new RestRequest(Method.PATCH);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"siteId\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"domainIds\": [\n    \"650e8400-e29b-41d4-a716-446655440001\",\n    \"750e8400-e29b-41d4-a716-446655440002\"\n  ],\n  \"state\": \"Off\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift power-off-domains
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "siteId": "550e8400-e29b-41d4-a716-446655440000",
  "domainIds": ["650e8400-e29b-41d4-a716-446655440001", "750e8400-e29b-41d4-a716-446655440002"],
  "state": "Off"
] 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/domain/nvlink/power")! 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()
```