NVIDIA Run:ai Clusters API
Use these endpoints to create, manage and delete NVIDIA Run:ai Kubernetes clusters.
Use these endpoints to create, manage and delete NVIDIA Run:ai Kubernetes clusters.
openapi: 3.0.3
info:
version: latest
description: '# Introduction
The NVIDIA Run:ai Control-Plane API reference is a guide that provides an easy-to-use programming interface for adding various tasks to your application, including workload submission, resource management, and administrative operations.
NVIDIA Run:ai APIs are accessed using *bearer tokens*. To obtain a token, you need to create a **Service account** through the NVIDIA Run:ai user interface.
To create a service account, in your UI, go to Access → Service Accounts (for organization-level service accounts) or User settings → Access Keys (for user access keys), and create a new one.
After you have created a new service account, you will need to assign it access rules.
To assign access rules to the service account, see [Create access rules](https://run-ai-docs.nvidia.com/saas/infrastructure-setup/authentication/accessrules#create-or-delete-rules).
Make sure you assign the correct rules to your service account. Use the [Roles](https://run-ai-docs.nvidia.com/saas/infrastructure-setup/authentication/roles) to assign the correct access rules.
To get your access token, follow the instructions in [Request a token](https://run-ai-docs.nvidia.com/saas/reference/api/rest-auth/#request-an-api-token).
'
title: NVIDIA Run:ai Access Keys Clusters API
x-logo:
url: https://api.redocly.com/registry/raw/runai-xq8/saas/latest/public/runai-logo-api.png
altText: NVIDIA Run:ai
href: https://run.ai
license:
name: NVIDIA Run:ai
url: https://www.nvidia.com/en-us/agreements/enterprise-software/nvidia-software-license-agreement/
servers:
- url: https://app.run.ai
security:
- bearerAuth: []
tags:
- name: Clusters
description: Use these endpoints to create, manage and delete NVIDIA Run:ai Kubernetes clusters.
paths:
/api/v1/clusters:
get:
summary: Get a list of clusters.
description: Retrieve a list of clusters with details.
operationId: get_clusters
tags:
- Clusters
parameters:
- $ref: '#/components/parameters/QueryVerbosity'
- $ref: '#/components/parameters/QueryIncludeRequestedForDelete'
responses:
'200':
description: Executed successfully.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/DisplayedCluster'
'401':
$ref: '#/components/responses/401Unauthorized'
'403':
$ref: '#/components/responses/403Forbidden'
'404':
$ref: '#/components/responses/404NotFound'
'500':
$ref: '#/components/responses/500InternalServerError'
'503':
$ref: '#/components/responses/503ServiceUnavailable'
post:
summary: Create a cluster.
description: Use to create a Kubernetes cluster.
operationId: create_cluster
tags:
- Clusters
requestBody:
description: The cluster to create.
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ClusterCreationRequest'
responses:
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/DisplayedCluster'
'401':
$ref: '#/components/responses/401Unauthorized'
'403':
$ref: '#/components/responses/403Forbidden'
'404':
$ref: '#/components/responses/404NotFound'
'500':
$ref: '#/components/responses/500InternalServerError'
'503':
$ref: '#/components/responses/503ServiceUnavailable'
/api/v1/clusters/{clusterUuid}:
get:
summary: Get cluster by id.
description: Retrieve cluster details by Universally Unique Identifier (UUID).
operationId: get_cluster_by_uuid
tags:
- Clusters
parameters:
- $ref: '#/components/parameters/ClusterUuid'
- $ref: '#/components/parameters/QueryVerbosity'
responses:
'200':
description: Executed successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/DisplayedCluster'
'401':
$ref: '#/components/responses/401Unauthorized'
'403':
$ref: '#/components/responses/403Forbidden'
'404':
$ref: '#/components/responses/404NotFound'
'500':
$ref: '#/components/responses/500InternalServerError'
'503':
$ref: '#/components/responses/503ServiceUnavailable'
delete:
summary: Delete a cluster by id.
description: "Use to delete a cluster by Universally Unique Identifier (UUID). \nWill return 202 for success if this api was called on a cluster that its version is >=2.20, \nand force query param is false or not provided.\nWill return 204 for success if force query param is true, or if cluster is in a version < 2.20\n"
operationId: delete_cluster
tags:
- Clusters
parameters:
- $ref: '#/components/parameters/ClusterUuid'
- $ref: '#/components/parameters/QueryForceDelete'
responses:
'202':
$ref: '#/components/responses/202Accepted'
'204':
$ref: '#/components/responses/204NoContent'
'401':
$ref: '#/components/responses/401Unauthorized'
'403':
$ref: '#/components/responses/403Forbidden'
'500':
$ref: '#/components/responses/500InternalServerError'
'503':
$ref: '#/components/responses/503ServiceUnavailable'
put:
summary: Update a cluster by id.
description: Use to update the details of a Kubernetes cluster by Universally Unique Identifier (UUID).
operationId: updateCluster
tags:
- Clusters
parameters:
- $ref: '#/components/parameters/ClusterUuid'
requestBody:
description: The cluster details to update
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ClusterUpdateRequest'
responses:
'204':
$ref: '#/components/responses/204NoContent'
'400':
$ref: '#/components/responses/400BadRequest'
'401':
$ref: '#/components/responses/401Unauthorized'
'403':
$ref: '#/components/responses/403Forbidden'
'500':
$ref: '#/components/responses/500InternalServerError'
'503':
$ref: '#/components/responses/503ServiceUnavailable'
/api/v1/clusters/{clusterUuid}/metrics:
get:
summary: Get the cluster metrics data.
description: Retrieve the metrics data for a Kubernetes cluster by Universally Unique Identifier (UUID).
operationId: get_cluster_metrics
tags:
- Clusters
parameters:
- $ref: '#/components/parameters/ClusterUuid'
- $ref: '#/components/parameters/StartRequired'
- $ref: '#/components/parameters/EndRequired'
- $ref: '#/components/parameters/NumberOfSamples'
- $ref: '#/components/parameters/MetricsType'
- $ref: '#/components/parameters/ClusterMetricsGroupBy'
- $ref: '#/components/parameters/FilterByNodepoolName'
responses:
'200':
description: Executed successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/GroupedMetricsResponse'
text/csv: {}
'207':
description: Partial success.
content:
application/json:
schema:
$ref: '#/components/schemas/GroupedMetricsResponse'
'400':
$ref: '#/components/responses/400BadRequest'
'401':
$ref: '#/components/responses/401Unauthorized'
'403':
$ref: '#/components/responses/403Forbidden'
'404':
$ref: '#/components/responses/404NotFound'
'422':
$ref: '#/components/responses/422UnprocessableEntity'
'500':
$ref: '#/components/responses/500InternalServerError'
'503':
$ref: '#/components/responses/503ServiceUnavailable'
/api/v1/clusters/{clusterUuid}/cluster-install-info:
get:
summary: Retrieve the installation instructions of a cluster by ID.
description: "Use to retrieve installation instruction for a cluster by Universally Unique Identifier (UUID). \nSupports clusters version 2.15 or above.\n"
operationId: get_cluster_install_info_by_uuid
tags:
- Clusters
parameters:
- $ref: '#/components/parameters/ClusterUuid'
- $ref: '#/components/parameters/ClusterVersion'
- $ref: '#/components/parameters/ClusterRemoteURL'
responses:
'200':
description: Executed successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/ClusterInstallationInfoResponse'
'401':
$ref: '#/components/responses/401Unauthorized'
'403':
$ref: '#/components/responses/403Forbidden'
'404':
$ref: '#/components/responses/404NotFound'
'500':
$ref: '#/components/responses/500InternalServerError'
'503':
$ref: '#/components/responses/503ServiceUnavailable'
/v1/k8s/clusters/{cluster_uuid}/installfile:
get:
tags:
- Clusters
summary: Get cluster installation file by id.
description: "Retrieve the installation values file of a cluster by Retrieve the installation values file of a given cluster by ID. \nSupports clusters 2.13 and lower.\n"
operationId: getInstallFile
parameters:
- name: cluster_uuid
in: path
required: true
description: Unique identifier of the cluster.
schema:
type: string
format: uuid
- in: query
name: cloud
description: Cloud type identifier.
schema:
type: string
enum:
- gke
- aws
- aks
- op
- airgapped
- openshift
- in: query
name: clusterip
description: Comma-separated list of IP addresses that provide access to the cluster.
schema:
type: string
- in: query
name: format
description: Format of the output file.
schema:
type: string
enum:
- json
- yaml
default: yaml
responses:
'200':
$ref: '#/components/responses/OK'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/v1/k8s/clusters/{clusterUuid}/metrics:
get:
tags:
- Clusters
summary: Get cluster metrics.
operationId: getClusterMetrics
deprecated: true
description: Get current cluster metrics. If time range query parameters supplied, then historical data will be returned as well. Deprecated - please use api/v1/clusters/{clusterUuid}/metrics
parameters:
- $ref: '#/components/parameters/ClusterUuid'
- $ref: '#/components/parameters/Start'
- $ref: '#/components/parameters/End'
- $ref: '#/components/parameters/NumberOfSamples'
- $ref: '#/components/parameters/NodepoolName'
responses:
'200':
description: A Clusters metrics
content:
application/json:
schema:
$ref: '#/components/schemas/cluster'
'401':
$ref: '#/components/responses/401Unauthorized'
'403':
$ref: '#/components/responses/403Forbidden'
'404':
$ref: '#/components/responses/404NotFound'
'500':
$ref: '#/components/responses/500InternalServerError'
'503':
$ref: '#/components/responses/503ServiceUnavailable'
components:
schemas:
HttpResponse:
required:
- code
- message
properties:
code:
type: integer
minimum: 100
maximum: 599
message:
type: string
MetricsType:
type: string
description: specifies what data to request
enum:
- TOTAL_GPU_NODES
- GPU_UTILIZATION
- GPU_UTILIZATION_DISTRIBUTION
- GPU_MEMORY_UTILIZATION
- CPU_UTILIZATION
- CPU_MEMORY_UTILIZATION
- TOTAL_GPU
- GPU_QUOTA
- ALLOCATED_GPU
- UNALLOCATED_GPU
- AVG_WORKLOAD_WAIT_TIME
- WORKLOADS_COUNT
ClusterState:
type: string
description: The cluster's state.
enum:
- WaitingToConnect
- Connected
- Disconnected
- MissingPrerequisites
- ServiceIssues
- Unknown
DisplayedCluster:
type: object
required:
- uuid
- tenantId
- name
- createdAt
properties:
uuid:
type: string
format: uuid
tenantId:
$ref: '#/components/schemas/TenantId'
name:
type: string
createdAt:
type: string
format: date-time
domain:
type: string
nullable: true
version:
type: string
nullable: true
status:
$ref: '#/components/schemas/ClusterDisplayedStatus'
updatedAt:
type: string
format: date-time
nullable: true
deletedAt:
type: string
nullable: true
format: date-time
lastLiveness:
type: string
nullable: true
format: date-time
deleteRequestedAt:
description: the timestamp value of when the cluster deletion request was received
type: string
format: date-time
nullable: true
example:
uuid: A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11
name: example
tenantId: 1001
domain: my.company.com
status: {}
createdAt: '2020-01-01T00:00:00Z'
updatedAt: '2020-01-02T00:00:00Z'
lastLiveness: '2020-01-02T00:00:00Z'
version: 2.15.0
Error:
required:
- code
- message
properties:
code:
type: integer
minimum: 100
maximum: 599
message:
type: string
details:
type: string
example:
code: 400
message: Bad request - Resource should have a name
TimeRange:
type: object
description: Overtime metrics data. Returned only if both start and end query parameters are set.
required:
- resources
properties:
resources:
type: array
items:
$ref: '#/components/schemas/ResourcesDataOvertime'
Error1:
required:
- code
- message
properties:
code:
type: integer
format: int32
message:
type: string
ProjectName1:
type: string
example: project-a
ClusterName:
type: string
example: cluster-a
ClusterDisplayedStatus:
type: object
description: The cluster's displayed status.
nullable: true
allOf:
- $ref: '#/components/schemas/ClusterReportedStatus'
- type: object
properties:
state:
$ref: '#/components/schemas/ClusterState'
TenantId:
description: The id of the tenant.
type: integer
format: int32
example: 1001
ClusterId:
description: The id of the cluster.
type: string
format: uuid
example: 71f69d83-ba66-4822-adf5-55ce55efd210
ClusterDependenciesStatus:
type: object
required:
- required
- optional
properties:
required:
type: object
additionalProperties:
$ref: '#/components/schemas/ClusterDependencyStatus'
optional:
type: object
additionalProperties:
$ref: '#/components/schemas/ClusterDependencyStatus'
ResourceData:
type: object
description: quota equals to the given resources and allocated equal to the real count of used resources
required:
- quota
- allocated
properties:
quota:
type: number
example: 3
allocated:
type: number
example: 2.5
utilization:
type: number
example: 0.765
ClusterCreationRequest:
type: object
required:
- name
properties:
name:
type: string
domain:
type: string
version:
type: string
GroupedMetricsResponse:
type: object
required:
- measurements
properties:
measurements:
type: array
items:
$ref: '#/components/schemas/GroupedMeasurementResponse'
nodepoolName:
type: string
example: nodepoola
ResourcesDataOvertime:
allOf:
- $ref: '#/components/schemas/ResourcesData'
- type: object
required:
- timestamp
properties:
timestamp:
type: string
format: date-time
example: '2023-06-06T12:09:18.211Z'
GroupedMeasurementResponse:
type: object
required:
- type
- values
properties:
type:
type: string
description: specifies what data returned
example: ALLOCATED_GPU
labels:
type: object
nullable: true
description: labels of the metric measurement
example: '{''gpu'': ''3''}'
additionalProperties:
type: string
values:
type: array
nullable: true
items:
type: object
required:
- value
- timestamp
properties:
value:
type: string
example: '85'
timestamp:
type: string
format: date-time
nullable: true
example: '2023-06-06 12:09:18.211'
groups:
type: array
description: Group information for this measurement
items:
$ref: '#/components/schemas/GroupedMeasurementGroup'
cluster:
type: object
required:
- metadata
- current
properties:
metadata:
type: object
required:
- clusterId
- clusterName
properties:
clusterId:
$ref: '#/components/schemas/ClusterId'
clusterName:
$ref: '#/components/schemas/ClusterName'
current:
type: object
description: Current reported metrics data. resources holds data that is summed up to the cluster level and projectResources explains the division of it to projects
required:
- resources
- projectResources
properties:
resources:
type: array
items:
allOf:
- $ref: '#/components/schemas/ResourcesData'
- type: object
required:
- nodepoolName
properties:
nodepoolName:
$ref: '#/components/schemas/NodepoolName'
projectResources:
type: array
items:
allOf:
- $ref: '#/components/schemas/ResourcesData'
- type: object
required:
- projectName
- departmentName
- nodepoolName
properties:
projectName:
$ref: '#/components/schemas/ProjectName1'
departmentName:
$ref: '#/components/schemas/DepartmentName'
nodepoolName:
$ref: '#/components/schemas/nodepoolName'
timeRange:
$ref: '#/components/schemas/TimeRange'
NodepoolName:
type: string
example: nodepoola
ClusterUpdateRequest:
type: object
required:
- name
properties:
name:
type: string
DepartmentName:
type: string
example: default
ResourcesData:
type: object
required:
- numberOfPendingWorkloads
- gpu
- cpu
- memory
properties:
numberOfPendingWorkloads:
type: integer
example: 1
gpu:
description: GPU resources in fractions. 0.7 = 70% of a gpu
$ref: '#/components/schemas/ResourceData'
cpu:
description: CPU resources in millicpus. 1000 = 1 cpu
$ref: '#/components/schemas/ResourceData'
memory:
description: Memory resources in megabytes. 1 = 10^6 (1000*1000)
$ref: '#/components/schemas/ResourceData'
GroupedMeasurementGroup:
type: object
required:
- key
- value
properties:
key:
type: string
example: Nodepool
description: The grouping key
value:
type: string
example: gpu-pool-1
description: The grouping value
ClusterDependencyStatus:
type: object
required:
- available
properties:
available:
type: boolean
description: whether the dependency is available
reason:
type: string
description: the reason for the dependency status
components:
type: object
additionalProperties:
$ref: '#/components/schemas/ClusterDependencyStatus'
ClusterReportedConfig:
description: Holds cluster configuration values.
type: object
properties:
workloadOwnershipProtection:
type: boolean
nullable: true
description: indicates if the cluster workload ownership protection is enabled
example: false
subdomainEnabled:
type: boolean
nullable: true
description: indicates if the cluster subdomain is enabled
example: false
ingressClass:
type: string
nullable: true
description: the ingress class that is configured for the cluster
example: nginx
nullable: true
ClusterInstallationInfoResponse:
type: object
required:
- installationStr
- repositoryName
- chartRepoURL
- clientSecret
properties:
installationStr:
type: string
repositoryName:
type: string
chartRepoURL:
type: string
clientSecret:
type: string
example:
installationStr: helm update --update repo/runai-cluster -n runai --set cluster.url=test_cluster
repositoryName: runai
chartRepoURL: https://runai.jfrog.io/artifactory/charts
clientSecret: ABC333DDD
ClusterReportedStatus:
type: object
description: the cluster status reported by the cluster
properties:
conditions:
items:
description: Condition contains details for one aspect of the current state of this API Resource
properties:
lastTransitionTime:
description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
format: date-time
type: string
message:
description: message is a human readable message indicating details about the transition. This may be an empty string.
maxLength: 32768
type: string
observedGeneration:
description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance.
format: int64
minimum: 0
type: integer
reason:
description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty.
maxLength: 1024
minLength: 1
pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
type: string
status:
description: status of the condition, one of True, False, Unknown.
enum:
- 'True'
- 'False'
- Unknown
type: string
type:
description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
maxLength: 316
type: string
required:
- lastTransitionTime
- message
- reason
- status
- type
type: object
type: array
operands:
additionalProperties:
description: Status specifies the status of an operand. And operand manages resources, some of which are not immediately available and need their status monitored, such as Deployments, Daemonsets, Ingressess etc. Some resources are immediately available and should not be monitored once accepted by the cluster, such as Services, ConfigMaps, Secrets etc. If all resources of an operand are ready, a Status with Ready set to 'true' and a nil 'Reasons' slice should be returned, otherwise, a Status with 'Reasons' slice containig the reason why the Operand is not ready (Deployment pods are not ready for example.)
properties:
lastTransitionTime:
description: LastTransitionTime specifies the last time the operand readiness changed
format: date-time
type: string
ready:
description: Ready specifies if the operand is ready or not
type: boolean
reasons:
description: Reasons specifies the reasons why the operand is not ready
items:
type: string
type: array
unreadyThresholdCrossed:
description: UnreadyThresholdCrossed specifies if the operand has been unready for longer than the threshold
type: boolean
required:
- ready
type: object
description: OperandStatuses specifies the status of the managed operands
type: object
platform:
nullable: true
type: object
properties:
type:
nullable: true
type: string
enum:
- vanilla
- openshift
- rke
- gke
- aks
- eks
description: the cluster platform type
kubeVersion:
nullable: true
type: string
description: the cluster kubernetes version
config:
$ref: '#/components/schemas/ClusterReportedConfig'
dependencies:
$ref: '#/components/schemas/ClusterDependenciesStatus'
parameters:
QueryForceDelete:
name: force
in: query
required: false
description: 'if true will force cluster instant deletion otherwise will start cluster graceful deletion process.
'
example: true
schema:
type: boolean
default: false
QueryVerbosity:
name: verbosity
in: query
required: false
description: 'response verbosity level.
'
example: full
schema:
type: string
enum:
- metadata
- full
default: full
FilterByNodepoolName:
name: nodepoolName
in: query
description: Filter using the nodepool.
required: false
schema:
type: string
example: default
ClusterRemoteURL:
name: remoteClusterUrl
in: query
required: false
description: The remote URL of the runai cluster
schema:
type: string
example: https://cluster.runai
StartRequired:
name: start
in: query
description: Start date of time range to fetch data in ISO 8601 timestamp format.
required: true
schema:
type: string
format: date-time
example: '2023-06-06T12:09:18.211Z'
Start:
name: start
in: query
description: Start of time range to fetch data from in UTC format.
required: false
schema:
type: string
format: date-time
example: '2023-06-06 12:09:18.211'
ClusterMetricsGroupBy:
name: groupBy
in: query
description: 'Labels to group the returned metrics data by. Grouping availability depends on the selected metric type. Supported values: "category" (workload category) or "node pool".
'
explode: false
required: false
schema:
type: string
enum:
- Category
- Nodepool
- Project
- Department
example: Category
EndRequired:
name: end
in: query
description: End date of time range to fetch data in ISO 8601 timestamp format.
required: true
schema:
type: string
format: date-time
example: '2023-06-07T12:09:18.211Z'
MetricsType:
name: metricType
in: query
required: true
description: specifies what data to request
explode: false
schema:
type: array
items:
$ref: '#/components/schemas/MetricsType'
End:
name: end
in: query
description: End of time range to fetch data from in UTC format.
required: false
schema:
type: string
format: date-time
example: '2023-06-07 12:09:18.211'
QueryIncludeRequestedForDelete:
name: includeRequestedForDelete
in: query
required: false
example: true
schema:
type: boolean
description: When true, includes clusters that are marked for deletion
ClusterVersion:
name: version
in: query
required: true
description: The cluster version to install
schema:
type: string
example: 2.16
NodepoolName:
in: query
name: nodepoolName
schema:
type: string
example: default
required: false
description: Filter by unique nodepool name.
NumberOfSamples:
name: numberOfSamples
in: query
description: The number of samples to take in the specified time range.
required: false
schema:
type: integer
example: 20
maximum: 1000
minimum: 0
default: 20
ClusterUuid:
name: clusterUuid
in: path
required: true
description: The Universally Unique Identifier (UUID) of the cluster.
schema:
type: string
format: uuid
minLength: 1
example: 9f55255e-11ed-47c7-acef-fc4054768dbc
responses:
202Accepted:
description: Accepted.
content:
application/json:
schema:
$ref: '#/components/schemas/HttpResponse'
example:
code: 202
message: Request has been accepted.
OK:
description: OK
content:
application/json:
schema:
type: string
format: text
404NotFound:
description: The specified resource was not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
code: 404
message: Resource id not found.
Unauthorized:
description: Unauthorized
content:
application/json:
# --- truncated at 32 KB (35 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/runai/refs/heads/main/openapi/runai-clusters-api-openapi.yml