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

# Create or update Rack health report

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

Add or update a health report override for a specific Rack.

Org must have an Infrastructure Provider entity that owns the Site. User must have authorization role with `PROVIDER_ADMIN` suffix.

Reference: https://docs.nvidia.com/infra-controller/rest-api-reference/api-reference/rack/create-or-update-rack-health-report

## 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
- `id` (string, required) — ID of the Rack

### Body (application/json)

This endpoint expects a RackHealthReportEntryRequest.

- `siteId` (string, required) — ID of the Site that owns the Rack.
- `source` (string, required) — Health report source.
- `mode` (enum, required) — How updates to this health report should be handled
  - Allowed values: `Merge`, `Replace`
- `successes` (list of MachineHealthProbeSuccess, optional) — Results from successful health probes for the Rack.
- `alerts` (list of MachineHealthProbeAlert, optional) — Results from failed health probes for the Rack.

## Response

### 200

OK

- `source` (string, required) — Health report source.
- `mode` (enum, required) — How this health report was updated
  - Allowed values: `Merge`, `Replace`
- `triggeredBy` (string, optional) — Person or system that triggered this health report.
- `observedAt` (datetime, optional) — Date/time when the health report was observed.
- `successes` (list of MachineHealthProbeSuccess, optional) — Results from successful health probes for the Machine.
- `alerts` (list of MachineHealthProbeAlert, optional) — Results from failed health probes for the Machine.

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

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

### MachineHealthProbeSuccess

Describes results of successful Machine health probe

- `id` (string, required) — Health probe identifier
- `target` (string, optional, nullable) — Specific component targeted by health probe

### MachineHealthProbeAlert

Describes results of a failed Machine health probe

- `id` (string, required) — Health probe identifier
- `message` (string, required) — Details of the failed health probe result
- `target` (string, optional, nullable) — Specific component targeted by health probe
- `inAlertSince` (datetime, optional, nullable) — Date/time since the alert has been in effect
- `tenantMessage` (string, optional, nullable) — Information provided by Tenant, if any
- `classifications` (list of string, optional) — Classifications for this alert, category or impact

### NiCoApiErrorData

Additional data about the error

## Examples

**Request**

```json
{
  "siteId": "550e8400-e29b-41d4-a716-446655440000",
  "source": "overrides.sre",
  "mode": "Merge",
  "alerts": [
    {
      "id": "RackMaintenanceInProgress",
      "message": "Rack maintenance in progress",
      "classifications": [
        "PreventAllocations"
      ]
    }
  ]
}
```

**Response**

```json
{
  "source": "maintenance.dpu-reprovision",
  "mode": "Merge",
  "triggeredBy": "operator",
  "observedAt": "2026-06-24T12:00:00Z",
  "alerts": [
    {
      "id": "HostUpdateInProgress",
      "message": "DPU reprovisioning in progress",
      "classifications": [
        "PreventAllocations"
      ]
    }
  ]
}
```

**SDK Code**

```python
import requests

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

payload = {
    "siteId": "550e8400-e29b-41d4-a716-446655440000",
    "source": "overrides.sre",
    "mode": "Merge",
    "alerts": [
        {
            "id": "RackMaintenanceInProgress",
            "message": "Rack maintenance in progress",
            "classifications": ["PreventAllocations"]
        }
    ]
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript
const url = 'https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/rack/id/health-report';
const options = {
  method: 'PUT',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"siteId":"550e8400-e29b-41d4-a716-446655440000","source":"overrides.sre","mode":"Merge","alerts":[{"id":"RackMaintenanceInProgress","message":"Rack maintenance in progress","classifications":["PreventAllocations"]}]}'
};

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/rack/id/health-report"

	payload := strings.NewReader("{\n  \"siteId\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"source\": \"overrides.sre\",\n  \"mode\": \"Merge\",\n  \"alerts\": [\n    {\n      \"id\": \"RackMaintenanceInProgress\",\n      \"message\": \"Rack maintenance in progress\",\n      \"classifications\": [\n        \"PreventAllocations\"\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
require 'uri'
require 'net/http'

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

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\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"source\": \"overrides.sre\",\n  \"mode\": \"Merge\",\n  \"alerts\": [\n    {\n      \"id\": \"RackMaintenanceInProgress\",\n      \"message\": \"Rack maintenance in progress\",\n      \"classifications\": [\n        \"PreventAllocations\"\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.put("https://nico-rest-api.nico.svc.cluster.local/v2/org/org/nico/rack/id/health-report")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"siteId\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"source\": \"overrides.sre\",\n  \"mode\": \"Merge\",\n  \"alerts\": [\n    {\n      \"id\": \"RackMaintenanceInProgress\",\n      \"message\": \"Rack maintenance in progress\",\n      \"classifications\": [\n        \"PreventAllocations\"\n      ]\n    }\n  ]\n}")
  .asString();
```

```php
<?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/rack/id/health-report', [
  'body' => '{
  "siteId": "550e8400-e29b-41d4-a716-446655440000",
  "source": "overrides.sre",
  "mode": "Merge",
  "alerts": [
    {
      "id": "RackMaintenanceInProgress",
      "message": "Rack maintenance in progress",
      "classifications": [
        "PreventAllocations"
      ]
    }
  ]
}',
  '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/rack/id/health-report");
var request = new RestRequest(Method.PUT);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"siteId\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"source\": \"overrides.sre\",\n  \"mode\": \"Merge\",\n  \"alerts\": [\n    {\n      \"id\": \"RackMaintenanceInProgress\",\n      \"message\": \"Rack maintenance in progress\",\n      \"classifications\": [\n        \"PreventAllocations\"\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 = [
  "siteId": "550e8400-e29b-41d4-a716-446655440000",
  "source": "overrides.sre",
  "mode": "Merge",
  "alerts": [
    [
      "id": "RackMaintenanceInProgress",
      "message": "Rack maintenance in progress",
      "classifications": ["PreventAllocations"]
    ]
  ]
] 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/rack/id/health-report")! 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()
```