Canadian KVM VPS in Montréal from 8.50 CAD/month

API

Endpoint reference

The twenty-eight endpoints of API v1, generated from the OpenAPI contract.

This page is generated from the OpenAPI contract. Where it disagrees with the API, the contract is right — tell us.

Base URL https://api.ffxf.net/v1
OpenAPI contract openapi.v1.json — The file this reference renders, as published.

Contents

Catalog

get /regions No key

List regions — Where machines can run. A plan or an image may not be offered everywhere.

Parameters

No parameters.

Responses

HTTPDescription
200OK
get /plans No key

List plans

Parameters

NameInType RequiredDescription
regionquerystringnoKeep only the plans offered in this region.

Responses

HTTPDescription
200OK
get /plans/{plan} No key

Get a plan

Parameters

NameInType RequiredDescription
planpathstringyes

Responses

HTTPDescription
200OK
404No such resource, or it does not belong to this account.
get /images No key

List images — The image referential. `slug` is the stable identifier to pass at

Parameters

NameInType RequiredDescription
regionquerystringnoKeep only the images available in this region.
planquerystringnoKeep only the images that fit this plan.
categoryquerylinux | windows | bsd | app | …no

Responses

HTTPDescription
200OK
get /images/{image} No key

Get an image

Parameters

NameInType RequiredDescription
imagepathstringyes

Responses

HTTPDescription
200OK
404No such resource, or it does not belong to this account.

Machines

get /vms

List machines

Parameters

NameInType RequiredDescription
cursorquerystringnoThe `next_cursor` from the previous page.
limitqueryintegerno
statusqueryVmStatusno
regionquerystringno
billingqueryhourly | monthlyno

Responses

HTTPDescription
200OK
401Missing, unknown, disabled or expired key.
post /vms

Create a machine — Runs the same checks as the console, in this order: account standing,

Parameters

NameInType RequiredDescription
Idempotency-KeyheaderstringyesUnique per order, your own value. Kept 24 hours.

Request body

NameTypeRequired Description
planstringyes
regionstringyes
imagestringyes
hostnameHostnameyes
billinghourly | monthlyyes
paymentcredit | manualnoMonthly only. `credit` settles the invoice from the balance when it
ssh_keysstring[]noFingerprints or ids of keys on the account. Ignored by images without cloud-init key support.
password_deliveryemail | noneno`email` generates a password and mails it. `none` requires at least
optionsobjectnoPaid options declared by the plan, by name. Unknown keys are refused.
dry_runbooleannoRun every check and price the order without creating anything.

Responses

HTTPDescription
202Order accepted. `action` follows the provisioning; it is null when
200Estimate returned (`dry_run: true`). Nothing was created.
400Malformed request.
402Not enough credit, or a budget cap reached. An hourly order needs the
403Key out of scope, IP not allowed, e-mail unverified or account suspended.
409The resource is not in a state that allows this: machine suspended,
422The request is well formed but the catalogue refuses it: image below the
429Too many requests.
get /vms/{vm}

Get a machine

Parameters

NameInType RequiredDescription
vmpathintegeryesThe machine id. A machine is identified by its service: the id exists

Responses

HTTPDescription
200OK
404No such resource, or it does not belong to this account.
patch /vms/{vm}

Update a machine — Only the hostname is editable. It is applied inside the guest and to the

Parameters

NameInType RequiredDescription
vmpathintegeryesThe machine id. A machine is identified by its service: the id exists

Request body

NameTypeRequired Description
hostnameHostnameno

Responses

HTTPDescription
200OK
409The resource is not in a state that allows this: machine suspended,
delete /vms/{vm}

Destroy a machine — Destroys the machine and its disk. There is no undo and no backup is

Parameters

NameInType RequiredDescription
vmpathintegeryesThe machine id. A machine is identified by its service: the id exists
confirmquerystringyesThe machine's exact hostname.
whenqueryperiod_end | nownoMonthly machines only.

Responses

HTTPDescription
202Accepted
400Malformed request.
404No such resource, or it does not belong to this account.
409The resource is not in a state that allows this: machine suspended,
get /vms/{vm}/metrics

Get machine metrics — CPU, memory, disk and network, as sampled by the hypervisor.

Parameters

NameInType RequiredDescription
vmpathintegeryesThe machine id. A machine is identified by its service: the id exists
timeframequeryhour | day | week | month | …no

Responses

HTTPDescription
200OK
503The hypervisor did not answer. Nothing was changed; retry.
post /vms/{vm}/console

Open a console session — Returns a single-use URL to the VNC console, valid for a few minutes.

Parameters

NameInType RequiredDescription
vmpathintegeryesThe machine id. A machine is identified by its service: the id exists

Responses

HTTPDescription
201Created
409The resource is not in a state that allows this: machine suspended,

Actions

get /vms/{vm}/actions

List a machine's actions

Parameters

NameInType RequiredDescription
vmpathintegeryesThe machine id. A machine is identified by its service: the id exists
cursorquerystringnoThe `next_cursor` from the previous page.
limitqueryintegerno

Responses

HTTPDescription
200OK
post /vms/{vm}/actions

Act on a machine — `start`, `shutdown`, `reboot` ask the guest politely. `stop` cuts the

Parameters

NameInType RequiredDescription
vmpathintegeryesThe machine id. A machine is identified by its service: the id exists
Idempotency-Keyheaderstringno

Request body

NameTypeRequired Description
typestart | shutdown | reboot | stopyes

Responses

HTTPDescription
202Accepted
403Key out of scope, IP not allowed, e-mail unverified or account suspended.
409The resource is not in a state that allows this: machine suspended,
422The request is well formed but the catalogue refuses it: image below the
503The hypervisor did not answer. Nothing was changed; retry.
get /actions

List actions

Parameters

NameInType RequiredDescription
cursorquerystringnoThe `next_cursor` from the previous page.
limitqueryintegerno
statusqueryActionStatusno

Responses

HTTPDescription
200OK
get /actions/{action}

Get an action — Poll this until `status` leaves `running`. A completed action is kept 30 days.

Parameters

NameInType RequiredDescription
actionpathintegeryes

Responses

HTTPDescription
200OK
404No such resource, or it does not belong to this account.

Networking

get /vms/{vm}/network

Get a machine's addresses

Parameters

NameInType RequiredDescription
vmpathintegeryesThe machine id. A machine is identified by its service: the id exists

Responses

HTTPDescription
200OK
post /vms/{vm}/network/ipv6

Add an address from the machine's IPv6 prefix — Each machine carries a routed /64. An address taken here is registered

Parameters

NameInType RequiredDescription
vmpathintegeryesThe machine id. A machine is identified by its service: the id exists

Request body

NameTypeRequired Description
addressstringyesFull address inside the machine's prefix.

Responses

HTTPDescription
201Created
409The resource is not in a state that allows this: machine suspended,
422The request is well formed but the catalogue refuses it: image below the
delete /vms/{vm}/network/ipv6/{address}

Release an IPv6 address

Parameters

NameInType RequiredDescription
vmpathintegeryesThe machine id. A machine is identified by its service: the id exists
addresspathstringyes

Responses

HTTPDescription
204Released
404No such resource, or it does not belong to this account.
put /vms/{vm}/network/rdns

Set reverse DNS on an address

Parameters

NameInType RequiredDescription
vmpathintegeryesThe machine id. A machine is identified by its service: the id exists

Request body

NameTypeRequired Description
addressstringyes
hostnamestringnoNull clears the record and restores the default.

Responses

HTTPDescription
200OK
422The request is well formed but the catalogue refuses it: image below the

Backups

get /vms/{vm}/backups

List backups

Parameters

NameInType RequiredDescription
vmpathintegeryesThe machine id. A machine is identified by its service: the id exists

Responses

HTTPDescription
200OK
post /vms/{vm}/backups/{backup}/restore

Restore a backup — Overwrites the current disk. The machine is stopped for the duration.

Parameters

NameInType RequiredDescription
vmpathintegeryesThe machine id. A machine is identified by its service: the id exists
backuppathstringyes

Responses

HTTPDescription
202Accepted
409The resource is not in a state that allows this: machine suspended,
delete /vms/{vm}/backups/{backup}

Delete a backup

Parameters

NameInType RequiredDescription
vmpathintegeryesThe machine id. A machine is identified by its service: the id exists
backuppathstringyes

Responses

HTTPDescription
204Deleted
404No such resource, or it does not belong to this account.

Account

get /account

Get account standing — Everything an automated fleet needs to decide on its own: balance, what

Parameters

No parameters.

Responses

HTTPDescription
200OK
get /usage

List hourly usage — One record per hour charged, per machine. This is the ledger the

Parameters

NameInType RequiredDescription
fromquerystringno
toquerystringno
vm_idqueryintegerno
group_byqueryhour | vmnoReturn one line per machine instead of one per hour.
cursorquerystringnoThe `next_cursor` from the previous page.
limitqueryintegerno

Responses

HTTPDescription
200OK

SSH keys

get /ssh-keys

List SSH keys

Parameters

No parameters.

Responses

HTTPDescription
200OK
post /ssh-keys

Add an SSH key — Up to 20 keys per account. Re-adding a known fingerprint returns the existing key.

Parameters

No parameters.

Request body

NameTypeRequired Description
namestringyes
public_keystringyes

Responses

HTTPDescription
201Created
422The request is well formed but the catalogue refuses it: image below the
delete /ssh-keys/{key}

Delete an SSH key — Machines already deployed with this key keep it; only future deployments change.

Parameters

NameInType RequiredDescription
keypathintegeryes

Responses

HTTPDescription
204Deleted
404No such resource, or it does not belong to this account.

Support & discussions

Technical questions, incident reports, or infrastructure discussions, the team is reachable on Discord, Telegram, X, and IRC.