qn — Quicknode CLI
qn is a command-line interface for Quicknode, built around noun-verb commands that read naturally for both humans and agents. Manage endpoints, streams, webhooks, the KV store, teams, usage, and billing, with output in multiple formats for easy reading or scripting.
$ qn endpoint list
ID LABEL STATUS CHAIN/NETWORK TYPE MULTI
ep-1 production active ethereum/mainnet shared yes
ep-2 — paused solana/mainnet dedicated no
showing 1–2 of 2
$ qn endpoint list --wide
ID LABEL STATUS CHAIN/NETWORK TYPE MULTI HTTP WSS
ep-1 production active ethereum/mainnet shared yes https://ep-1.example —
ep-2 — paused solana/mainnet dedicated no https://ep-2.example —
showing 1–2 of 2
# LLM-optimized TOON format (non-TTY default)
$ qn endpoint list | cat
data[2]{id,name,label,status,chain,network,is_dedicated,is_flat_rate,http_url,wss_url,tags,is_multichain}:
"ep-1","ep-1","production",active,ethereum,mainnet,false,false,"https://ep-1.example",null,"prod, eu",false
"ep-2","ep-2",null,paused,solana,mainnet,true,false,"https://ep-2.example",null,"",false
pagination:
total: 2
limit: 20
offset: 0
error: null
Installation
Pick the recommended path for your platform. Other channels are listed under Alternatives.
Homebrew (macOS, Linux)
Scoop (Windows)
scoop bucket add quicknode https://github.com/quicknode/scoop-bucket
scoop install quicknode/qn
.deb (Debian, Ubuntu)
Each GitHub release attaches qn_<VERSION>_amd64.deb and qn_<VERSION>_arm64.deb. Check your architecture with dpkg --print-architecture, then grab the matching file from the latest release page:
# replace <VERSION> with the version on the release page, e.g. 0.1.8
Arch Linux (AUR)
Fedora, EPEL (COPR)
Docker (GHCR)
Alternatives
crates.io:
The crate name is quicknode-cli but the installed binary is qn.
From source:
&&
Prebuilt binaries: every GitHub release attaches per-platform archives — see the latest release page.
Authentication
You will need a Quicknode API key to get started. Once you have that, you can run qn auth login
qn resolves your API key from the first source that matches:
--api-key <KEY>flag- The config file: the
--config-file <PATH>flag if given, otherwise~/.config/qn/config.toml— or$XDG_CONFIG_HOME/qn/config.tomlif that env var is set. The same layout applies on Windows:%USERPROFILE%\.config\qn\config.toml. Managed byqn auth login.
There is deliberately no environment-variable key source: a key left
exported in a shell is invisible state that outlives the session it was set
for, and makes it far too easy to run a destructive command against the wrong
account. For CI, write a config file and point --config-file at it (or pass
--api-key from your secret store).
If no source matches, qn exits with code 4 and tells you to run
qn auth login. Regular commands never prompt — only qn auth login does.
This keeps scripts and CI deterministic.
Output
Pick a format with --format <FMT> (alias -o <FMT>):
--format |
Best for |
|---|---|
table |
Humans on a TTY. Pretty UTF-8 tables with optional color. Default when stdout is a terminal. |
json |
Scripts and pipelines (jq, gron, …). |
yaml |
Same shape as JSON, easier to skim by eye. |
md |
GitHub-flavored markdown — paste into PRs, issues, docs. |
toon |
Token-Oriented Object Notation — compact serialization optimized for LLM prompts. Default when stdout is not a terminal (piped / agent invocations). |
Other output flags:
-w/--wide: add extra columns totableandmdoutput (e.g. HTTP/WSS URLs inendpoint list). Mirrorskubectl get -o wide. Doesn't affectjson/yaml/toon, which always include everything.--no-color: plain ASCII (also honored:NO_COLORenv var,TERM=dumb, non-TTY stdout, any non-tableformat).--quiet: suppress state-change notes on stderr.--verbose: include API error bodies and other detail.
You can also set defaults in ~/.config/qn/config.toml:
[]
= "yaml" # default --format value
= true # always show extra columns in table/md output
CLI flags win over config values. Built-in defaults: format = "table" when stdout is a TTY, "toon" otherwise; wide = false.
qn follows the Command Line Interface Guidelines: data on stdout, diagnostics on stderr, meaningful exit codes (0 success, 2 API error, 3 network error, 4 auth/config, 5 needs confirmation), and a documented -h/--help at every subcommand level.
Example usage
Endpoints
|
Streams
Webhooks
KV store
|
Other
Shell completions
Configuration via environment
qn reads no API credentials from the environment (see
Authentication for why). The conventional variables are
honored: NO_COLOR and TERM=dumb disable color, and
XDG_CONFIG_HOME/HOME (USERPROFILE on Windows) locate the default
config file. The CLI hands the
key to the SDK explicitly; it does not read the SDK's QN_SDK__* environment
namespace.
The hidden --base-url <URL> flag overrides the API host for all four
sub-clients at once (used for integration tests and on-prem mirrors).
Confirmations
Destructive commands (delete, archive, bulk pause, token revocation,
removing a rate-limit override, …) prompt before acting, and the prompt states
what will happen ("Pause 3 endpoint(s)? They will stop serving requests").
Pass --yes/-y to skip the prompt. In scripts and CI (no TTY), a gated
command without --yes exits with code 5 before any request is sent.
The CLI deliberately has no account-wide wipe commands (no delete-all);
operations with that blast radius belong behind the API, not a one-liner.
Retries
Read-only commands (list, show, logs, metrics, usage, …) retry
transient failures — HTTP 429, 500, 502, 503, 504, timeouts, and connection
errors — with exponential backoff and full jitter. The default is 3 retries;
tune it with the global --retries <N> flag (--retries 0 disables).
stream test-filter retries too: it sends a POST, but only evaluates a
filter against historical data and changes nothing.
Commands that modify resources (create, update, delete, pause, …)
never retry automatically: a retried create could provision twice. If a
mutation fails with a transient error, check whether it took effect before
re-running it.
Exit codes
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | CLI error (usage/bad argument, IO, decode) |
| 2 | API error (server returned 4xx/5xx) |
| 3 | Network failure (timeout, connect, transport) |
| 4 | Missing or invalid API key / config |
| 5 | Operation needs confirmation (pass --yes) |
| 130 | Interrupted (SIGINT) |
License
MIT