Skip to content
OpenRelay is in early access, and the /v1 API is stable. New capabilities ship in the changelog.
API ReferenceComputeVMs

Get a VM's burn rate, session cost and runway

Returns a VM's bundled hourly rate, the cost its open session has accrued, and the org's available balance, total burn rate and projected runway. Every VM bills at one bundled hourly rate (per-GPU catalog price times GPU count for GPU VMs, a flat size rate for CPU VMs); disk is included, never billed separately. The rate is locked when the usage session opens, so this endpoint reads it from the open usage record when one exists (rateSource=locked) and only falls back to the current catalog when nothing is accruing (rateSource=catalog).

Required permission

Requires the compute.read permission. See Permissions for the roles and API key permissions that include it.

Command line

The orl CLI wraps this endpoint:

orl vms burn get <id>
GET
/v1/vms/{id}/burn

Authorization

apiKey
headerAuthorizationBearer <token>

OpenRelay API key. Send it as Authorization: Bearer or_… (legacy vl_… keys still work).

Path Parameters

id*string

Response Body

The VM's burn breakdown

application/json
  1. response
vmId*string
pricePerHourCents*integer

the VM's bundled hourly rate: the open usage record's locked rate when a session is accruing, else the current catalog rate for the VM's shape

nonBillable?boolean

This VM's usage is recorded but never charged (a provider consuming its own reserved node), so pricePerHourCents is informational and every cents figure below is 0 for it. Without this a client cannot tell "not charged" from "nothing running".

rateSource*string

locked = read from the open usage record (exactly what settlement will charge); catalog = no open session, the rate that would apply on next start

Value in"locked""catalog"
rateBasis*string

gpu = per-GPU catalog price times gpuCount; cpu = flat per-resource-size rate

Value in"gpu""cpu"
gpuCount?integer

set when rateBasis is gpu

perGpuCents?integer

pricePerHourCents / gpuCount; set when rateBasis is gpu

diskBilled*boolean

always false today: disk is included in the bundled hourly rate and never billed as a separate line item

accruedSessionCents?integer

cost accrued by the open session so far (session span times the locked rate, the same span math settlement uses); omitted when no session is open

sessionStartedAt?string

start of the open usage session; omitted when none

orgAccruedCents*integer

the org's un-settled usage across all workloads: the current month, plus any prior month not yet settled

orgAccruedMonthCents*integerDeprecated

deprecated alias of orgAccruedCents (same value; the name predates un-settled prior months being included); will be removed in a future spec version

orgAvailableCents*integer

spendable balance = ledger balance minus orgAccruedCents (can be negative)

orgBurnPerHourCents*integer

sum of the locked rates of every open usage record in the org

projectedRunwayHours*number

(orgAvailableCents - autoStopFloorCents) / orgBurnPerHourCents; null when orgBurnPerHourCents is 0, clamped to 0 when available is already at or below the floor

Formatdouble
autoStopFloorCents*integer

available-balance floor (cents) below which the org is auto-stopped

Example Request
curl -X GET 'https://api.openrelay.inc/v1/vms/string/burn'
Example Response
{  "vmId": "4f6b9a1e-9f1c-4c58-a6a3-1f2f0f6f7a10",  "pricePerHourCents": 411,  "rateSource": "locked",  "rateBasis": "gpu",  "gpuCount": 3,  "perGpuCents": 137,  "diskBilled": false,  "accruedSessionCents": 1028,  "sessionStartedAt": "2026-07-18T09:12:00Z",  "orgAccruedCents": 2120,  "orgAccruedMonthCents": 2120,  "orgAvailableCents": 10430,  "orgBurnPerHourCents": 414,  "projectedRunwayHours": 25.07,  "autoStopFloorCents": 50}

Get a VM with its GPUs, node, template and price GET

Returns a VM's full record: its shape and disk, SSH connection details and readiness, GPU model and VRAM, node, OS template, and its hourly rate.

Pod GPU metrics GET

Returns utilization, memory, power and temperature time series for each of a pod's GPUs over the selected range, sampled on the host that runs the pod. The telemetry is host-side (nvidia-smi on NVIDIA hosts, amd-smi on AMD), sampled on the node that runs the pod and returned as one continuous time grid. Every series and every GPU in a response shares that grid: the value at index i of any values array was measured at start plus i times stepSeconds, and a null means the node reported no sample at that point. The window ends now and covers only the periods this pod actually held the GPUs it is reported against, so a card that ran another customer's pod earlier never contributes a sample here. A GPU attached to a VM is passed through to the guest, so the host cannot read it. That case answers 200 with an accelerator status of unavailable and an empty gpus list rather than an error, and so do a pod that has not started yet, a pod that was not running in the selected range, and a metrics store that cannot be reached: the accelerator object is the answer, and the client renders its detail sentence. A host that stopped reporting while the pod is still running answers degraded with the history up to the last sample still attached. This operation is exposed as an agent tool by default, in the same class as a pod's burn rate: "how busy were my GPUs" is a read-only question about a resource the caller already owns.