bitqate
Command-line interface for the BitQate public API (/v1). Manage VPSes and
container servers from a terminal, a script, or an agent — using scoped API
tokens instead of your account session.
Install
npm i -g @bitqate/cli
Or with uv, no Node required. uvx runs it
without installing, uv tool install puts it on your PATH:
uvx bitqate --help
uv tool install bitqate
pipx install bitqate and pip install bitqate work too. The PyPI wheels
wrap the standalone binaries below and cover Linux x64/arm64 (glibc), macOS
(Intel and Apple silicon) and Windows x64.
Standalone binaries for Linux, macOS and Windows are attached to each release
alongside SHA256SUMS. Verify a download with:
sha256sum -c SHA256SUMS --ignore-missing
From source (requires Bun for development):
git clone https://github.com/bitqate/cli.git
cd cli
bun install
bun run build
node dist/bitqate.js --help
The bundle targets Node.js >= 20 and also runs under Bun.
Quick start
Create a token in the dashboard under Settings → API tokens, pick the scopes you need, then:
bitqate auth login # hidden prompt
# or, for pipes and CI:
printf '%s' "$TOKEN" | bitqate auth login --token-stdin
Then:
bitqate account
bitqate vms list
bitqate servers list
On a terminal, most commands go further: bitqate vms list prints a table
with coloured status dots and short IDs, bitqate vms get dizzy-puma a
detail view with next-step hints, and bitqate vms create a full
interactive wizard (region, OS, size presets with monthly prices, SSH key
picker, review and confirm). Everything still works non-interactively —
every question maps to a flag.
$ bitqate vms stop dizzy-puma --wait
⠋ Stopping dizzy-puma stopping · 0:03
✓ Stopped dizzy-puma
Tokens are stored per profile in ~/.config/bitqate/config.json (mode 0600).
Manage them with auth status, auth list, auth switch, auth logout.
BITQATE_TOKEN always takes precedence over the stored profile.
Token scopes
Each command declares the scope it needs (bitqate help <command> shows it,
and bitqate schema lists all of them for agents).
| Scope | Unlocks | Notes |
|---|---|---|
account:read |
account, workspaces list, transactions list |
read-only |
vms:read |
vms list/get/os/nodes/networking/stats/wait, vms backups list |
read-only |
vms:power |
vms start/stop/restart |
|
vms:write |
vms create/resize/rename/auto-renew/renew/rdns, vms backups create |
can charge your balance |
vms:delete |
vms delete/reinstall, vms backups restore/delete |
destroys data |
servers:read |
servers list/get/install-state, servers backups list, servers deployments * |
read-only |
servers:power |
servers start/stop/restart |
|
servers:write |
servers create/renew/auto-renew/rename/resize/ports/startup/deploy, servers backups create |
can charge your balance |
servers:delete |
servers delete/reinstall, servers backups restore/delete |
destroys data |
| any valid token | prices, vms nodes, vms os, servers regions, auth status |
catalog endpoints |
Deliberately absent from API tokens: changing passwords, console tickets, buying IP addresses, git connect/disconnect, and anything admin.
Command reference
Top level: auth login|logout|status|list|switch, account,
workspaces list, transactions list, prices, schema, version,
completion bash|zsh|fish, help <command>.
vms list | get <id> | nodes | os [--node <id>]
vms create --node <n> --os <os> --memory-mb <n> --cpus <n> --disk-gb <n>
[--name <n>] [--ssh-key-file <path.pub>] [--workspace <id>]
[--auto-renew] [--wait] [--dry-run]
vms start|stop|restart <id> [--wait] [--wait-timeout <s>]
vms resize <id> [--memory-mb|--cpus|--disk-gb]
vms rename <id> <name> | auto-renew <id> on|off | renew <id>
vms reinstall <id> --os <id> | delete <id> # destructive
vms backups list|create <id>
vms backups restore|delete <id> <token> # destructive
vms networking <id> | rdns <id> --address <ip> --hostname <name>
vms stats <id> [--range hour|day|week|month|year] [--cf AVERAGE|MAX]
vms wait <id> --status <s> [--wait-timeout <s>]
servers list | get <id> | regions
servers create --name <n> --region <daemonId> --memory-mb <n> --cpus <n>
--disk-gb <n> plus exactly one of:
--image <ref> | --egg-url <url> | --dockerfile <path> | --git
[--env K=V ...] [--startup <cmd>] [--workspace <id>]
[--wait] [--dry-run]
servers start|stop|restart <id> [--wait]
servers reinstall <id> [--image|--egg-url] | delete <id> # destructive
servers renew <id> | auto-renew <id> on|off | rename <id> <name>
servers resize <id> [--memory-mb|--cpus|--disk-gb]
servers ports <id> [--port internal[:tcp|udp] ...]
servers startup <id> [--command <cmd>] [--env K=V ...]
servers install-state <id> | wait <id> --status <s>
servers backups list|create <id>
servers backups restore|delete <id> <backupId> # destructive
servers deploy <id> [--follow]
servers deployments list <id> | get|logs <id> <deployId>
--cpus accepts fractions (1.5 → 150 CPU units on servers, 1.5 cores on
VMs). servers create --git creates the server only; connect the repository
in the dashboard afterwards.
Using with agents and CI
BITQATE_TOKENsupplies the token without touching the config file.- Global flags work in any position:
bitqate --json vms listandbitqate vms list --jsonare equivalent, as are--profile ciand--api-url=…before the command. --json(orBITQATE_OUTPUT=json) prints the API payload withoutsuccess: lists as arrays, objects as objects, actions as{ id?, message, ... }. Errors go to stderr as{"error":{"code","message","status?","retry_after?"}}. In human mode errors print aserror: <message>with an optionalhint:line.- Exit codes: 0 ok · 1 server/network · 2 usage or 400/422 · 3 missing/bad token or 401 · 4 403 (including missing scope) · 5 404 · 6 409 · 7 429 · 8 402 · 9 wait timeout · 130 user cancel (Ctrl-C/Esc in a prompt or wait).
bitqate schemadumps every command, flag, scope and destructive marker as JSON — designed for tool discovery by agents.- Aliases work everywhere:
vm/srv/serverforvms/servers,ls/show/info/rm/newforlist/get/delete/create, andwhoamiforaccount. They appear in help, completion andschema. - Any VM/server argument accepts a name, a short ID prefix, or a full
UUID. Names resolve via the list endpoint (needs the matching
:readscope); a UUID is used directly with no list call. Ambiguous matches open a picker on a TTY or print the candidates otherwise. - On a TTY,
vms createandservers createrun interactive wizards (game-server catalog included:--game paper).--dry-runprints the request body instead of sending it;--yesskips the final confirm. vms ssh <name>connects over SSH (with--jsonit prints{host, user, port, host_key_fingerprint}instead), andopen <name>(orvms open/servers open) opens the dashboard in a browser.-y/--yesis required for destructive commands when not on a TTY; on a TTY you're asked to type the resource name back.--dry-runprints the method, URL and JSON body without sending anything.-q/--quietprints only resource IDs, one per line — easy to pipe.--verbosewritesMETHOD url -> status (ms)to stderr; tokens are never logged.- Prefer least-privilege tokens with an expiry for CI (e.g. only
vms:read+vms:powerfor a restart cron).
Configuration
config.json lives in BITQATE_CONFIG_DIR > $XDG_CONFIG_HOME/bitqate >
~/.config/bitqate and looks like
{"version":1,"current":"default","profiles":{"default":{"api_url":"...","token":"bqat_..."}}}.
API URL precedence: --api-url > BITQATE_API_URL > profile > https://api.bitqate.com.
License
Apache License 2.0. See LICENSE. The license does not grant rights to the BitQate name or logo.
Metadata
Release files for bitqate 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| bitqate-0.2.1-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| bitqate-0.2.1-py3-none-manylinux_2_17_x86_64.whl | Python 3 | none | Linux glibc 2.17+ x86-64 | Details |
| bitqate-0.2.1-py3-none-manylinux_2_17_aarch64.whl | Python 3 | none | Linux glibc 2.17+ ARM64 | Details |
| bitqate-0.2.1-py3-none-macosx_13_0_x86_64.whl | Python 3 | none | macOS 13.0+ x86-64 | Details |
| bitqate-0.2.1-py3-none-macosx_13_0_arm64.whl | Python 3 | none | macOS 13.0+ ARM64 | Details |
Total release size: 242.1 MB
Release files / bitqate-0.2.1-py3-none-win_amd64.whl
| Download URL | bitqate-0.2.1-py3-none-win_amd64.whl |
|---|---|
| Size | 54.6 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
61186522273529c7be17588502ae20ab634d57a1f9594ac89de12fa16c3ee6d5
|
|
BLAKE2b-256 checksum How to use checksums |
def853eee9ca255f51cd847fe38b97a1bdcc0124e8cb6a5e4cc3492d15fe76de
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logRelease files / bitqate-0.2.1-py3-none-manylinux_2_17_x86_64.whl
| Download URL | bitqate-0.2.1-py3-none-manylinux_2_17_x86_64.whl |
|---|---|
| Size | 51.7 MB |
| Tags | Linux glibc 2.17+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
d47ddad649a8d692194f863e6146483e605a03483b1829a8babae13b81300657
|
|
BLAKE2b-256 checksum How to use checksums |
d8708c9d65f8a39e62915029add8aaa977710ba894c3744d984178357db66a11
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logRelease files / bitqate-0.2.1-py3-none-manylinux_2_17_aarch64.whl
| Download URL | bitqate-0.2.1-py3-none-manylinux_2_17_aarch64.whl |
|---|---|
| Size | 51.6 MB |
| Tags | Linux glibc 2.17+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
5eb3b53dec6d933a624b0b374ddc799b4d347d50330aa24f7cd929d1513edb74
|
|
BLAKE2b-256 checksum How to use checksums |
f1dadd4843cf9a9015d0b222edbfd3ef579c995d67bd25f7f0d4eedc4594800f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logRelease files / bitqate-0.2.1-py3-none-macosx_13_0_x86_64.whl
| Download URL | bitqate-0.2.1-py3-none-macosx_13_0_x86_64.whl |
|---|---|
| Size | 43.3 MB |
| Tags | Python 3 macOS 13.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
e32812ac0f3ef2403cdb5d49ff88ad270a08532682ed72a7c967d8d8582e29df
|
|
BLAKE2b-256 checksum How to use checksums |
bbe52fa38377e24600d0ab722afbfae43a0547236e1263da8bb7a034362e38d1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logRelease files / bitqate-0.2.1-py3-none-macosx_13_0_arm64.whl
| Download URL | bitqate-0.2.1-py3-none-macosx_13_0_arm64.whl |
|---|---|
| Size | 40.8 MB |
| Tags | Python 3 macOS 13.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
5b353478ef2325fe75c37aaa9fa6fe8b5b9a53c498229b0c0953bbaf1a95ada5
|
|
BLAKE2b-256 checksum How to use checksums |
47518aa07cc6c7a050ab2cb903ce4b24d4a25a5336b32ea07c58d5091582c666
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logSecurity for bitqate 0.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 5 files in this release have been uploaded with provenance metadata.
Attestation for bitqate-0.2.1-py3-none-win_amd64.whl
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.