Python SDK

Reference for fastvm. Auto-generated from the OpenAPI spec.

Install

shell
pip install fastvm

Import

python
from fastvm import FastvmClient

client = FastvmClient()  # reads FASTVM_API_KEY / FASTVM_BASE_URL

Top-level helpers

client.*

client.health

GET/healthz
client.health() -> HealthResponse

Description

Health check

Returns

client.uploadhelper

client.upload(
    vm_id: str,
    local_path: str,
    remote_path: str,
    *,
    fetch_timeout_sec: int = 600,
    exec_timeout_sec: int = 600,
) -> None

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

ParamTypeDefaultDescription
vm_idstrrequiredTarget VM id.
local_pathstrrequiredLocal file or directory path.
remote_pathstrrequiredDestination path inside the VM.
fetch_timeout_secint600Timeout on the VM-side /files/fetch call.
exec_timeout_secint600Timeout on VM-side tar extraction (dir mode only).

Returns

None

Example

python
client.upload(vm.id, "./config.toml", "/etc/app.toml")   # file
client.upload(vm.id, "./src", "/root/src")               # directory (tar-streamed)

client.downloadhelper

client.download(
    vm_id: str,
    remote_path: str,
    local_path: str,
    *,
    exec_timeout_sec: int = 600,
) -> None

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

ParamTypeDefaultDescription
vm_idstrrequiredTarget VM id.
remote_pathstrrequiredSource path inside the VM.
local_pathstrrequiredDestination path on the client.
exec_timeout_secint600Timeout on VM-side exec (classify + stream).

Returns

None

Example

python
client.download(vm.id, "/root/out.log", "./out.log")   # file
client.download(vm.id, "/var/log", "./log-backup")     # directory

client.wait_for_vm_readyhelper

client.wait_for_vm_ready(
    vm_id: str,
    *,
    poll_interval: float = 2.0,
    timeout: float = 300.0,
) -> VM

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

ParamTypeDefaultDescription
vm_idstrrequiredTarget VM id.
poll_intervalfloat2.0Seconds between polls.
timeoutfloat300.0Total wait deadline in seconds.

Returns

Example

python
vm = client.vms.retrieve(some_id)
vm = client.wait_for_vm_ready(vm.id, timeout=120)

VMs

client.vms.*

client.vms.list

GET/v1/vms
client.vms.list() -> VM[]

Description

List VMs

Returns

[]

client.vms.launchoverride

POST/v1/vms
client.vms.launch(
    *,
    machine_type: MachineType | None = None,
    snapshot_id: str | None = None,
    name: str | None = None,
    metadata: dict[str, str] | None = None,
    firewall: FirewallPolicy | None = None,
    wait: bool = True,
    poll_interval: float = 2.0,
    wait_timeout: float = 300.0,
    timeout: float | httpx.Timeout | None = None,
    max_retries: int = 0,
) -> VM

Description

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

ParamTypeDefaultDescription
machine_typeMachineType | NoneNoneVM flavor (c1m2, c2m4, ...). Required unless snapshot_id is set.
snapshot_idstr | NoneNoneRestore from snapshot instead of cold-booting.
namestr | NoneNoneHuman-readable VM name.
metadatadict[str, str] | NoneNoneFree-form key/value labels.
firewallFirewallPolicy | NoneNoneInitial firewall policy.
waitboolTrueBlock until RUNNING. Set False for raw 201/202 behavior.
poll_intervalfloat2.0Seconds between polls when wait=True.
wait_timeoutfloat300.0Max seconds to wait for RUNNING. Raises VMNotReadyError on exceed.
timeoutfloat | httpx.Timeout | NoneNonePer-request HTTP timeout (forwarded to generated launch verbatim).
max_retriesint0Auto-retry on 5xx/connect errors. POST is non-idempotent, default 0.

Returns

Example

python
from fastvm import FastvmClient

client = FastvmClient()
vm = client.vms.launch(machine_type="c1m2", name="dev")
print(vm.id, vm.status)  # "running"

# Restore from snapshot
vm = client.vms.launch(snapshot_id="snp_...")

# Skip polling — get the raw 201/202 body
vm = client.vms.launch(machine_type="c1m2", wait=False)

client.vms.retrieve

GET/v1/vms/{id}
client.vms.retrieve(
    id: str,
) -> VM

Description

Get a VM

Parameters

ParamTypeDefaultDescription
idstrrequiredVM ID (UUID).

Returns

client.vms.update

PATCH/v1/vms/{id}
client.vms.update(
    id: str,
    name: str,
    metadata: Metadata,
) -> VM

Description

Update a VM

Parameters

ParamTypeDefaultDescription
idstrrequiredVM ID (UUID).
namestr
metadataMetadata

Returns

client.vms.delete

DELETE/v1/vms/{id}
client.vms.delete(
    id: str,
) -> DeleteResponse

Description

Delete a VM

Parameters

ParamTypeDefaultDescription
idstrrequiredVM ID (UUID).

Returns

client.vms.set_firewall

PUT/v1/vms/{id}/firewall
client.vms.set_firewall(
    id: str,
    mode: FirewallMode,
    ingress: FirewallRule[],
) -> VM

Description

Replace firewall policy

Parameters

ParamTypeDefaultDescription
idstrrequiredVM ID (UUID).
modeFirewallModerequired
ingressFirewallRule[]

Returns

client.vms.patch_firewall

PATCH/v1/vms/{id}/firewall
client.vms.patch_firewall(
    id: str,
    mode: FirewallMode,
    ingress: FirewallRule[],
) -> VM

Description

Patch firewall policy

Parameters

ParamTypeDefaultDescription
idstrrequiredVM ID (UUID).
modeFirewallMode
ingressFirewallRule[]

Returns

client.vms.console_token

POST/v1/vms/{id}/console-token
client.vms.console_token(
    id: str,
) -> ConsoleTokenResponse

Description

Mint a console token

Parameters

ParamTypeDefaultDescription
idstrrequiredVM ID (UUID).

Returns

client.vms.runoverride

POST/v1/vms/{id}/exec
client.vms.run(
    id: str,
    *,
    command: str | Sequence[str],
    timeout_sec: int | None = None,
    max_retries: int = 0,
) -> ExecVMResponse

Description

Execute a command inside a VM. The override accepts str in addition to Sequence[str]: plain shell strings are auto-wrapped into ["sh", "-c", "<cmd>"] before hitting the API. Argv-style calls pass through unchanged.

The wrap guards against Python's silent string-to-chars iteration when a Sequence[str] parameter is passed a bare string, which would otherwise produce a nonsensical argv like ["l","s"," ","-","l","a"].

Parameters

ParamTypeDefaultDescription
idstrrequiredTarget VM id.
commandstr | Sequence[str]requiredShell string (auto-wrapped) or argv.
timeout_secint | NoneNoneServer-side execution timeout.
max_retriesint0Auto-retry on 5xx. Non-idempotent, default 0.

Returns

Example

python
# Shell strings work — auto-wrapped into ["sh", "-c", ...]
result = client.vms.run(vm.id, command="ls -la /root")

# Argv lists pass through unchanged
result = client.vms.run(vm.id, command=["python3", "main.py", "--flag"])

print(result.exit_code, result.stdout)

VMs.Files

client.vms.files.*

client.vms.files.presign

POST/v1/vms/{id}/files/presign
client.vms.files.presign(
    id: str,
    path: str,
) -> FilePresignResponse

Description

Mint signed URLs for uploading a file to a VM

Parameters

ParamTypeDefaultDescription
idstrrequiredVM ID (UUID).
pathstrrequiredAbsolute destination path inside the guest filesystem (where the file will land after fetchFileToVm). Used only to scope the staging object key; any value server-side is accepted here.

Returns

Example

python
# High-level helpers — handle presign + PUT/GET + fetch + (for dirs) tar
# for both file and directory transfers automatically.
client.upload(vm.id, "./local/file.txt", "/root/file.txt")
client.upload(vm.id, "./local-dir", "/root/remote-dir")

client.download(vm.id, "/root/out.log", "./out.log")
client.download(vm.id, "/var/log", "./log-backup")

# Raw call if you need manual control over the signed-URL flow:
presign = client.vms.files.presign(vm.id, path="/root/file.txt")

client.vms.files.fetch

POST/v1/vms/{id}/files/fetch
client.vms.files.fetch(
    id: str,
    url: str,
    path: str,
    timeout_sec: int,
) -> ExecVMResponse

Description

Fetch a file into a VM from a presigned URL

Parameters

ParamTypeDefaultDescription
idstrrequiredVM ID (UUID).
urlstrrequiredMust be the downloadUrl previously returned by POST /v1/vms/{id}/files/presign (URLs from other sources are rejected).
pathstrrequiredAbsolute destination path inside the guest filesystem.
timeout_secintPer-fetch timeout in seconds.

Returns

Example

python
# You usually don't call this directly — client.upload() composes
# presign + PUT + fetch in a single call. Use it when you need to
# pipe an already-hosted URL (still from /files/presign) into the VM.
client.vms.files.fetch(vm.id, url=presign.download_url, path="/root/file.txt")

Snapshots

client.snapshots.*

client.snapshots.list

GET/v1/snapshots
client.snapshots.list() -> Snapshot[]

Description

List snapshots

Returns

[]

client.snapshots.create

POST/v1/snapshots
client.snapshots.create(
    vm_id: str,
    name: str,
) -> Snapshot

Description

Create a snapshot

Parameters

ParamTypeDefaultDescription
vm_idstrrequired
namestrSnapshot name (trimmed + whitespace-collapsed, max 64 runes; longer values are truncated server-side). Auto-generated as snapshot-<8-char-vmId-prefix> if empty.

Returns

client.snapshots.update

PATCH/v1/snapshots/{id}
client.snapshots.update(
    id: str,
    name: str,
) -> Snapshot

Description

Rename a snapshot

Parameters

ParamTypeDefaultDescription
idstrrequiredSnapshot ID (UUID).
namestr

Returns

client.snapshots.delete

DELETE/v1/snapshots/{id}
client.snapshots.delete(
    id: str,
) -> DeleteResponse

Description

Delete a snapshot

Parameters

ParamTypeDefaultDescription
idstrrequiredSnapshot ID (UUID).

Returns

Volumes

client.volumes.*

client.volumes.list

GET/v1/volumes
client.volumes.list() -> Volume[]

Description

List volumes

Returns

[]

client.volumes.create

POST/v1/volumes
client.volumes.create(
    name: str,
    backend: VolumeBackend,
    access_mode: VolumeAccessMode,
    size_gi_b: int,
    byo_object: BYOObjectVolumeInput,
) -> Volume

Description

Create a volume

Parameters

ParamTypeDefaultDescription
namestr
backendVolumeBackendrequired
access_modeVolumeAccessMode
size_gi_bintRequired for native volumes.
byo_objectBYOObjectVolumeInput

Returns

client.volumes.retrieve

GET/v1/volumes/{id}
client.volumes.retrieve(
    id: str,
) -> Volume

Description

Get a volume

Parameters

ParamTypeDefaultDescription
idstrrequired

Returns

client.volumes.update

PATCH/v1/volumes/{id}
client.volumes.update(
    id: str,
    name: str,
    credentials_ref: str,
) -> Volume

Description

Update a volume

Parameters

ParamTypeDefaultDescription
idstrrequired
namestr
credentials_refstrRotates credentials for byo-object volumes. New VM launches use the new generation.

Returns

client.volumes.delete

DELETE/v1/volumes/{id}
client.volumes.delete(
    id: str,
) -> DeleteResponse

Description

Delete a volume

Parameters

ParamTypeDefaultDescription
idstrrequired

Returns

client.volumes.attachments

GET/v1/volumes/{id}/attachments
client.volumes.attachments(
    id: str,
) -> VolumeAttachmentRecord[]

Description

List volume attachments

Parameters

ParamTypeDefaultDescription
idstrrequired

Returns

VolumeAttachmentRecord[]

client.volumes.diagnostics

GET/v1/volumes/{id}/diagnostics
client.volumes.diagnostics(
    id: str,
) -> dict

Description

Get volume diagnostics

Parameters

ParamTypeDefaultDescription
idstrrequired

Returns

dict

Volume_credentials

client.volume_credentials.*

client.volume_credentials.list

GET/v1/volume-credentials
client.volume_credentials.list() -> VolumeCredential[]

Description

List volume credential references

Returns

[]

client.volume_credentials.create

POST/v1/volume-credentials
client.volume_credentials.create(
    name: str,
    type: str,
    data: str,
) -> VolumeCredential

Description

Create a volume credential

Parameters

ParamTypeDefaultDescription
namestrrequired
typestrrequired
datastrrequiredCredential material. Never returned by the API.

Returns

client.volume_credentials.delete

DELETE/v1/volume-credentials/{id}
client.volume_credentials.delete(
    id: str,
) -> DeleteResponse

Description

Delete a volume credential

Parameters

ParamTypeDefaultDescription
idstrrequired

Returns

Quotas

client.quotas.*

client.quotas.retrieve

GET/v1/org/quotas
client.quotas.retrieve() -> OrgQuotaUsage

Description

Get org quotas and usage

Returns

Types

Shared schemas referenced in parameters and return values.

DeleteResponse

object
FieldTypeDescription
idstr
deletedbool

VMStatus

primitive
Lifecycle status. Known values: provisioning, running, stopped, deleting, error. Terminal failure statuses are error and stopped; any other non-running value indicates the VM is still transitioning. Additional values may be introduced in future server versions; clients should treat unknown values as "in transition" rather than as hard errors.

SnapshotStatus

primitive
Snapshot lifecycle status. Known values: creating, ready, error. Additional values may be introduced in future server versions.

VolumeBackend

enum
nativebyo-object

VolumeConsistency

enum
posixeventual

VolumeAccessMode

enum
rwro

VolumeStatus

enum
provisioningreadyerrordeleting

VolumeMountStatus

enum
pendingmountedfailedunmountedrotationRequired

MachineType

primitive
Machine size identifier (e.g. c1m2, c2m4). Controls CPU and memory allocation. Must be supplied on launch unless restoring from a snapshot.

VM

object
FieldTypeDescription
idstr
namestr
org_idstr
machine_namestr
source_namestrSource snapshot or image name (empty on fresh boot).
firewallFirewallPolicy
metadataMetadata
volumesVolumeAttachment[]
public_ipv6str
cpuint
memory_mi_bint
disk_gi_bint
statusVMStatus
created_atstr
deleted_atunknown

Snapshot

object
FieldTypeDescription
idstr
namestr
org_idstr
vm_idstr
firewallFirewallPolicy
metadataMetadata
statusSnapshotStatus
created_atstr

Volume

object
FieldTypeDescription
idstr
namestr
org_idstr
backendVolumeBackend
consistencyVolumeConsistency
access_modeVolumeAccessMode
size_gi_bunknownNative capacity in GiB; null for byo-object.
statusVolumeStatus
status_messagestr
attachment_countint
billable_gi_bint
created_atstr
updated_atstr

VolumeAttachment

object
FieldTypeDescription
volume_idstr
mount_pathstr
read_onlybool
mount_statusVolumeMountStatus
status_messagestr
rotation_requiredbool

FirewallMode

primitive
Firewall mode. Known values: open (allow all inbound traffic), restricted (deny by default; only rules listed in ingress are allowed). Additional values may be introduced in future server versions.

FirewallRule

object
FieldTypeDescription
protocolstrIP protocol. Known values: tcp, udp. Additional values may be introduced in future server versions.
port_startintStart of port range (inclusive). Required.
port_endintEnd of port range (inclusive). Omit for single-port rules.
source_cidrslist[str]Allowed source CIDRs in IPv6 notation (e.g. 2001:db8::/32). Omit or empty to allow any source. IPv4 CIDRs are rejected.
descriptionstr

FirewallPolicy

object
FieldTypeDescription
modeFirewallMode
ingressFirewallRule[]

BYOObjectVolumeInput

object
FieldTypeDescription
uristrgs://bucket/prefix or s3://bucket/prefix.
credentials_refstrStored volume credential reference.

VolumeCredential

object
FieldTypeDescription
idstr
namestr
typestr
created_atstr

Metadata

object
Free-form string→string map. Server-enforced limits: up to 256 keys, key length 1–256 bytes, value length ≤4096 bytes, total JSON encoding ≤65536 bytes.

ExecVMResponse

object
Buffered response shape for POST /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.
FieldTypeDescription
exit_codeint
stdoutstr
stderrstr
timed_outbool
stdout_truncatedboolTrue if the collector dropped stdout bytes past the 4 MiB cap.
stderr_truncatedboolTrue if the collector dropped stderr bytes past the 4 MiB cap.
duration_msint

FilePresignResponse

object
Pair of signed URLs scoped to the same per-VM staging object. Usable in either direction: either side (client or VM) PUTs bytes to uploadUrl, and either side GETs them back via downloadUrl. URLs expire after expiresInSec seconds and the staging object is auto-deleted after about a day.
FieldTypeDescription
upload_urlstrPresigned PUT URL for the staging object. Accepts Content-Type: application/octet-stream. Used by the client on upload, or by the VM (via an exec'd curl -T -) on download.
download_urlstrPresigned GET URL for the same staging object. Used by the VM (via POST /v1/vms/{id}/files/fetch) on upload, or by the client (via httpx.stream / curl) on download.
expires_in_secintLifetime of both URLs in seconds.
max_upload_bytesintUpper bound on upload size (equals the VM's disk size in bytes).

ConsoleTokenResponse

object
FieldTypeDescription
tokenstr
expires_in_secint
websocket_pathstrRelative WebSocket path; combine with your API host as wss://<host><websocketPath>?session=<token>.

OrgQuotaValues

object
FieldTypeDescription
vcpuint
memory_mi_bint
disk_gi_bint
snapshot_countint
volume_countint
volume_gi_bint

OrgQuotaUsage

object
FieldTypeDescription
org_idstr
limitsOrgQuotaValues
usageOrgQuotaValues

HealthResponse

object
Health check
FieldTypeDescription
statusstr