Skip to main content

NetBox Assets

A NetBox plugin for simple asset tracking: keep a record of hardware (devices, modules and racks) that is not currently installed, for example spare parts and equipment in storage.

This project is a stripped-down fork of netbox-inventory by Arnes. It is based on upstream commit e749f6f (v2.7.0). All credit for the original design and code goes to the upstream authors. If you need the full feature set (inventory item types and groups, suppliers, purchases, deliveries, warranty tracking, audit flows), use the original plugin.

Purpose

NetBox documents what is installed in your network. netbox-assets adds a place for hardware that is not installed yet, or not any more: what it is, its serial number and asset tag, and where it is stored. When an asset is installed, you link it to the device, module or rack that represents it in NetBox.

The goal is simple record keeping, not full inventory management.

Differences from netbox-inventory

Feature netbox-inventory netbox-assets
Assets Yes Yes
Asset roles (hierarchical) Yes (django-mptt) Yes (PostgreSQL ltree, native to NetBox 4.7)
Asset kinds: device, module, rack Yes Yes
Asset kind: inventory item Yes Removed (inventory items are deprecated in NetBox since v4.3)
Inventory item types and groups Yes Removed
Suppliers, purchases, deliveries Yes Removed
Warranty tracking Yes Removed
Audit flows and audit trails Yes Removed
Navigation menu "Inventory" (configurable) Always a top-level "Assets" menu

Limitations

  • Cannot be installed together with netbox-inventory. Both plugins define the same relations on NetBox core models (for example Device.assigned_asset) and the same GraphQL type names. netbox-assets refuses to start if netbox_inventory is also enabled. This is a deliberate simplification.
  • No data migration from netbox-inventory. netbox-assets is meant for a clean installation. It ships its own fresh database migrations and does not read or convert netbox-inventory data.

Compatibility

NetBox netbox-assets
4.7.1 and later 0.1.x

NetBox 4.7 requires Python 3.12 or later, PostgreSQL 15 or later with the ltree extension, and Redis 6 or later.

NetBox 4.7.0 is not supported: the database triggers that maintain hierarchical paths could not be restored from a database dump in that release (netbox#23130).

Features

  • Assets with name, asset tag, serial number, status, role, description, comments, tags, custom fields and images.
  • Each asset has exactly one hardware type: a device type, a module type or a rack type.
  • Assign an asset to a device, module or rack, reassign it or unassign it.
  • Create a new device, module or rack directly from an asset.
  • Storage location, tenant, owning tenant and contact for each asset.
  • Automatic status: stored when an asset is unassigned, used when it is assigned (configurable).
  • Optional synchronization of serial number and asset tag between an asset and the hardware it is assigned to.
  • Bulk add with an asset tag pattern, for example ASSET-[001-010].
  • Bulk import, export, edit and delete.
  • Hierarchical asset roles (for example Optics → SFP) with cumulative asset counts.
  • Asset information on Device, Module and Rack pages, and asset counts on Site, Location, Rack, Tenant, Contact and Manufacturer pages.
  • Global search, REST API and GraphQL API.

Usage

  1. Create an asset. In Assets → Assets, click Add and choose the hardware type (a device type, module type or rack type). Fill in the serial number, asset tag, storage location and so on. This form describes what the hardware is. It does not link the asset to a particular device.

  2. Assign the asset to hardware. Use one of these buttons:

    • Edit Assignment in the Assigned To panel on the asset page;
    • Edit Assignment in the Asset panel on a device, module or rack page;
    • Create Device (or Create Module, Create Rack) on the asset page, to create the hardware and assign the asset in one step.

    When an asset is assigned, its status changes to used. When it is unassigned, its status changes to stored (see Settings).

Assets are displayed as <manufacturer> <model> <name>, for example Cisco ASR edge-01, or as <manufacturer> <model> when the asset has no name. Unnamed assets of the same model look the same in lists and selection fields, so give assets a name if you need to tell them apart.

Installation

Activate the NetBox virtual environment and install the package:

source /opt/netbox/venv/bin/activate
pip install netbox-assets

To keep the plugin installed after NetBox upgrades, add it to local_requirements.txt:

echo netbox-assets >> /opt/netbox/local_requirements.txt

Enable the plugin in /opt/netbox/netbox/netbox/configuration.py:

PLUGINS = [
    'netbox_assets',
]

PLUGINS_CONFIG = {
    'netbox_assets': {},
}

Apply the database migrations, update the search index and restart NetBox:

cd /opt/netbox/netbox
python3 manage.py migrate netbox_assets
python3 manage.py reindex --lazy
sudo systemctl restart netbox netbox-rq

Settings

Override the defaults in PLUGINS_CONFIG:

PLUGINS_CONFIG = {
    'netbox_assets': {
        'used_status_name': 'used',
        'stored_status_name': 'stored',
        'sync_hardware_serial_asset_tag': True,
    },
}
Setting Default Description
used_status_name 'used' Status set when an asset is assigned to a device, module or rack.
used_additional_status_names [] Other statuses that also mean "in use".
stored_status_name 'stored' Status set when an asset is unassigned.
stored_additional_status_names ['retired'] Other statuses that also mean "not in use".
sync_hardware_serial_asset_tag False Keep serial number and asset tag of the assigned device, module or rack in sync with the asset. The device type, module type or rack type is updated as well.
asset_import_create_device_type False When importing assets, create a missing manufacturer and device type.
asset_import_create_module_type False When importing assets, create a missing manufacturer and module type.
asset_import_create_rack_type False When importing assets, create a missing manufacturer and rack type.
asset_import_create_tenant False When importing assets, create a missing tenant (for the tenant and owning tenant fields).
asset_custom_fields_search_filters {} Custom fields and lookups to add to the asset search filters, for example {'asset_mac': ['icontains', 'exact']}.

To disable automatic status changes, set both used_status_name and stored_status_name to None.

Asset statuses

The default statuses are stored, used and retired. You can add your own with the NetBox FIELD_CHOICES setting:

FIELD_CHOICES = {
    'netbox_assets.Asset.status+': (
        ('repair', 'In repair', 'orange'),
    ),
}

If you add statuses, also review used_additional_status_names and stored_additional_status_names.

REST API and GraphQL

REST API endpoints:

Endpoint Description
/api/plugins/assets/assets/ Assets
/api/plugins/assets/asset-roles/ Asset roles
/api/plugins/assets/dcim/devices/ NetBox devices with an extra has_asset_assigned filter
/api/plugins/assets/dcim/modules/ NetBox modules with an extra has_asset_assigned filter

GraphQL queries: asset, asset_list, asset_role, asset_role_list.

Development

The tests use the NetBox test framework. They need a NetBox 4.7 installation with PostgreSQL and Redis, and a database user that is allowed to create the test database. Install the plugin into the NetBox virtual environment in editable mode (pip install -e .) and run:

cd /opt/netbox/netbox
python3 manage.py test netbox_assets.tests --keepdb --parallel 4

NetBox compares the number of database queries of list views with netbox_assets/tests/query_counts.json. If you change a list view or an API serializer on purpose, update the file (this does not work with --parallel):

UPDATE_QUERY_COUNTS=1 python3 manage.py test netbox_assets.tests --keepdb

GitHub Actions run ruff and the test suite against NetBox 4.7.1 and 4.7.2 on every push and pull request.

License

MIT License, see LICENSE.

  • Copyright (c) 2022 Arnes (original netbox-inventory code)
  • Copyright (c) 2026 Maksym Ototiuk (changes in this fork)

You may use, copy, modify and distribute this software for any purpose. It is provided "as is", without warranty of any kind, and the authors are not liable for any damage caused by its use.

Metadata

Release files for netbox-assets 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for netbox-assets 0.1.0
File Size Uploaded
netbox_assets-0.1.0.tar.gz 51.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for netbox-assets 0.1.0
File Interpreter ABI Platform
netbox_assets-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 121.8 kB

Release files / netbox_assets-0.1.0.tar.gz

Download URL netbox_assets-0.1.0.tar.gz
Size 51.4 kB
Tags Source
SHA-256 checksum
How to use checksums
7d9365e76bc8bdbe3792f6cee4b83fd0e3d190a238955870c2f9b23b37ceb70b
BLAKE2b-256 checksum
How to use checksums
6a9f5b062511f35bdb66c06f3faa250b7913dd7f9215cb53161afa8debde1e27
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Sep 30, 2026.

Transparency log

Release files / netbox_assets-0.1.0-py3-none-any.whl

Download URL netbox_assets-0.1.0-py3-none-any.whl
Size 70.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8c5ba6da226fbedd094a4fecb74c1e13748fd8b9a74103f6b546bede302f9c30
BLAKE2b-256 checksum
How to use checksums
42d300ecd7666c1e51b73457193f1ad6fb827c6095af789f5e2643b9f9839d14
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Sep 30, 2026.

Transparency log

Release history Release notifications | RSS feed

1.1.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page