NetBox plugin for custom API dashboard widgets - call any API and display results
Project description
NetBox Custom Widget
A NetBox plugin that provides configurable dashboard widgets for calling external APIs and displaying results. Similar to Homepage's Custom API widget.
Features
- Call any HTTP API endpoint (GET/POST) and display JSON results on your NetBox dashboard
- Configurable field mappings with dot-notation for nested JSON access
- Auto-refresh via HTMX at configurable intervals
- Multiple display modes: list, block, grid, table
- Three color systems: adaptive (keyword-based), static (fixed), threshold (numeric ranges)
- Pre-define endpoints in plugin configuration for automatic provisioning
- Full CRUD interface for managing API endpoints
- Custom link button on each widget
Installation
pip install netbox-custom-widget
Add to your NetBox configuration:
PLUGINS = ['netbox_custom_widget']
Configuration
Define API endpoints in your plugins.py:
PLUGINS_CONFIG = {
'netbox_custom_widget': {
'verify_ssl': False,
'endpoints': [
{
'name': 'My API Status',
'url': 'https://api.example.com/status',
'headers': {'Authorization': 'Bearer token123'},
'mappings': [
{'field': 'status', 'label': 'Status', 'color': 'adaptive'},
{'field': 'uptime', 'label': 'Uptime', 'suffix': 'hours'},
],
'display_mode': 'list',
'refresh_interval': 30,
'link': 'https://api.example.com/dashboard',
},
],
}
}
Display Modes
| Mode | Description | Best For |
|---|---|---|
list |
Label on left, value/badge on right | Process status, key-value pairs |
block |
Large centered badge with label below | Single metrics, ticket counts |
grid |
PRTG-style badges side-by-side | Multi-metric summaries |
table |
Standard table layout | Tabular data |
Color Options
Adaptive ("color": "adaptive")
Automatically colors based on keywords in the value text:
| Keywords | Color |
|---|---|
| active, insvc, in service | Blue |
| up, ok, running, online, healthy, on duty | Green |
| down, isolated, error, failed, offline, critical | Red |
| standby, idle, not active, configured, warning, degraded, paused | Orange |
Static ("color": "<name>")
Fixed color applied to the field. Available names: success (green), warning (orange), danger (red), info (cyan), primary (blue), secondary (muted).
Threshold ("color": "threshold")
Numeric range-based coloring. Rules are evaluated top-to-bottom, first match wins:
{
'field': 'ticket_count',
'label': 'Open Tickets',
'color': 'threshold',
'thresholds': [
{'lt': 5, 'color': 'green'}, # < 5: green
{'lt': 15, 'color': 'orange'}, # < 15: orange
{'color': 'red'}, # default: red
],
}
Supports lt (less than) and gt (greater than). Available colors: red, orange, green, blue, cyan, purple, yellow.
Mapping Options
Each mapping in the mappings array supports:
| Key | Type | Description |
|---|---|---|
field |
string | Required. Dot-notation path to JSON value (e.g., "data.status", "0.name") |
label |
string | Display label |
additional_field |
string | Second field shown on same row |
color |
string | "adaptive", "threshold", or a static color name |
thresholds |
array | Threshold rules (when color is "threshold") |
format |
string | "text" (default) or "number" (adds comma separators) |
suffix |
string | Appended text (e.g., "hours", "ms") |
Endpoint Fields
| Field | Type | Default | Description |
|---|---|---|---|
name |
string | Required. Display name (also used as widget title) | |
url |
string | Required. API endpoint URL (max 2000 chars) | |
http_method |
string | GET |
GET or POST |
headers |
dict | {} |
Custom HTTP headers |
body |
string | "" |
Request body (POST only) |
mappings |
array | [] |
Field mapping configuration |
display_mode |
string | list |
list, block, grid, or table |
refresh_interval |
int | 30 |
Auto-refresh seconds (0 to disable) |
verify_ssl |
bool | true |
Verify SSL certificates |
timeout |
int | 30 |
Request timeout seconds |
link |
string | "" |
Custom URL button on widget |
description |
string | "" |
Optional notes |
Examples
Single Number Widget (Block Mode)
Display a single metric as a large centered badge — ideal for ticket counts, sensor totals, or any numeric KPI:
{
'name': 'JIRA Open Tickets',
'url': 'https://api.example.com/tickets/count',
'headers': {'Authorization': 'Bearer token123'},
'mappings': [
{
'field': 'total',
'label': 'Open Tickets',
'color': 'threshold',
'thresholds': [
{'lt': 5, 'color': 'green'},
{'lt': 15, 'color': 'orange'},
{'color': 'red'},
],
},
],
'display_mode': 'block',
'refresh_interval': 30,
'link': 'https://jira.example.com/dashboard',
}
This renders a large color-coded badge with the count, and "Open Tickets" label underneath. The widget title auto-populates from the endpoint name.
Multi-Metric Summary (Grid Mode)
Display multiple counts side-by-side with PRTG-style badges:
{
'name': 'Ticket Summary',
'url': 'https://api.example.com/tickets/summary',
'mappings': [
{'field': 'total', 'label': 'Total', 'color': 'threshold',
'thresholds': [{'lt': 5, 'color': 'green'}, {'lt': 15, 'color': 'orange'}, {'color': 'red'}]},
{'field': 'in_progress', 'label': 'In Progress', 'color': 'primary'},
{'field': 'waiting', 'label': 'Waiting', 'color': 'warning'},
],
'display_mode': 'grid',
'refresh_interval': 60,
}
Process Status Monitoring (List Mode)
Monitor services with adaptive color coding:
{
'name': 'Server Processes',
'url': 'https://api.example.com/processes',
'mappings': [
{'field': '0.name', 'additional_field': '0.status', 'color': 'adaptive'},
{'field': '1.name', 'additional_field': '1.status', 'color': 'adaptive'},
],
'display_mode': 'list',
'refresh_interval': 5,
}
Status values like "Active", "Running", "Down", or "Standby" are automatically color-coded.
Requirements
- NetBox >= 4.0.0
- Python >= 3.10
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file netbox_custom_widget-0.3.0.tar.gz.
File metadata
- Download URL: netbox_custom_widget-0.3.0.tar.gz
- Upload date:
- Size: 17.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0cca744e5499821327ef844efa63f92077b4d1e980e4b1dd113202a76505122e
|
|
| MD5 |
1239fcb07765c31838572ad979b2ec74
|
|
| BLAKE2b-256 |
0c2053ce22011a33a0062a6170604849abce8784e2bcb3474cec42deab6cee06
|
Provenance
The following attestation bundles were made for netbox_custom_widget-0.3.0.tar.gz:
Publisher:
release.yml on sieteunoseis/netbox-custom-widget
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
netbox_custom_widget-0.3.0.tar.gz -
Subject digest:
0cca744e5499821327ef844efa63f92077b4d1e980e4b1dd113202a76505122e - Sigstore transparency entry: 1002746330
- Sigstore integration time:
-
Permalink:
sieteunoseis/netbox-custom-widget@4c0873592768a4ab9c4cbb6b5e705f42db944215 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/sieteunoseis
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4c0873592768a4ab9c4cbb6b5e705f42db944215 -
Trigger Event:
push
-
Statement type:
File details
Details for the file netbox_custom_widget-0.3.0-py3-none-any.whl.
File metadata
- Download URL: netbox_custom_widget-0.3.0-py3-none-any.whl
- Upload date:
- Size: 21.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
81220c8616f7af9457ba2fba6466bd8898f97fc95a23a1ee5f1772a7eac8f783
|
|
| MD5 |
3d03b4f621338e49a514bb9dde361b66
|
|
| BLAKE2b-256 |
97503bad45c9084ff2c2453ab176cc6652adc5abd86a4a3a3122e90aef3c8079
|
Provenance
The following attestation bundles were made for netbox_custom_widget-0.3.0-py3-none-any.whl:
Publisher:
release.yml on sieteunoseis/netbox-custom-widget
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
netbox_custom_widget-0.3.0-py3-none-any.whl -
Subject digest:
81220c8616f7af9457ba2fba6466bd8898f97fc95a23a1ee5f1772a7eac8f783 - Sigstore transparency entry: 1002746334
- Sigstore integration time:
-
Permalink:
sieteunoseis/netbox-custom-widget@4c0873592768a4ab9c4cbb6b5e705f42db944215 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/sieteunoseis
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4c0873592768a4ab9c4cbb6b5e705f42db944215 -
Trigger Event:
push
-
Statement type: