Voltage Park Storage API
Create, list, resize, configure NFS squash on, and terminate shared storage volumes attachable to bare-metal rentals, with an hourly storage rate endpoint.
Create, list, resize, configure NFS squash on, and terminate shared storage volumes attachable to bare-metal rentals, with an hourly storage rate endpoint.
openapi: 3.0.1
info:
title: Voltage Park On-Demand API
description: >-
The all-purpose management API for Voltage Park On-Demand, the GPU cloud
offering on-demand and reserved NVIDIA H100 / H200 clusters as bare metal
and virtual machines. The API lets developers deploy and manage instant
VMs, bare-metal GPU rentals, SSH keys, shared storage, locations, billing,
and organization settings. Requests authenticate with a bearer API token
created on the Developers page of the Voltage Park dashboard; tokens are
valid for one year. The On-Demand platform is served on TensorDock
infrastructure.
termsOfService: https://www.voltagepark.com/legal
contact:
name: Voltage Park Support
url: https://support.voltagepark.com
version: 0.0.1
servers:
- url: https://cloud-api.voltagepark.com/api/v1
security:
- apiTokenAuth: []
tags:
- name: Virtual Machines
description: Deploy and manage on-demand GPU virtual machines and instant VMs.
- name: Bare Metal
description: Provision and manage multi-node bare-metal GPU rentals and clusters.
- name: Organization
description: Organization details, address, and SSH keys.
- name: Storage
description: Shared storage volumes attachable to bare-metal rentals.
- name: Locations
description: Locations, host nodes, and instant-deploy presets.
- name: Billing
description: Hourly rates and historical billing transactions.
- name: Validation
description: Validate cloud-init scripts before deployment.
paths:
/virtual-machines/instant/locations:
get:
tags: [Virtual Machines]
operationId: getInstantVmLocations
summary: List available locations for instant VMs
responses:
'200':
description: Paginated list of instant-deploy locations.
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedInstantDeployLocation'
/virtual-machines/instant/locations/{location_id}:
get:
tags: [Virtual Machines]
operationId: getInstantVmLocationDetails
summary: Location details for instant VMs
parameters:
- $ref: '#/components/parameters/LocationId'
responses:
'200':
description: Instant-deploy location details.
content:
application/json:
schema:
$ref: '#/components/schemas/InstantDeployLocation'
/virtual-machines/instant:
post:
tags: [Virtual Machines]
operationId: deployInstantVm
summary: Deploy an instant virtual machine
description: >-
Using a preset found at `/virtual-machines/instant/locations`, deploy a
preconfigured virtual machine in seconds.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/InstantVMConfig'
responses:
'201':
description: Instant VM deployed.
content:
application/json:
schema:
$ref: '#/components/schemas/InstantVMResult'
/virtual-machines/:
get:
tags: [Virtual Machines]
operationId: listVirtualMachines
summary: List of owned, unterminated virtual machines
responses:
'200':
description: Paginated list of virtual machines.
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedVirtualMachine'
/virtual-machines/{virtual_machine_id}:
get:
tags: [Virtual Machines]
operationId: getVirtualMachine
summary: Details for an unterminated virtual machine
parameters:
- $ref: '#/components/parameters/VirtualMachineId'
responses:
'200':
description: Virtual machine details.
content:
application/json:
schema:
$ref: '#/components/schemas/VirtualMachineDetails'
patch:
tags: [Virtual Machines]
operationId: modifyVirtualMachine
summary: Modify a virtual machine's details
parameters:
- $ref: '#/components/parameters/VirtualMachineId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PatchVirtualMachine'
responses:
'200':
description: Updated virtual machine details.
content:
application/json:
schema:
$ref: '#/components/schemas/VirtualMachineDetails'
delete:
tags: [Virtual Machines]
operationId: terminateVirtualMachine
summary: Terminate a virtual machine
parameters:
- $ref: '#/components/parameters/VirtualMachineId'
responses:
'204':
description: Virtual machine terminated.
/virtual-machines/{virtual_machine_id}/power-status:
put:
tags: [Virtual Machines]
operationId: setVirtualMachinePowerStatus
summary: Start or stop a virtual machine
parameters:
- $ref: '#/components/parameters/VirtualMachineId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/VMPowerSchema'
responses:
'200':
description: Power status change accepted.
/virtual-machines/{virtual_machine_id}/relocate:
post:
tags: [Virtual Machines]
operationId: relocateVirtualMachine
summary: Relocate a stopped-disassociated virtual machine to a new hostnode
parameters:
- $ref: '#/components/parameters/VirtualMachineId'
responses:
'200':
description: Relocation accepted.
/virtual-machines/{virtual_machine_id}/port-forward:
post:
tags: [Virtual Machines]
operationId: createPortForward
summary: Request port forwarding for a virtual machine
parameters:
- $ref: '#/components/parameters/VirtualMachineId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PortForwardConfig'
responses:
'201':
description: Port forwarding created.
delete:
tags: [Virtual Machines]
operationId: deletePortForward
summary: Delete port forwarding(s) for a virtual machine
parameters:
- $ref: '#/components/parameters/VirtualMachineId'
responses:
'204':
description: Port forwarding deleted.
/bare-metal/locations:
get:
tags: [Bare Metal]
operationId: listBareMetalLocations
summary: List of available baremetal locations
responses:
'200':
description: Paginated list of bare-metal locations.
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedBareMetalLocation'
/bare-metal/detailed-locations:
get:
tags: [Bare Metal]
operationId: listDetailedBareMetalLocations
summary: Get more detailed information about baremetal locations
responses:
'200':
description: Detailed bare-metal location information.
/bare-metal/:
post:
tags: [Bare Metal]
operationId: provisionBareMetal
summary: Provision a new bare-metal server rental
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BareMetalDeployConfig'
responses:
'201':
description: Bare-metal rental provisioned.
content:
application/json:
schema:
$ref: '#/components/schemas/DeployBareResult'
get:
tags: [Bare Metal]
operationId: listBareMetalRentals
summary: List of owned, unterminated baremetal machines
responses:
'200':
description: Paginated list of bare-metal rentals.
/bare-metal/kubernetes:
get:
tags: [Bare Metal]
operationId: listKubernetes
summary: Information about kubernetes deployments
responses:
'200':
description: Kubernetes deployment information.
/bare-metal/kubernetes/{cluster_id}/health:
get:
tags: [Bare Metal]
operationId: getKubernetesHealth
summary: Get the health status of a kubernetes cluster
parameters:
- $ref: '#/components/parameters/ClusterId'
responses:
'200':
description: Kubernetes cluster health.
/bare-metal/kubernetes/{cluster_id}/slurm-user:
post:
tags: [Bare Metal]
operationId: upsertSlurmUser
summary: Add or update Slurm user for a Kubernetes cluster
parameters:
- $ref: '#/components/parameters/ClusterId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SlurmUserRequest'
responses:
'200':
description: Slurm user added or updated.
/bare-metal/kubernetes/{cluster_id}/addons/{addon}:
get:
tags: [Bare Metal]
operationId: getKubernetesAddon
summary: Get details for a specific addon for a Kubernetes cluster
parameters:
- $ref: '#/components/parameters/ClusterId'
- name: addon
in: path
required: true
schema:
type: string
responses:
'200':
description: Addon details.
/bare-metal/{baremetal_rental_id}:
get:
tags: [Bare Metal]
operationId: getBareMetalRental
summary: Get details for a baremetal rental
parameters:
- $ref: '#/components/parameters/BareMetalRentalId'
responses:
'200':
description: Bare-metal rental details.
delete:
tags: [Bare Metal]
operationId: terminateBareMetalRental
summary: Terminate a bare-metal rental
parameters:
- $ref: '#/components/parameters/BareMetalRentalId'
responses:
'204':
description: Bare-metal rental terminated.
patch:
tags: [Bare Metal]
operationId: modifyBareMetalRental
summary: Modify baremetal rental details
parameters:
- $ref: '#/components/parameters/BareMetalRentalId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PatchBareMetalRental'
responses:
'200':
description: Updated bare-metal rental details.
/bare-metal/{baremetal_rental_id}/power-status:
put:
tags: [Bare Metal]
operationId: setBareMetalPowerStatus
summary: Start or stop the nodes in a baremetal rental
parameters:
- $ref: '#/components/parameters/BareMetalRentalId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BaremetalPowerSchema'
responses:
'200':
description: Power status change accepted.
/bare-metal/{baremetal_rental_id}/reboot:
post:
tags: [Bare Metal]
operationId: rebootBareMetalNodes
summary: Reboot specific nodes in a baremetal rental
parameters:
- $ref: '#/components/parameters/BareMetalRentalId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/RebootBaremetalSchema'
responses:
'200':
description: Reboot accepted.
/bare-metal/{baremetal_rental_id}/remove-nodes:
patch:
tags: [Bare Metal]
operationId: removeBareMetalNodes
summary: Remove certain nodes in a rental
parameters:
- $ref: '#/components/parameters/BareMetalRentalId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/RemoveNodesSchema'
responses:
'200':
description: Nodes removed.
/organization/:
get:
tags: [Organization]
operationId: getOrganization
summary: Organization details
responses:
'200':
description: Organization details.
content:
application/json:
schema:
$ref: '#/components/schemas/OrganizationDetails'
patch:
tags: [Organization]
operationId: updateOrganization
summary: Update organization details
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/OrganizationUpdate'
responses:
'200':
description: Updated organization details.
content:
application/json:
schema:
$ref: '#/components/schemas/OrganizationDetails'
/organization/ssh-keys:
get:
tags: [Organization]
operationId: listSshKeys
summary: List of SSH public keys under your organization
responses:
'200':
description: Paginated list of SSH keys.
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedSshKey'
post:
tags: [Organization]
operationId: addSshKey
summary: Add new SSH public key to your organization
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateSshKeyConfig'
responses:
'201':
description: SSH key added.
content:
application/json:
schema:
$ref: '#/components/schemas/SshKeyDetails'
/organization/ssh-keys/{ssh_key_id}:
delete:
tags: [Organization]
operationId: removeSshKey
summary: Remove an SSH key from your organization
parameters:
- name: ssh_key_id
in: path
required: true
schema:
type: string
format: uuid
responses:
'204':
description: SSH key removed.
/organization/address:
get:
tags: [Organization]
operationId: getOrganizationAddress
summary: Organization address
responses:
'200':
description: Organization address.
content:
application/json:
schema:
$ref: '#/components/schemas/OrganizationAddressDetails'
put:
tags: [Organization]
operationId: setOrganizationAddress
summary: Set organization address
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/OrganizationAddressSet'
responses:
'200':
description: Organization address set.
/storage/hourly-rate:
get:
tags: [Storage]
operationId: getStorageHourlyRate
summary: Fetch hourly rate for storage
responses:
'200':
description: Storage hourly rate.
content:
application/json:
schema:
$ref: '#/components/schemas/StorageRate'
/storage/:
post:
tags: [Storage]
operationId: createStorage
summary: Create shared storage volume
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/StorageCreate'
responses:
'201':
description: Storage volume created.
content:
application/json:
schema:
$ref: '#/components/schemas/StorageDetails'
get:
tags: [Storage]
operationId: listStorage
summary: List of available storage
responses:
'200':
description: Paginated list of storage volumes.
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedStorage'
/storage/{storage_id}:
get:
tags: [Storage]
operationId: getStorage
summary: Get storage by id
parameters:
- $ref: '#/components/parameters/StorageId'
responses:
'200':
description: Storage volume details.
content:
application/json:
schema:
$ref: '#/components/schemas/StorageDetails'
patch:
tags: [Storage]
operationId: updateStorage
summary: Update storage volume
parameters:
- $ref: '#/components/parameters/StorageId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/StorageUpdate'
responses:
'200':
description: Updated storage volume details.
delete:
tags: [Storage]
operationId: terminateStorage
summary: Terminate a storage volume
parameters:
- $ref: '#/components/parameters/StorageId'
responses:
'204':
description: Storage volume terminated.
/storage/{storage_id}/nfs-squash:
patch:
tags: [Storage]
operationId: updateNfsSquash
summary: Update NFS squash for a storage volume
parameters:
- $ref: '#/components/parameters/StorageId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/NFSSquashUpdate'
responses:
'200':
description: NFS squash updated.
/locations/:
get:
tags: [Locations]
operationId: listLocations
summary: List of available locations and available HostNodes
responses:
'200':
description: Paginated list of locations.
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedLocation'
/locations/{location_id}:
get:
tags: [Locations]
operationId: getLocation
summary: Details for a given location by ID
parameters:
- $ref: '#/components/parameters/LocationId'
responses:
'200':
description: Location details.
content:
application/json:
schema:
$ref: '#/components/schemas/FullLocationDetails'
/hostnodes/{hostnode_id}:
get:
tags: [Locations]
operationId: getHostNode
summary: Details and available resources for a given HostNode
parameters:
- name: hostnode_id
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: Host node details.
content:
application/json:
schema:
$ref: '#/components/schemas/HostNodeDetails'
/instant-deploy-presets/:
get:
tags: [Locations]
operationId: listInstantDeployPresets
summary: List Instant Deploy Presets
responses:
'200':
description: Instant deploy presets.
/instant-deploy-presets/{instant_deploy_preset_id}:
get:
tags: [Locations]
operationId: getInstantDeployPreset
summary: Get Instant Deploy Preset
parameters:
- name: instant_deploy_preset_id
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: Instant deploy preset details.
/billing/hourly-rate:
get:
tags: [Billing]
operationId: getHourlyRate
summary: Current rate for active rentals
responses:
'200':
description: Combined hourly rate for active rentals.
content:
application/json:
schema:
$ref: '#/components/schemas/HourlyRateDetails'
/billing/transactions:
get:
tags: [Billing]
operationId: listTransactions
summary: Historical organization billing log
responses:
'200':
description: Paginated historical billing transactions.
/billing/reports/{year}/{month}/transactions:
get:
tags: [Billing]
operationId: getMonthlyTransactions
summary: Monthly billing log
parameters:
- name: year
in: path
required: true
schema:
type: integer
- name: month
in: path
required: true
schema:
type: integer
responses:
'200':
description: Monthly billing transactions report.
/validate/cloudinit:
post:
tags: [Validation]
operationId: validateCloudInit
summary: Validate a cloud init script
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CloudinitValidationConfig'
responses:
'200':
description: Cloud-init validation result.
content:
application/json:
schema:
$ref: '#/components/schemas/CloudInitValidationResult'
components:
securitySchemes:
apiTokenAuth:
type: http
scheme: bearer
description: >-
Bearer API token created on the Developers page of the Voltage Park
dashboard. Tokens are valid for one year before expiring.
parameters:
VirtualMachineId:
name: virtual_machine_id
in: path
required: true
schema:
type: string
format: uuid
BareMetalRentalId:
name: baremetal_rental_id
in: path
required: true
schema:
type: string
format: uuid
ClusterId:
name: cluster_id
in: path
required: true
schema:
type: string
format: uuid
LocationId:
name: location_id
in: path
required: true
schema:
type: string
format: uuid
StorageId:
name: storage_id
in: path
required: true
schema:
type: string
format: uuid
schemas:
InstantVMConfig:
type: object
required: [config_id, name]
properties:
config_id:
type: string
format: uuid
name:
type: string
example: My Instant Virtual Machine
password:
type: string
minLength: 8
nullable: true
cloudinit_script:
type: string
nullable: true
InstantVMResult:
type: object
properties:
id:
type: string
format: uuid
name:
type: string
status:
type: string
VirtualMachineDetails:
type: object
properties:
id:
type: string
format: uuid
hostnode_id:
type: string
format: uuid
type:
type: string
enum: [ondem, spot, subscription]
status:
type: string
enum: [Running, StoppedDisassociated, Stopped, Terminated, Outbid, Relocating]
name:
type: string
operating_system:
type: string
enum:
- Ubuntu 20.04 LTS
- Ubuntu 22.04 LTS
- Ubuntu 24.04 LTS
- TensorML 20 PyTorch
- TensorML 24 PyTorch
- Windows 10
public_ip:
type: string
nullable: true
pricing:
$ref: '#/components/schemas/VirtualMachinePricing'
VirtualMachinePricing:
type: object
properties:
rate_hourly:
type: string
example: '2.500000'
PatchVirtualMachine:
type: object
properties:
name:
type: string
VMPowerSchema:
type: object
required: [action]
properties:
action:
type: string
enum: [start, stop]
PortForwardConfig:
type: object
properties:
internal_port:
type: integer
external_port:
type: integer
BareMetalDeployConfig:
type: object
required: [location_id, gpu_count, name]
properties:
location_id:
type: string
format: uuid
gpu_count:
type: integer
multipleOf: 8
minimum: 8
description: Number of GPUs, in multiples of eight.
name:
type: string
example: My Baremetal Rental
DeployBareResult:
type: object
properties:
id:
type: string
format: uuid
name:
type: string
status:
type: string
PatchBareMetalRental:
type: object
properties:
name:
type: string
BaremetalPowerSchema:
type: object
required: [action]
properties:
action:
type: string
enum: [start, stop]
node_ids:
type: array
items:
type: string
format: uuid
RebootBaremetalSchema:
type: object
properties:
node_ids:
type: array
items:
type: string
format: uuid
RemoveNodesSchema:
type: object
properties:
node_ids:
type: array
items:
type: string
format: uuid
SlurmUserRequest:
type: object
required: [username]
properties:
username:
type: string
public_key:
type: string
OrganizationDetails:
type: object
required: [id, name, billing_notification_target_emails, low_balance_emails_enabled]
properties:
id:
type: string
format: uuid
name:
type: string
example: My VPOD Organization
billing_notification_target_emails:
type: array
items:
type: string
low_balance_emails_enabled:
type: boolean
OrganizationUpdate:
type: object
properties:
name:
type: string
billing_notification_target_emails:
type: array
items:
type: string
low_balance_emails_enabled:
type: boolean
OrganizationAddressDetails:
type: object
properties:
line1:
type: string
line2:
type: string
nullable: true
city:
type: string
state:
type: string
postal_code:
type: string
country:
type: string
OrganizationAddressSet:
allOf:
- $ref: '#/components/schemas/OrganizationAddressDetails'
CreateSshKeyConfig:
type: object
required: [name, content]
properties:
name:
type: string
minLength: 3
maxLength: 64
description: >-
Label for this SSH public key. Up to 64 characters; alphanumeric,
hyphens, or spaces only.
example: My-SSH-Public-Key
content:
type: string
description: The SSH public key contents.
example: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDAKOgHv82A6Oi7AWLvBC9N...
SshKeyDetails:
type: object
required: [id, name, content]
properties:
id:
type: string
format: uuid
name:
type: string
example: My-SSH-Public-Key
content:
type: string
StorageCreate:
type: object
required: [size_in_gb, name]
properties:
size_in_gb:
type: integer
minimum: 1
description: Number of gigabytes to allocate for the storage volume.
example: 100
name:
type: string
minLength: 1
maxLength: 60
pattern: '^[a-z0-9]([a-z0-9._-]*[a-z0-9])?$'
description: >-
Lowercase alphanumerics, '-', '_', or '.'; must start and end with
an alphanumeric. At most 60 characters. Duplicate names not allowed.
order_ids:
type: array
description: Active bare-metal rental IDs to attach this volume to on creation.
items:
type: string
format: uuid
StorageDetails:
type: object
properties:
id:
type: string
format: uuid
name:
type: string
size_in_gb:
type: integer
status:
type: string
StorageUpdate:
type: object
properties:
name:
type: string
size_in_gb:
type: integer
StorageRate:
type: object
properties:
rate_hourly:
type: string
NFSSquashUpdate:
type: object
required: [mode]
properties:
mode:
type: string
enum: [none, root, all]
HourlyRateDetails:
type: object
required: [rate_hourly]
properties:
rate_hourly:
type: string
example: '2.500000'
InstantDeployLocation:
type: object
properties:
id:
type: string
format: uuid
name:
type: string
FullLocationDetails:
type: object
properties:
id:
type: string
format: uuid
name:
type: string
HostNodeDetails:
type: object
properties:
id:
type: string
format: uuid
name:
type: string
BareMetalLocation:
type: object
properties:
id:
type: string
format: uuid
name:
type: string
CloudinitValidationConfig:
type: object
required: [script]
properties:
script:
type: string
CloudInitValidationResult:
type: object
properties:
valid:
type: boolean
errors:
type: array
items:
type: string
Pagination:
type: object
properties:
total:
type: integer
page:
type: integer
per_page:
type: integer
PaginatedVirtualMachine:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/VirtualMachineDetails'
pagination:
$ref: '#/components/schemas/Pagination'
PaginatedInstantDeployLocation:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/InstantDeployLocation'
pagination:
$ref: '#/components/schemas/Pagination'
PaginatedBareMetalLocation:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/BareMetalLocation'
pagination:
$ref: '#/components/schemas/Pagination'
PaginatedSshKey:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/SshKeyDetails'
pagination:
$ref: '#/components/schemas/Pagination'
PaginatedStorage:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/StorageDetails'
pagination:
$ref: '#/components/schemas/Pagination'
PaginatedLocation:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/FullLocationDetails'
pagination:
$ref: '#/components/schemas/Pagination'