nb-cli
nb-cli is a NetBox CLI built on pynetbox for three audiences:
- Operators who need a dependable terminal workflow
- Automation that needs stable output and predictable exit codes
- LLM/agent wrappers that need an explicit execution contract instead of free-form API access
Features
- Generic CRUD commands covering every NetBox REST endpoint
- ~46 typed workflow commands with friendly flags and automatic field resolution
- IP and prefix allocation helpers
- Bulk update and bulk delete operations
- Schema and resource discovery from live OpenAPI
- JSON, JSONL, text, and table output modes
- Multi-profile configuration (CLI flags > env vars >
.nb-cli.toml>~/.config/nb-cli/config.toml) - Verbose built-in help including long-form topic guides (
nb-cli help <topic>) - Validated against NetBox 4.5.3
Installation
pip install nb-cli
Or with uv:
uv pip install nb-cli
The console entry points are nb-cli and nbx.
Quick Start
# Discover the instance
nb-cli status
nb-cli resources --search device
nb-cli schema dcim.devices
nb-cli choices dcim.devices
# Read data
nb-cli query dcim.devices --filter site=nyc1 --format table
nb-cli device list --filter status=active --format table
nb-cli device show --lookup name=edge01
# Write data safely (--dry-run to preview, --yes to confirm)
nb-cli device create --name edge01 --device-type qfx5120 --role leaf --site nyc1 --yes
nb-cli device update --lookup name=edge01 --status active --serial ABC123 --yes --diff
nb-cli prefix allocate-ip --lookup prefix=10.0.10.0/24 --count 2 --status active --yes
nb-cli ip-address assign-interface --lookup address=10.0.10.10/24 --device edge01 --interface xe-0/0/0 --yes
# Raw escape hatch for unsupported endpoints
nb-cli request get /api/dcim/devices/?name=edge01
Command Families
Generic Commands
Work with any NetBox resource path — no typed wrapper required.
version— print installed versionhelp [topic]— long-form help topicsstatus— fetch NetBox status endpointopenapi— fetch raw OpenAPI documentresources— list resources discovered from OpenAPIschema <resource>— show fields and parameters for a resourcechoices <resource>— return valid choices for type/status/protocol fieldsquery <resource>— list objects with filtering, pagination, field selectionget <resource>— fetch a single object by ID or lookupcreate <resource>— create one object or a bulk list from JSONupdate <resource>— patch an object with JSON payloaddelete <resource>— delete an object by ID or lookupbulk-update <resource>— PATCH multiple objects in one request (each must includeid)bulk-delete <resource>— DELETE multiple objects by ID in one requestrequest <method> <path>— execute any raw REST request
Typed Workflow Commands
Resource-specific commands with friendly flags and automatic slug/name-to-ID resolution. All support list, show, create, update, and delete.
Circuits
provider— circuit providers (Zayo, Lumen, etc.)provider-account— provider billing accountscircuit-type— circuit type definitionscircuit— individual circuits
DCIM — Core
manufacturerdevice-roleplatformdevice-typesitelocationrackdeviceinterfacecable
DCIM — Device Components
console-portconsole-server-portpower-portpower-outletrear-portfront-port(requires existingrear-port)module-bayinventory-item
DCIM — Power Infrastructure
power-panelpower-feed
Tenancy
tenant-grouptenantcontact-groupcontacttag
IPAM — Core
vlanvrfprefixip-address
IPAM — Extended
rir— Regional Internet Registriesasn— Autonomous System Numbersip-rangeroute-targetfhrp-group— VRRP/HSRP/GLBP/CARP groupsservice— IP services on devices or VMs
Virtualization
cluster-typecluster-groupclustervirtual-machinevm-interface
Extras
custom-fieldwebhookevent-rulesaved-filter
Special Typed Actions
# Allocate IPs from a prefix
nb-cli prefix allocate-ip --lookup prefix=10.0.10.0/24 --count 5 --status active --yes
# Allocate child prefixes
nb-cli prefix allocate-prefix --lookup prefix=10.0.0.0/16 --prefix-length 24 --count 4 --yes
# Assign an IP to a device interface or VM interface
nb-cli ip-address assign-interface --lookup address=10.0.10.10/24 --device edge01 --interface xe-0/0/0 --yes
nb-cli ip-address assign-interface --lookup address=192.0.2.1/32 --vm app01 --vm-interface eth0 --yes
Output Modes
nb-cli query dcim.devices --format json # default: structured envelope
nb-cli query dcim.devices --format jsonl # one object per line (stream-friendly)
nb-cli query dcim.devices --format table # human-readable columns
nb-cli query dcim.devices --format text # pretty-printed text
Configuration
Configuration is loaded in priority order:
- CLI flags
- Environment variables (
NBCLI_URL,NBCLI_TOKEN, etc.) .nb-cli.tomlin the current directory~/.config/nb-cli/config.toml
Example config with multiple profiles:
default_profile = "lab"
[profiles.lab]
url = "https://netbox-lab.example.com"
token_env = "NETBOX_TOKEN_LAB"
verify_ssl = true
timeout = 30
[profiles.prod]
url = "https://netbox.example.com"
token_env = "NETBOX_TOKEN_PROD"
verify_ssl = true
threading = true
strict_filters = true
Switch profiles:
nb-cli --profile prod device list --filter status=active
Built-in Help
nb-cli --help
nb-cli device create --help
nb-cli help overview
nb-cli help generic
nb-cli help device
nb-cli help prefix
nb-cli help ip-address
nb-cli help circuits
nb-cli help tenancy
nb-cli help virtualization
nb-cli help ipam-extras
nb-cli help dcim-components
nb-cli help extras
nb-cli help bulk
nb-cli help configuration
nb-cli help output
Documentation
Safety Model
- JSON output is the default — wrappers depend on deterministic, parseable output.
- List queries default to
--limit 50. - Strict filter validation is enabled by default.
- All mutating commands require
--yesunless--dry-runis used. --dry-runpreviews the payload without sending it.--diffshows a before/after diff on updates.
Development
Requirements: Python 3.11+, uv
git clone https://github.com/lmarte17/nb-cli
cd nb-cli
uv sync --dev
Run tests:
.venv/bin/python -m pytest tests/test_cli.py tests/test_config.py tests/test_client.py -v
Run live integration tests against a real NetBox instance:
NBCLI_URL="https://netbox.example.com" \
NBCLI_TOKEN="..." \
.venv/bin/python -m pytest tests/test_live_integration.py -v
License
MIT — see LICENSE.
Metadata
Release files for nb-cli-tool 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| nb_cli_tool-0.1.0.tar.gz | 48.2 kB | Without provenance | Details for nb_cli_tool-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| nb_cli_tool-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for nb_cli_tool-0.1.0-py3-none-any.whl |
Total release size: 86.1 kB
Release files / nb_cli_tool-0.1.0.tar.gz
| Download URL | nb_cli_tool-0.1.0.tar.gz |
|---|---|
| Size | 48.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
52f2e4f15d830772ae1bb8c079a5ef6de036f43857c3daf8a0aa6064cb6e02c6
|
|
BLAKE2b-256 checksum How to use checksums |
94b8c81ed2038ed3075689df73a8cf8ec55417ff1bfd2b2d9df903ae91d7381d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.5
|
Release files / nb_cli_tool-0.1.0-py3-none-any.whl
| Download URL | nb_cli_tool-0.1.0-py3-none-any.whl |
|---|---|
| Size | 37.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d949859bab65e03f821a32f88641310fe4be784eb2cfc77ffe4be0c1b37b5f9b
|
|
BLAKE2b-256 checksum How to use checksums |
8d2dd663ed9b2a80899b75f0042615bc5ae8121115633c933ba4b8254cb2181f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.5
|
Security for nb-cli-tool 0.1.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A 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.