Voltage Park Billing API
Retrieve the current combined hourly rate for active rentals and pull historical and monthly organization billing transaction logs.
Retrieve the current combined hourly rate for active rentals and pull historical and monthly organization billing transaction logs.
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'