TypeScript SDK
Reference for fastvm. Auto-generated from the OpenAPI spec.
Install
npm install fastvmImport
import { FastvmClient } from 'fastvm'; const client = new FastvmClient(); // reads FASTVM_API_KEY / FASTVM_BASE_URL
Top-level helpers
client.*
client.uploadhelper
Description
Copy a local file or directory into the VM. Uses vms.files.presign
and vms.files.fetch under the hood. Directories are tarred on the
fly before upload and extracted VM-side after fetch.
Streams end-to-end with no intermediate copy to /tmp on the client,
so multi-GB transfers are bounded by VM disk, not RAM. Directory
mode needs the tar binary on the client's PATH (standard on
macOS and Linux; available on modern Windows via bsdtar).
Parameters
vmIdstringrequiredlocalPathstringrequiredremotePathstringrequiredopts.fetchTimeoutSecnumber600opts.execTimeoutSecnumber600Returns
Promise<void>Example
await client.upload(vm.id, './config.toml', '/etc/app.toml'); await client.upload(vm.id, './src', '/root/src');
client.downloadhelper
Description
Copy a file or directory from the VM to the client. Uses
vms.files.presign plus a VM-side exec to classify the path and
stream its contents out. Directories are tarred VM-side and
un-tarred on the client, rooted at ./ so upload and download are
symmetric.
Streams end-to-end with no intermediate copy. Missing paths raise
FileNotFoundError (Python) or FileTransferError with
code: 'ENOENT' (TypeScript).
Parameters
vmIdstringrequiredremotePathstringrequiredlocalPathstringrequiredopts.fetchTimeoutSecnumber600opts.execTimeoutSecnumber600Returns
Promise<void>Example
await client.download(vm.id, '/root/out.log', './out.log'); await client.download(vm.id, '/var/log', './log-backup');
client.waitForVmReadyhelper
Description
Poll GET /v1/vms/{id} until the VM reaches status == "running" or
a terminal failure status. Same polling logic as vms.launch; use
this when you already have a VM id from vms.list() or another flow.
Parameters
vmIdstringrequiredopts.pollIntervalMsnumber2000opts.timeoutMsnumber300000Returns
Promise<>Example
let vm = await client.vms.retrieve(someId); vm = await client.waitForVmReady(vm.id, { timeoutMs: });
VMs
client.vms.*
client.vms.list
GET/v1/vmsDescription
List VMs
Parameters
statusVMStatusVMStatus; unknown values return an empty list.Returns
[]client.vms.launchoverride
POST/v1/vmsDescription
Launch a VM and (by default) block until it reaches status == "running".
POST /v1/vms returns 201 for immediately-running VMs and 202 for queued
VMs; the override handles both paths transparently by polling
GET /v1/vms/{id}.
Pass wait=false (TS) / wait=False (Python) to skip polling and
return the raw 201/202 body. Pass snapshot_id / snapshotId to
restore from a snapshot instead of cold-booting.
Terminal failure statuses (error, stopped, deleting) raise
VMLaunchError. Polling-deadline exceeded raises VMNotReadyError.
Parameters
paramsVmLaunchParamsrequiredoptionsRequestOptions | undefinedundefinedlaunchOpts.waitbooleantruelaunchOpts.pollIntervalMsnumber2000launchOpts.timeoutMsnumber300000Returns
APIPromise<>Example
import { FastvmClient } from 'fastvm'; const client = new FastvmClient(); const vm = await client.vms.launch({ machineType: 'c1m2', name: 'dev' }); console.log(vm.id, vm.status); // "running" // Restore from snapshot const fromSnap = await client.vms.launch({ snapshotId: 'snp_...' }); // Skip polling — returns the raw 201/202 body const queued = await client.vms.launch( { machineType: 'c1m2' }, undefined, { wait: false }, );
client.vms.retrieve
GET/v1/vms/{id}Description
Get a VM
Parameters
idstringrequiredReturns
client.vms.update
PATCH/v1/vms/{id}Description
Update a VM
Parameters
Returns
client.vms.delete
DELETE/v1/vms/{id}Description
Delete a VM
Parameters
idstringrequiredReturns
client.vms.pause
POST/v1/vms/{id}/pauseDescription
Pause a VM
Parameters
idstringrequiredReturns
client.vms.resume
POST/v1/vms/{id}/resumeDescription
Resume a paused VM
Parameters
idstringrequiredReturns
client.vms.refreshTtl
POST/v1/vms/{id}/ttl/refreshDescription
Reset the VM's TTL cycle
Parameters
idstringrequiredReturns
client.vms.setFirewall
PUT/v1/vms/{id}/firewallDescription
Replace firewall policy
Parameters
Returns
client.vms.patchFirewall
PATCH/v1/vms/{id}/firewallDescription
Patch firewall policy
Parameters
Returns
client.vms.consoleToken
POST/v1/vms/{id}/console-tokenDescription
Mint a console token
Parameters
idstringrequiredReturns
client.vms.runrefresh
POST/v1/vms/{id}/execDescription
Execute a command inside a VM. Same generated method as upstream. TypeScript doesn't silently iterate strings into characters, so no shell-string auto-wrap helper is needed. Pass an argv array directly.
Parameters
idstringrequiredparamsVmRunParamsrequiredoptionsRequestOptions | undefinedundefinedReturns
APIPromise<>Example
const result = await client.vms.run(vm.id, { command: ['python3', 'main.py', '--flag'], }); console.log(result.exitCode, result.stdout);
client.vms.streamhelper
Description
Stream exec output as typed events via Accept: application/x-ndjson.
Same endpoint as vms.run (POST /v1/vms/{id}/exec), but the server
emits a newline-delimited stream of ExecEvent objects instead of a
single buffered JSON response. Events are:
"o"— stdout chunk (decoded bytes indata)"e"— stderr chunk (decoded bytes indata)"x"— terminal exit event (exit_code,timed_out,duration_ms)
There is no 4 MiB per-stream cap on output. The HTTP connection stays
open until the command exits or timeout_sec fires server-side. Use
this for long-running processes (builds, test runners, live logs) where
you need incremental output without buffering the entire result.
Shell strings (Python only) are auto-wrapped into ["sh", "-c", ...]
exactly like vms.run.
Parameters
idstringrequiredbodyVmRunParamsrequiredopts.timeoutMsnumberundefined (no client-side timeout)Returns
AsyncIterable<>Example
import { FastvmClient, type ExecEvent } from 'fastvm'; const client = new FastvmClient(); for await (const event of client.vms.stream(vm.id, { command: ['make', '-j8'] })) { if (event.type === 'o') process.stdout.write(event.data); else if (event.type === 'e') process.stderr.write(event.data); else if (event.type === 'x') console.log(`exit ${event.exitCode} in ${event.durationMs}ms`); }
VMs.Services
client.vms.services.*
client.vms.services.list
GET/v1/vms/{id}/servicesDescription
List service registrations
Parameters
idstringrequiredReturns
[]client.vms.services.register
POST/v1/vms/{id}/servicesDescription
Register a service on a VM
Parameters
idstringrequirednamestringrequiredportnumberrequiredh2cbooleanfalseReturns
client.vms.services.update
PUT/v1/vms/{id}/services/{serviceName}Description
Register or update a service on a VM
Parameters
idstringrequiredserviceNamestringrequiredportnumberrequiredh2cbooleanfalseReturns
client.vms.services.delete
DELETE/v1/vms/{id}/services/{serviceName}Description
Deregister a service from a VM
Parameters
idstringrequiredserviceNamestringrequiredVMs.Files
client.vms.files.*
client.vms.files.presign
POST/v1/vms/{id}/files/presignDescription
Mint signed URLs for uploading a file to a VM
Parameters
idstringrequiredpathstringfetchFileToVm). Used only to scope the staging object key; any value server-side is accepted here.requiredReturns
Example
// High-level helpers — handle presign + PUT/GET + fetch + (for dirs) tar // for both file and directory transfers automatically. await client.upload(vm.id, './local/file.txt', '/root/file.txt'); await client.upload(vm.id, './local-dir', '/root/remote-dir'); await client.download(vm.id, '/root/out.log', './out.log'); await client.download(vm.id, '/var/log', './log-backup'); // Raw call if you need manual control over the signed-URL flow: const presign = await client.vms.files.presign(vm.id, { path: '/root/file.txt' });
client.vms.files.fetch
POST/v1/vms/{id}/files/fetchDescription
Fetch a file into a VM from a presigned URL
Parameters
idstringrequiredurlstringdownloadUrl previously returned by POST /v1/vms/{id}/files/presign (URLs from other sources are rejected).requiredpathstringrequiredtimeoutSecnumberReturns
Example
// You usually don't call this directly — client.upload() composes // presign + PUT + fetch in a single call. Use it when piping an // already-hosted URL (still from /files/presign) into the VM. await client.vms.files.fetch(vm.id, { url: presign.downloadUrl, path: '/root/file.txt', });
VMs.Volumes
client.vms.volumes.*
client.vms.volumes.attach
POST/v1/vms/{id}/volumesDescription
Attach a volume to a VM
Parameters
idstringrequiredvolumeIdstringrequiredmountPathstringrequiredreadOnlybooleanfalseReturns
client.vms.volumes.detach
DELETE/v1/vms/{id}/volumes/{volumeId}Description
Detach a volume from a VM
Parameters
idstringrequiredvolumeIdstringrequiredReturns
VMs.Bucket_mounts
client.vms.bucket_mounts.*
client.vms.bucket_mounts.list
GET/v1/vms/{id}/bucket-mountsDescription
List bucket-mounts on a VM
Parameters
idstringrequiredReturns
[]client.vms.bucket_mounts.attach
POST/v1/vms/{id}/bucket-mountsDescription
Attach a customer GCS / S3 bucket to a VM
Parameters
idstringrequiredbucketUristringgs://<bucket>[/prefix] or s3://<bucket>[/prefix].requiredmountPathstringrequiredreadOnlybooleanfalsecredentialsBucketMountCredentialsrequiredReturns
client.vms.bucket_mounts.retrieve
GET/v1/vms/{id}/bucket-mounts/{bucketMountId}Description
Get a bucket-mount
Parameters
idstringrequiredbucketMountIdstringbm_<22-char-lowercase-hex>), unique per VM.requiredReturns
client.vms.bucket_mounts.rotate
PATCH/v1/vms/{id}/bucket-mounts/{bucketMountId}Description
Rotate bucket-mount credentials in-place
Parameters
idstringrequiredbucketMountIdstringbm_<22-char-lowercase-hex>), unique per VM.requiredcredentialsBucketMountCredentialsrequiredReturns
client.vms.bucket_mounts.delete
DELETE/v1/vms/{id}/bucket-mounts/{bucketMountId}Description
Detach and delete a bucket-mount
Parameters
idstringrequiredbucketMountIdstringbm_<22-char-lowercase-hex>), unique per VM.requiredMe.Ssh_keys
client.me.ssh_keys.*
client.me.ssh_keys.list
GET/v1/me/ssh-keysDescription
List the calling user's authorized SSH keys
Returns
client.me.ssh_keys.add
POST/v1/me/ssh-keysDescription
Register an SSH public key for the calling user
Parameters
namestringpublicKeystringssh-ed25519 AAA...). Comments are stripped. Newlines are rejected.requiredReturns
Example
import { readFileSync } from "node:fs"; await client.me.sshKeys.add({ publicKey: readFileSync(`${process.env.HOME}/.ssh/id_ed25519.pub`, "utf8"), name: "laptop", }); // then: ssh <vm.id>@ssh.<domain>
client.me.ssh_keys.delete
DELETE/v1/me/ssh-keys/{fingerprint}Description
Remove an authorized SSH key
Parameters
fingerprintstringSHA256:abc...). The base64 hash includes + and / and the prefix has :, so callers MUST URL-encode the value into the path segment. SDKs do this automatically.requiredReturns
Snapshots
client.snapshots.*
client.snapshots.list
GET/v1/snapshotsDescription
List snapshots
Returns
[]client.snapshots.create
POST/v1/snapshotsDescription
Create a snapshot from a VM
Parameters
vmIdstringrequirednamestringsnapshot-<8-char-vmId-prefix> if empty.Returns
client.snapshots.retrieve
GET/v1/snapshots/{id}Description
Get a snapshot
Parameters
idstringrequiredReturns
client.snapshots.update
PATCH/v1/snapshots/{id}Description
Rename a snapshot
Parameters
idstringrequirednamestringReturns
client.snapshots.delete
DELETE/v1/snapshots/{id}Description
Delete a snapshot
Parameters
idstringrequiredReturns
Snapshot_imports
client.snapshot_imports.*
client.snapshot_imports.list
GET/v1/snapshot-importsDescription
List the calling org's snapshot imports
Returns
[]client.snapshot_imports.create
POST/v1/snapshot-importsDescription
Build a snapshot from a Docker / OCI image or a Dockerfile
Parameters
machineTypeMachineTypediskGiBnumbernamestringsourceSnapshotImportSourceSpecrequiredReturns
Example
// Raw call (returns 202 immediately; poll for completion). const imp = await client.snapshotImports.create({ machineType: 'c2m4', source: { type: 'image', image: 'python:3.13-slim' }, });
client.snapshot_imports.presignContext
POST/v1/snapshot-imports/context-presignDescription
Mint a signed URL for uploading a Dockerfile build-context archive
Parameters
sizeBytesnumber400 when it exceeds the platform-wide cap (the same cap is also enforced by the signed URL itself).Returns
client.snapshot_imports.retrieve
GET/v1/snapshot-imports/{id}Description
Get a snapshot import's state
Parameters
idstringrequiredReturns
client.snapshot_imports.delete
DELETE/v1/snapshot-imports/{id}Description
Delete a terminal snapshot import (cascades to its snapshot)
Parameters
idstringrequiredReturns
client.snapshot_imports.cancel
POST/v1/snapshot-imports/{id}/cancelDescription
Cancel an in-flight snapshot import
Parameters
idstringrequiredReturns
Quotas
client.quotas.*
client.quotas.retrieve
GET/v1/org/quotasDescription
Get org quotas and usage
Returns
Volumes
client.volumes.*
client.volumes.list
GET/v1/volumesDescription
List volumes
Returns
[]client.volumes.create
POST/v1/volumesDescription
Create a managed volume
Parameters
namestringrequiredsizeGiBnumberrequiredaccessMode"rw" | "ro"requiredReturns
client.volumes.retrieve
GET/v1/volumes/{id}Description
Get a volume
Parameters
idstringvol_<22-char-lowercase-hex>).requiredReturns
client.volumes.update
PATCH/v1/volumes/{id}Description
Update a volume's name, sizeGiB (grow / shrink-if-not-overfull), or accessMode
Parameters
idstringvol_<22-char-lowercase-hex>).requirednamestringsizeGiBnumberaccessMode"rw" | "ro"Returns
client.volumes.delete
DELETE/v1/volumes/{id}Description
Delete a volume
Parameters
idstringvol_<22-char-lowercase-hex>).requiredReturns
client.volumes.listAttachments
GET/v1/volumes/{id}/attachmentsDescription
List VMs currently attached to this volume
Parameters
idstringvol_<22-char-lowercase-hex>).requiredReturns
VolumeAttachmentItemWithVm[]Pricing
client.pricing.*
client.pricing.retrieve
GET/v1/pricingDescription
Get public list pricing
Returns
Types
Shared schemas referenced in parameters and return values.
PricingResponse
objectcomputeComputePricingvolumeStorageVolumeStoragePricingComputePricing
objecttiersPricingTier[]PricingTier
objecttiernumberfromVcpuHoursnumbertoVcpuHoursunknownratePerVcpuHourstringVolumeStoragePricing
objectratePerGiBMonthstringDeleteResponse
objectidstringdeletedbooleanVMStatus
primitiveprovisioning, running, stopped, pausing, paused, resuming, deleting, error. Terminal failure statuses are error and stopped; transitional values (provisioning, pausing, resuming, deleting) indicate the VM is in flight. Additional values may be introduced in future server versions; clients should treat unknown values as "in transition" rather than as hard errors.SnapshotStatus
primitivecreating, ready, error. Additional values may be introduced in future server versions.MachineType
primitivec1m2, c2m4). Controls CPU and memory allocation. Must be supplied on launch unless restoring from a snapshot.VM
objectidstringnamestringorgIdstringmachineNamestringsourceNamestringfirewallFirewallPolicyeffectiveFirewallunknownfirewall (the user policy) unioned with per-service auto-rules from this VM's registered services. Each auto-rule has source CIDR ::/0 and a description of the form auto: proxy service <name>. The same policy is what the worker firewall actually enforces. Set firewall to mutate; this field is computed per-response from firewall and the current service registry, never persisted.metadataMetadataenvVarsEnvVarspublicIpv6stringcpunumbermemoryMiBnumberdiskGiBnumberstatusVMStatuscreatedAtstringdeletedAtunknownttlunknownTTL for semantics.expiresAtMsnumberrunning (the countdown freezes on pause).ttlRemainingMsnumberexpiresAtMs on resume.pausedAtunknownvolumesVolumeAttachmentItem[]bucketMountsBucketMount[]Snapshot
objectidstringnamestringorgIdstringvmIdstringmachineNamestringc1m2). VMs launched from this snapshot inherit it. Omitted for older snapshots captured before this was recorded.firewallFirewallPolicymetadataMetadataenvVarsEnvVarsservicesSnapshotService[]volumesSnapshotVolumeAttachment[]bucketMountsSnapshotBucketMountAttachment[]statusSnapshotStatuscreatedAtstringPolicyAction
enumallowdenyIngressRuleKind
enumcidr is supported — inbound packets don't carry a domain the worker could match on without TLS interception.cidrEgressRuleKind
enumcidr: match by destination IP/CIDR + port/proto. - fqdn: match by destination domain (resolved through the in-process DNS resolver) + port/proto. Resolved IPs land in a per-rule dynamic nft set; the chain emits one rule per fqdn rule keyed on (set, proto, port). Port/proto enforcement on fqdn rules is honest — the prior kind: domain shape with a shared allow-set silently ignored them. Fqdn values accept an optional leading *. wildcard (e.g. *.example.com). Bare wildcards and non-leading wildcards are rejected. Wildcards match one-or-more labels left of the suffix and do not match the apex (matches DNS wildcard semantics).cidrfqdnDNSMode
enumdns.domains. - allow: allowlist — only listed domains can resolve; any other query returns NXDOMAIN. - deny: blocklist — listed domains return NXDOMAIN; all other queries resolve through the upstream resolver. Default is deny with an empty list, which means "resolve everything" — the safe default that preserves existing behavior when callers omit the dns block.allowdenyIngressRule
objectactionPolicyActionkindIngressRuleKindvaluestring::/0, 10.0.0.0/8). IPv4 and IPv6 CIDRs are both accepted in the schema; L3 enforcement coverage per family is a worker-side concern.protocol"tcp" | "udp" | "any"portsstring443), inclusive range (8080-8090), or any. When protocol is any, ports MUST be any.descriptionstringIngressPolicy
objectdefaultPolicyActionrulesIngressRule[]EgressRule
objectactionPolicyActionkindEgressRuleKindvaluestringkind: cidr, an IPv4 or IPv6 CIDR. For kind: fqdn, a domain name with optional leading *. wildcard. Must be reachable through the dns gate — a fqdn value blocked by dns.mode/dns.domains is rejected at PUT time as a dead rule.protocol"tcp" | "udp" | "any"portsstring443), inclusive range (8080-8090), or any. When protocol is any, ports MUST be any.descriptionstringEgressPolicy
objectdefaultPolicyActionrulesEgressRule[]DNSPolicy
objectmode to deny when missing, domains to [], and blockBypass to false (see normalizeDNSPolicy in scheduler/internal/httpapi/firewall.go).modeDNSModedomainsstring[]blockBypassbooleanfalse — turning this on breaks workloads that legitimately reach 1.1.1.1 / 8.8.8.8 / etc. on TCP/443 for non-DoH reasons (e.g. services whose data plane lives on a Cloudflare anycast IP). Operators who enable DNS allowlist mode typically also flip this on explicitly.FirewallPolicy
objectfirewall: null on VM create is also valid.SnapshotService
objectPOST /v1/vms (snapshot-restore branch) so the new VM gets the same service registrations the source VM had at snapshot time.namestringportnumberh2cbooleanSnapshotImportSourceSpec
objecttype selects which other fields are consumed. The opposite-variant fields must be omitted; mixing them is a 400 at the API boundary.type"image" | "dockerfile"image: pull an existing Docker / OCI image reference. -dockerfile: build a user-supplied Dockerfile against an uploaded build context.
imagestringghcr.io/foo/bar:v1, nginx:1.27, alpine@sha256:…). Required when type=image.platformstring<os>/<arch> (e.g. linux/amd64). Defaults to linux/amd64. Image-variant only.registryUsernamestringtype=image authenticates the OCI pull, type=dockerfile authenticates the FROM pulls performed by buildah inside the sandbox VM.registryPasswordstringregistryHoststringregistryUsername / registryPassword authenticate against (e.g. docker.io, ghcr.io, 1234.dkr.ecr.us-east-1.amazonaws.com). Required when credentials are set on type=dockerfile: the baker keys the auth.json entry against this host. Tolerated but ignored for type=image (the host is derived from the image reference). Optional port: e.g. registry.example.com:5000.contextRefstringPOST /v1/snapshot-imports/context-presign. Required when type=dockerfile. The platform validates that the referenced upload belongs to the calling org and consumes the token on use.dockerfilePathstringDockerfile. Must not be absolute and must not contain ...buildArgsobject--build-arg KEY=VALUE pairs forwarded to the build. Capped at 64 entries, 8 KiB total.targetstring--target selector. Empty means the final stage.SnapshotImportEvent
objectrunning (preparing → network → pull → export → saving → warming).phasestringpreparing, network, pull (image source), fetch_context, build (dockerfile source), export, saving, warming, done.statusstringstarted, completed, failed, skipped, cancelled.timestampMsnumbermessagestringSnapshotImportSourceView
objectGET /v1/snapshot-imports/{id}. Strips secrets (registryPassword, raw context object keys) — only fields safe to echo back to the caller appear here.type"image" | "dockerfile"imagestringplatformstringregistryUsernamestringregistryHoststringdockerfilePathstringbuildArgsobjecttargetstringcontextSizeBytesnumberSnapshotImportResponse
objectPOST /v1/snapshot-imports (initial pending state), GET /v1/snapshot-imports/{id}, GET /v1/snapshot-imports (in the array elements), and POST /v1/snapshot-imports/{id}/cancel.idstringnamestringsourceSnapshotImportSourceViewstatusstringpending (queued, no worker yet), claimed (worker assigned, dispatch in flight), running (worker executing the pipeline), succeeded / failed / cancelled (terminal).snapshotIdstringstatus is succeeded. Fetch the corresponding Snapshot record via GET /v1/snapshots/{id}.errorstringstatus is failed. User-safe diagnostic.eventsSnapshotImportEvent[]machineNamestringcpunumbermemoryMiBnumberdiskGiBnumbercreatedAtstringstartedAtstringupdatedAtstringfinishedAtstringContextPresignResponse
objectcontextRefstringsource.contextRef on the subsequent POST /v1/snapshot-imports. Single-use; the create call consumes the entry.uploadUrlstringContent-Type: application/zip.expiresInSecnumberuploadUrl, in seconds.maxUploadBytesnumberMetadata
objectEnvVars
object[A-Za-z_][A-Za-z0-9_]*); values may not contain newline, carriage return, or null bytes. Total JSON encoding ≤65536 bytes.ExecEvent
objectPOST /v1/vms/{id}/exec under Accept: application/x-ndjson. Short field names (t, d, c, to, ms) keep per-chunk overhead small since high-output commands can produce thousands of events per exec.t"o" | "e" | "x"o = stdout chunk, e = stderr chunk, x = terminal exit event.dstringo/e: base64-encoded raw bytes of the chunk. For x: optional diagnostic string (e.g. spawn failure) when non-empty.cnumberx events only.tobooleanx events only.msnumberx events only.ExecVMResponse
objectPOST /v1/vms/{id}/exec under Accept: application/json. The server collects the streamed events and returns this aggregate once the command exits. Per-stream output is capped at 4 MiB; overflow bytes are dropped and signalled via stdoutTruncated / stderrTruncated. Streaming clients (Accept: application/x-ndjson) receive every byte without a cap.exitCodenumberstdoutstringstderrstringtimedOutbooleanstdoutTruncatedbooleanstderrTruncatedbooleandurationMsnumberFilePresignResponse
objectuploadUrl, and either side GETs them back via downloadUrl. URLs expire after expiresInSec seconds and the staging object is auto-deleted after about a day.uploadUrlstringContent-Type: application/octet-stream. Used by the client on upload, or by the VM (via an exec'd curl -T -) on download.downloadUrlstringPOST /v1/vms/{id}/files/fetch) on upload, or by the client (via httpx.stream / curl) on download.expiresInSecnumbermaxUploadBytesnumberConsoleTokenResponse
objecttokenstringexpiresInSecnumberwebsocketPathstringwss://<host><websocketPath>?session=<token>.SshKey
objectnamestringpublicKeystring<type> <base64-blob> — the optional comment is stripped server-side. Supported types: ssh-ed25519, ssh-rsa, ecdsa-sha2-nistp{256,384,521}, plus FIDO2 hardware-backed variants (sk-...@openssh.com).fingerprintstringSHA256:abc.... This is the identifier — matches what ssh-keygen -lf prints and what your ssh client shows on first connect; pass it back as the {fingerprint} path segment to deleteSshKey.createdAtstringSshKeyListResponse
objectkeysSshKey[]OrgQuotaValues
objectvcpunumbermemoryMiBnumberdiskGiBnumbersnapshotCountnumbervolumeCountnumbervolumeGiBnumberOrgQuotaUsage
objectService
objectnamestring<name>--<vmIdHexNoHyphens>.proxy.<stack-domain>.portnumberh2cbooleanVolume
objectidstringnamestringorgIdstringaccessModestringrw, ro. Future server versions may introduce additional values.sizeGiBnumberstatusstringcreating — the substrate-create saga is in flight. Set by the server briefly between the customer's POST /v1/volumes and the worker substrate provisioning; attach attempts are rejected with VOL_NOT_READY until the saga commits. Clients polling immediately after create may observe this state. - ready — substrate is up; attachable. - deleting — cleanup is in progress; not attachable. Future server versions may introduce additional values.pendingSizeGiBnumbersizeGiB is still the pre-resize value and pendingSizeGiB is the target. Set briefly between PATCH /v1/volumes/{id} and the substrate resize commit. Clients polling immediately after a resize may observe a non-zero value.mountedCountnumberusedGiBnumbercreatedAtstringVolumeAttachmentItem
objectvolumeIdstringmountPathstringreadOnlybooleanmountStatusstringmounted, failed, pending. pending appears on attachments to paused VMs (mount happens on resume) and briefly during in-flight hot-attach.statusMessagestringDetachVolumeResponse
objectdetachedbooleanwarningsDetachWarning[]DetachWarning
objecttypestringack_timeout, guest_unresponsive.messagestringBucketMount
objectidstringvmIdstringbucketUristringgs://... or s3://...; future schemes may be added.mountPathstringreadOnlybooleanmountStatusstringmounted, failed, pending.statusMessagestringcreatedAtstringSnapshotVolumeAttachment
objectvolumeIdstringmountPathstringreadOnlybooleanSnapshotBucketMountAttachment
objectbucketUristringmountPathstringreadOnlybooleanHealthResponse
objectstatusstring