System#
Appliance health, status, hardware inventory, and network interface table.
9 operations. Roles, error format and pagination are common to the whole API — see the REST API overview.
Authentication
Use a named bearer token. Every endpoint except POST /api/v1/auth/login,
POST /api/v1/auth/enrol and GET /api/v1/system/health requires one. A super-user creates a
token with POST /api/v1/auth/tokens; the plaintext (bngtok_…) is returned exactly once at
creation and only a SHA-256 hash is stored on the appliance, so a lost token is replaced rather
than recovered. Send it on every request:
Each token carries a fixed role (read-only, operator or super-user) and is exempt from CSRF
checks. This is the single credential you need for scripts, integrations and monitoring.
Accounts and tokens share one identity model with the appliance CLI (login.users). Repeated
authentication failures lock the account/source-IP pair out temporarily (HTTP 423 on login).
Session cookies (bundled web UI only)
The appliance also accepts an interactive session cookie, which is how the bundled web UI authenticates. It is documented for completeness — API clients should not use it. It is bound to a login session and obliges the caller to manage a CSRF token, neither of which suits automation.
POST /api/v1/auth/login with username + password (and a TOTP code when enrolled) sets the
bng_session cookie and returns a csrfToken (also available from GET /api/v1/auth/whoami).
Cookie-authenticated mutating requests (anything other than GET/HEAD/OPTIONS) must also send
that value in the X-CSRF-Token header or they are rejected with 403.
NetavoBNG Management API v1#
System#
POST /api/v1/diagnostics/inject#
Inject a synthetic packet at ingress and report what the pipeline does with it.
Description
Enters the pipeline where received traffic does, so unlike ping it reaches punt classification, MPLS pop, source-VRF classification, uRPF, CGN, session lookup and QoS.
By default this is a DRY RUN: the packet traverses everything and is dropped at the egress
staging point, so a forwarding question can be asked of a live customer VRF without putting
a frame on anyone's wire. Set `emit` to actually transmit — that sends an operator-chosen
frame out a real port, and is audited as such. Operator role or above.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
bearerToken |
header | string | N/A | No | Named API token — the recommended credential for automation. See Authentication in the API overview. |
Request body
{
"port": 1,
"source": "172.31.224.233",
"destination": "10.254.0.12",
"sVlan": null,
"cVlan": null,
"mplsLabel": 100,
"protocol": 17,
"sourcePort": 5000,
"destinationPort": 53,
"size": 32,
"emit": false
}
Other accepted types: application/*+json, text/json
Schema of the request body
{
"required": [
"port",
"source",
"destination",
"sVlan",
"cVlan",
"mplsLabel",
"protocol",
"sourcePort",
"destinationPort",
"size",
"emit"
],
"type": "object",
"properties": {
"port": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Ingress port index to pretend the frame arrived on.",
"format": "int32"
},
"source": {
"type": "string",
"description": "Source address. What a source-VRF rule matches on."
},
"destination": {
"type": "string",
"description": "Destination address."
},
"sVlan": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Outer S-VLAN (0/null = none).",
"format": "int32",
"nullable": true
},
"cVlan": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Inner C-VLAN (0/null = none).",
"format": "int32",
"nullable": true
},
"mplsLabel": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "L3VPN label to arrive under (0/null = none).",
"format": "int64",
"nullable": true
},
"protocol": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "IP protocol number; 17 = UDP, 6 = TCP, 1 = ICMP.",
"format": "int32",
"nullable": true
},
"sourcePort": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "L4 source port for TCP/UDP.",
"format": "int32",
"nullable": true
},
"destinationPort": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "L4 destination port for TCP/UDP.",
"format": "int32",
"nullable": true
},
"size": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Payload bytes after the L4 header.",
"format": "int32",
"nullable": true
},
"emit": {
"type": "boolean",
"description": "Actually transmit. Default false — trace and drop before egress.",
"nullable": true
}
},
"description": "POST /api/v1/diagnostics/inject body — a packet described, not hex-encoded.",
"example": {
"port": 1,
"source": "172.31.224.233",
"destination": "10.254.0.12",
"sVlan": null,
"cVlan": null,
"mplsLabel": 100,
"protocol": 17,
"sourcePort": 5000,
"destinationPort": 53,
"size": 32,
"emit": false
}
}
Responses
{
"frameBytes": 82,
"emitted": false,
"dryRun": true,
"steps": [
{
"stage": "SourceVrf",
"verdict": "Ok",
"a": 7,
"b": 16
}
]
}
Schema of the response body
{
"required": [
"frameBytes",
"emitted",
"dryRun",
"steps"
],
"type": "object",
"properties": {
"frameBytes": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Size of the frame that was built.",
"format": "int32"
},
"emitted": {
"type": "boolean",
"description": "True if it was actually transmitted rather than traced and dropped."
},
"dryRun": {
"type": "boolean",
"description": "True when the packet was dropped before egress."
},
"steps": {
"type": "array",
"items": {
"$ref": "#/components/schemas/TraceStep"
},
"description": "Per-stage decisions, in the order the pipeline took them."
}
},
"description": "What the data plane did with an injected packet.",
"example": {
"frameBytes": 82,
"emitted": false,
"dryRun": true,
"steps": [
{
"stage": "SourceVrf",
"verdict": "Ok",
"a": 7,
"b": 16
}
]
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
POST /api/v1/diagnostics/ping#
Ping from the data plane, optionally inside a VRF.
Description
Originated by the forwarding plane, not the host: a service VRF carries no kernel
addresses, so the host cannot source a packet in one at all. The reply traverses the full
ingress path. A payload larger than the path MTU with dontFragment set is sent
deliberately — "would fragment" is a result, not an input error. Operator role or above;
local appliance only (the fleet proxy is GET-only).
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
bearerToken |
header | string | N/A | No | Named API token — the recommended credential for automation. See Authentication in the API overview. |
Request body
{
"destination": "192.0.2.50",
"vrf": "cust-alt-jat",
"source": null,
"count": 5,
"size": 56,
"dontFragment": false,
"ttl": 64,
"timeoutMs": 1000
}
Other accepted types: application/*+json, text/json
Schema of the request body
{
"required": [
"destination",
"vrf",
"source",
"count",
"size",
"dontFragment",
"ttl",
"timeoutMs"
],
"type": "object",
"properties": {
"destination": {
"type": "string",
"description": "Address to ping, IPv4 or IPv6."
},
"vrf": {
"type": "string",
"description": "VRF to send from; omit for the default table.",
"nullable": true
},
"source": {
"type": "string",
"description": "Address to source from; defaults to that VRF's configured gateway.",
"nullable": true
},
"count": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Number of echoes (capped).",
"format": "int32",
"nullable": true
},
"size": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "ICMP payload bytes (capped).",
"format": "int32",
"nullable": true
},
"dontFragment": {
"type": "boolean",
"description": "Set DF. Ignored for IPv6, which never fragments in transit.",
"nullable": true
},
"ttl": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "TTL / hop limit.",
"format": "int32",
"nullable": true
},
"timeoutMs": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Per-probe wait.",
"format": "int32",
"nullable": true
}
},
"description": "POST /api/v1/diagnostics/ping body.",
"example": {
"destination": "192.0.2.50",
"vrf": "cust-alt-jat",
"source": null,
"count": 5,
"size": 56,
"dontFragment": false,
"ttl": 64,
"timeoutMs": 1000
}
}
Responses
{
"destination": "192.0.2.50",
"source": "10.254.0.14",
"vrf": "cust-alt-jat",
"sent": 5,
"received": 5,
"minMs": 0.9,
"avgMs": 1.2,
"maxMs": 1.8,
"probes": [
{
"sequence": 1,
"rttMs": 1.24,
"ttl": 62
}
]
}
Schema of the response body
{
"required": [
"destination",
"source",
"vrf",
"sent",
"received",
"minMs",
"avgMs",
"maxMs",
"probes"
],
"type": "object",
"properties": {
"destination": {
"type": "string",
"description": "Address pinged."
},
"source": {
"type": "string",
"description": "Address actually sourced from — worth reporting, since a VRF gateway in\n documentation space may never see a reply."
},
"vrf": {
"type": "string",
"description": "VRF used, or null for the default table.",
"nullable": true
},
"sent": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Echoes sent.",
"format": "int32"
},
"received": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Replies matched.",
"format": "int32"
},
"minMs": {
"pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
"description": "Fastest round trip.",
"format": "double",
"nullable": true
},
"avgMs": {
"pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
"description": "Mean round trip.",
"format": "double",
"nullable": true
},
"maxMs": {
"pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
"description": "Slowest round trip.",
"format": "double",
"nullable": true
},
"probes": {
"type": "array",
"items": {
"$ref": "#/components/schemas/PingProbe"
},
"description": "Per-probe detail."
}
},
"description": "The result of a ping run.",
"example": {
"destination": "192.0.2.50",
"source": "10.254.0.14",
"vrf": "cust-alt-jat",
"sent": 5,
"received": 5,
"minMs": 0.9,
"avgMs": 1.2,
"maxMs": 1.8,
"probes": [
{
"sequence": 1,
"rttMs": 1.24,
"ttl": 62
}
]
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
GET /api/v1/system/hardware#
Hardware inventory.
Description
CPU, memory, storage, board and NIC inventory. Static — gathered once and cached
until POST /api/v1/system/hardware/refresh. Fields a platform cannot provide are null.
Fleet-proxyable.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
bearerToken |
header | string | N/A | No | Named API token — the recommended credential for automation. See Authentication in the API overview. |
Responses
{
"cpu": {
"model": "Intel(R) Xeon(R) Gold 6338N CPU @ 2.20GHz",
"vendor": "GenuineIntel",
"sockets": 2,
"cores": 32,
"threads": 64,
"mhz": 2194.867,
"numaNodes": 2,
"flags": [
"sse4_2",
"avx2",
"aes"
]
},
"memory": {
"totalBytes": 135223480320,
"numaNodes": [
{
"node": 0,
"totalBytes": 67611740160
},
{
"node": 1,
"totalBytes": 67611740160
}
],
"hugepages": [
{
"sizeKb": 1048576,
"total": 32,
"free": 8
}
]
},
"storage": {
"blockDevices": [
{
"name": "nvme0n1",
"model": "SAMSUNG MZQL2960HCJR-00A07",
"sizeBytes": 960197124096,
"rotational": false,
"transport": "nvme"
}
],
"filesystems": [
{
"mountPoint": "/",
"fsType": "ext4",
"totalBytes": 491921162240,
"availableBytes": 463138689024
}
]
},
"board": {
"systemVendor": "Supermicro",
"systemProduct": "SYS-111C-NR",
"boardVendor": "Supermicro",
"boardProduct": "X13SEI-F",
"biosVendor": "American Megatrends International, LLC.",
"biosVersion": "1.4",
"biosDate": "05/22/2025"
},
"nics": [
{
"pciAddress": "0000:5e:00.0",
"vendorId": "0x8086",
"deviceId": "0x1572",
"vendorName": "Intel Corporation",
"model": "Ethernet Controller X710 for 10GbE SFP+",
"driver": "vfio-pci",
"numaNode": 0,
"kernelInterface": null
}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"cpu": {
"$ref": "#/components/schemas/CpuInfo"
},
"memory": {
"$ref": "#/components/schemas/MemoryInfo"
},
"storage": {
"$ref": "#/components/schemas/StorageInfo"
},
"board": {
"$ref": "#/components/schemas/BoardInfo"
},
"nics": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Nic"
}
}
},
"description": "GET /api/v1/system/hardware — static inventory, cached until refresh.",
"example": {
"cpu": {
"model": "Intel(R) Xeon(R) Gold 6338N CPU @ 2.20GHz",
"vendor": "GenuineIntel",
"sockets": 2,
"cores": 32,
"threads": 64,
"mhz": 2194.867,
"numaNodes": 2,
"flags": [
"sse4_2",
"avx2",
"aes"
]
},
"memory": {
"totalBytes": 135223480320,
"numaNodes": [
{
"node": 0,
"totalBytes": 67611740160
},
{
"node": 1,
"totalBytes": 67611740160
}
],
"hugepages": [
{
"sizeKb": 1048576,
"total": 32,
"free": 8
}
]
},
"storage": {
"blockDevices": [
{
"name": "nvme0n1",
"model": "SAMSUNG MZQL2960HCJR-00A07",
"sizeBytes": 960197124096,
"rotational": false,
"transport": "nvme"
}
],
"filesystems": [
{
"mountPoint": "/",
"fsType": "ext4",
"totalBytes": 491921162240,
"availableBytes": 463138689024
}
]
},
"board": {
"systemVendor": "Supermicro",
"systemProduct": "SYS-111C-NR",
"boardVendor": "Supermicro",
"boardProduct": "X13SEI-F",
"biosVendor": "American Megatrends International, LLC.",
"biosVersion": "1.4",
"biosDate": "05/22/2025"
},
"nics": [
{
"pciAddress": "0000:5e:00.0",
"vendorId": "0x8086",
"deviceId": "0x1572",
"vendorName": "Intel Corporation",
"model": "Ethernet Controller X710 for 10GbE SFP+",
"driver": "vfio-pci",
"numaNode": 0,
"kernelInterface": null
}
]
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
POST /api/v1/system/hardware/refresh#
Re-gather the hardware inventory.
Description
Invalidates the cached inventory so the next read reflects hardware changes. Operator role or above.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
bearerToken |
header | string | N/A | No | Named API token — the recommended credential for automation. See Authentication in the API overview. |
Responses
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
GET /api/v1/system/health#
Liveness probe.
Description
Unauthenticated (the only anonymous GET on the API) — for load balancers and
monitoring. Answers whenever the control plane can serve requests; use
GET /api/v1/system/status for real health detail (data plane, memory, disk).
Responses
GET /api/v1/system/info#
What product this API belongs to, and what it can serve.
Description
The counterpart of the NetavoVPE management plane's identical endpoint, so a client — the shared web UI in particular — discovers which product it is talking to POSITIVELY rather than inferring it from which endpoints 404.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
bearerToken |
header | string | N/A | No | Named API token — the recommended credential for automation. See Authentication in the API overview. |
Responses
{
"product": "netavo-vpe",
"version": "1.0.0",
"hostname": "vpe-cpe1",
"features": [
"routing",
"vrfs",
"gre-circuits",
"configuration",
"logs"
]
}
Schema of the response body
{
"required": [
"product",
"version",
"hostname",
"features"
],
"type": "object",
"properties": {
"product": {
"type": "string",
"description": "Package identity: `netavo-bng` or `netavo-vpe`."
},
"version": {
"type": "string",
"description": "Running software version."
},
"hostname": {
"type": "string",
"description": "Configured hostname."
},
"features": {
"type": "array",
"items": {
"type": "string"
},
"description": "Capability tags the client may branch on, e.g. `gre-circuits`."
}
},
"description": "What product a management API belongs to, and what it can serve.\n\nBoth hosts answer `GET /api/v1/system/info` with this, so a client discovers what it is\ntalking to POSITIVELY — rather than inferring it from which endpoints 404, which is how a UI\nends up showing an operator a page that cannot work. The shared web UI uses it to decide which\nnavigation sections apply.",
"example": {
"product": "netavo-vpe",
"version": "1.0.0",
"hostname": "vpe-cpe1",
"features": [
"routing",
"vrfs",
"gre-circuits",
"configuration",
"logs"
]
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
GET /api/v1/system/interfaces#
Network interface table.
Description
All host interfaces with state, speed, addresses and counters, including data-plane ports (whose link state comes from the data plane when the kernel cannot see them). Fleet-proxyable.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
bearerToken |
header | string | N/A | No | Named API token — the recommended credential for automation. See Authentication in the API overview. |
Responses
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
POST /api/v1/system/restart#
Restart the control plane and data plane.
Description
For config changes marked "restart required" that can't be hot-applied. Drops all active sessions immediately; established subscriber sessions re-establish on their own once the appliance is back up. Not fleet-proxyable — always acts on the box actually serving the request, never a remote appliance selected in the fleet view. Admin role required.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
bearerToken |
header | string | N/A | No | Named API token — the recommended credential for automation. See Authentication in the API overview. |
Responses
{
"status": "restarting",
"message": "Restarting the control plane and data plane now. Active sessions will drop and re-establish automatically."
}
Schema of the response body
{
"required": [
"status",
"message"
],
"type": "object",
"properties": {
"status": {
"type": "string",
"description": "Always \"restarting\" — the request was accepted."
},
"message": {
"type": "string",
"description": "Human-readable detail for display."
}
},
"description": "POST /api/v1/system/restart result.",
"example": {
"status": "restarting",
"message": "Restarting the control plane and data plane now. Active sessions will drop and re-establish automatically."
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
GET /api/v1/system/status#
Appliance status: host health + control-plane/data-plane state.
Description
Hostname, uptime, OS/kernel, load, memory, root filesystem, control-plane version/uptime, and live data-plane state (running, heartbeat age, PAL backend). The data-plane block reflects shared-memory liveness when available; this endpoint never errors over a dead data plane — reporting that is its purpose. Fleet-proxyable.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
bearerToken |
header | string | N/A | No | Named API token — the recommended credential for automation. See Authentication in the API overview. |
Responses
{
"hostname": "lns1-hul1",
"systemUptimeSeconds": 1042318.72,
"osDescription": "Debian GNU/Linux 13 (trixie)",
"kernelVersion": "6.12.32-amd64",
"loadAverages": [
1.42,
1.31,
1.28
],
"memoryTotalBytes": 135223480320,
"memoryAvailableBytes": 118429581312,
"rootFsTotalBytes": 491921162240,
"rootFsAvailableBytes": 463138689024,
"controlPlane": {
"uptimeSeconds": 86412.538912,
"version": "1.4.0",
"drainState": "normal"
},
"dataPlane": {
"running": true,
"heartbeatAgeSeconds": 0.184,
"palBackend": "dpdk"
}
}
Schema of the response body
{
"type": "object",
"properties": {
"hostname": {
"type": "string",
"description": "OS hostname of the appliance (kernel hostname, not webUi.hostname).",
"nullable": true
},
"systemUptimeSeconds": {
"pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
"format": "double",
"nullable": true
},
"osDescription": {
"type": "string",
"nullable": true
},
"kernelVersion": {
"type": "string",
"nullable": true
},
"loadAverages": {
"type": "array",
"items": {
"pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
"format": "double"
},
"nullable": true
},
"memoryTotalBytes": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int64",
"nullable": true
},
"memoryAvailableBytes": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int64",
"nullable": true
},
"rootFsTotalBytes": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int64",
"nullable": true
},
"rootFsAvailableBytes": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int64",
"nullable": true
},
"controlPlane": {
"$ref": "#/components/schemas/ControlPlaneStatus"
},
"dataPlane": {
"$ref": "#/components/schemas/DataPlaneStatus"
}
},
"description": "GET /api/v1/system/status — dynamic health, poll/stream-friendly.",
"example": {
"hostname": "lns1-hul1",
"systemUptimeSeconds": 1042318.72,
"osDescription": "Debian GNU/Linux 13 (trixie)",
"kernelVersion": "6.12.32-amd64",
"loadAverages": [
1.42,
1.31,
1.28
],
"memoryTotalBytes": 135223480320,
"memoryAvailableBytes": 118429581312,
"rootFsTotalBytes": 491921162240,
"rootFsAvailableBytes": 463138689024,
"controlPlane": {
"uptimeSeconds": 86412.538912,
"version": "1.4.0",
"drainState": "normal"
},
"dataPlane": {
"running": true,
"heartbeatAgeSeconds": 0.184,
"palBackend": "dpdk"
}
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
Schemas#
BlockDevice#
| Name | Type | Description |
|---|---|---|
model |
string | null | |
name |
string | |
rotational |
boolean | null | |
sizeBytes |
||
transport |
string | null | Best-effort transport classification: nvme / scsi / virtio / mmc. |
BoardInfo#
| Name | Type | Description |
|---|---|---|
biosDate |
string | null | |
biosVendor |
string | null | |
biosVersion |
string | null | |
boardProduct |
string | null | |
boardVendor |
string | null | |
systemProduct |
string | null | |
systemVendor |
string | null |
ControlPlaneStatus#
| Name | Type | Description |
|---|---|---|
drainState |
string | Placeholder until drain orchestration exists; always "normal" for now. |
uptimeSeconds |
||
version |
string | null | Informational assembly version of the control plane build. |
CpuInfo#
| Name | Type | Description |
|---|---|---|
cores |
||
flags |
Array<string> | Curated subset of CPU flags relevant to the BNG (sse4_2 for the CRC32C ECMP path, avx2, aes) — never the full flag soup. |
mhz |
||
model |
string | null | |
numaNodes |
||
sockets |
||
threads |
||
vendor |
string | null |
DataPlaneStatus#
| Name | Type | Description |
|---|---|---|
heartbeatAgeSeconds |
||
palBackend |
string | PAL backend: dpdk / af_xdp / mock (config dataPlane.mode). |
running |
boolean |
Filesystem#
| Name | Type | Description |
|---|---|---|
availableBytes |
||
fsType |
string | null | |
mountPoint |
string | |
totalBytes |
HardwareInventory#
| Name | Type | Description |
|---|---|---|
board |
BoardInfo | |
cpu |
CpuInfo | |
memory |
MemoryInfo | |
nics |
Array<Nic> | |
storage |
StorageInfo |
HardwareRefreshResult#
| Name | Type | Description |
|---|---|---|
refreshed |
boolean | Always true — the cached inventory was invalidated. |
Health#
| Name | Type | Description |
|---|---|---|
status |
string | Always "ok" while the control plane can serve requests. |
HugepagePool#
| Name | Type | Description |
|---|---|---|
free |
||
sizeKb |
||
total |
InjectRequest#
| Name | Type | Description |
|---|---|---|
cVlan |
Inner C-VLAN (0/null = none). | |
destination |
string | Destination address. |
destinationPort |
L4 destination port for TCP/UDP. | |
emit |
boolean | null | Actually transmit. Default false — trace and drop before egress. |
mplsLabel |
L3VPN label to arrive under (0/null = none). | |
port |
Ingress port index to pretend the frame arrived on. | |
protocol |
IP protocol number; 17 = UDP, 6 = TCP, 1 = ICMP. | |
size |
Payload bytes after the L4 header. | |
source |
string | Source address. What a source-VRF rule matches on. |
sourcePort |
L4 source port for TCP/UDP. | |
sVlan |
Outer S-VLAN (0/null = none). |
InjectResult#
| Name | Type | Description |
|---|---|---|
dryRun |
boolean | True when the packet was dropped before egress. |
emitted |
boolean | True if it was actually transmitted rather than traced and dropped. |
frameBytes |
Size of the frame that was built. | |
steps |
Array<TraceStep> | Per-stage decisions, in the order the pipeline took them. |
Interface#
| Name | Type | Description |
|---|---|---|
driver |
string | null | |
label |
string | null | Operator label from dataPlane.*Interfaces[].label ("MS3 NNI 2", ...). |
mac |
string | null | |
mtu |
||
name |
string | |
operState |
string | null | |
owner |
string | dataplane | kernel | kernel-vrf. |
pciAddress |
string | null | |
role |
string | subscriber | network | management | loopback | other (derived from config). |
speedMbps |
||
vrfMaster |
string | null | VRF master device name when owner is kernel-vrf. |
MemoryInfo#
| Name | Type | Description |
|---|---|---|
hugepages |
Array<HugepagePool> | |
numaNodes |
Array<NumaNodeMemory> | |
totalBytes |
Nic#
| Name | Type | Description |
|---|---|---|
deviceId |
string | null | Raw PCI device id, e.g. "0x1572". |
driver |
string | null | Kernel driver in use ("vfio-pci" = DPDK-bound). |
kernelInterface |
string | null | Kernel netdev name bound to this PCI function, if any. |
model |
string | null | Friendly device/chipset model, e.g. "Ethernet Controller X710 for 10GbE SFP+". |
numaNode |
||
pciAddress |
string | |
vendorId |
string | null | Raw PCI vendor id, e.g. "0x8086". |
vendorName |
string | null | Friendly vendor name resolved from pci.ids / built-ins, e.g. "Intel Corporation". |
NumaNodeMemory#
| Name | Type | Description |
|---|---|---|
node |
||
totalBytes |
PingProbe#
| Name | Type | Description |
|---|---|---|
rttMs |
Round-trip time in milliseconds, or null if nothing returned. | |
sequence |
1-based sequence number. | |
ttl |
TTL / hop limit the reply carried, or null. |
PingRequest#
| Name | Type | Description |
|---|---|---|
count |
Number of echoes (capped). | |
destination |
string | Address to ping, IPv4 or IPv6. |
dontFragment |
boolean | null | Set DF. Ignored for IPv6, which never fragments in transit. |
size |
ICMP payload bytes (capped). | |
source |
string | null | Address to source from; defaults to that VRF's configured gateway. |
timeoutMs |
Per-probe wait. | |
ttl |
TTL / hop limit. | |
vrf |
string | null | VRF to send from; omit for the default table. |
PingResult#
| Name | Type | Description |
|---|---|---|
avgMs |
Mean round trip. | |
destination |
string | Address pinged. |
maxMs |
Slowest round trip. | |
minMs |
Fastest round trip. | |
probes |
Array<PingProbe> | Per-probe detail. |
received |
Replies matched. | |
sent |
Echoes sent. | |
source |
string | Address actually sourced from — worth reporting, since a VRF gateway in documentation space may never see a reply. |
vrf |
string | null | VRF used, or null for the default table. |
ProblemDetails#
| Name | Type | Description |
|---|---|---|
detail |
string | null | |
instance |
string | null | |
status |
||
title |
string | null | |
type |
string | null |
ProductInfo#
| Name | Type | Description |
|---|---|---|
features |
Array<string> | Capability tags the client may branch on, e.g. `gre-circuits`. |
hostname |
string | Configured hostname. |
product |
string | Package identity: `netavo-bng` or `netavo-vpe`. |
version |
string | Running software version. |
RestartResult#
| Name | Type | Description |
|---|---|---|
message |
string | Human-readable detail for display. |
status |
string | Always "restarting" — the request was accepted. |
StorageInfo#
| Name | Type | Description |
|---|---|---|
blockDevices |
Array<BlockDevice> | |
filesystems |
Array<Filesystem> |
SystemStatus#
| Name | Type | Description |
|---|---|---|
controlPlane |
ControlPlaneStatus | |
dataPlane |
DataPlaneStatus | |
hostname |
string | null | OS hostname of the appliance (kernel hostname, not webUi.hostname). |
kernelVersion |
string | null | |
loadAverages |
Array<> | |
memoryAvailableBytes |
||
memoryTotalBytes |
||
osDescription |
string | null | |
rootFsAvailableBytes |
||
rootFsTotalBytes |
||
systemUptimeSeconds |
TraceStep#
| Name | Type | Description |
|---|---|---|
a |
||
b |
||
stage |
string | |
verdict |
string |
Security schemes#
| Name | Type | Scheme | Description |
|---|---|---|---|
| bearerToken | http | bearer | Named API token — the recommended credential for automation. See Authentication in the API overview. |
| sessionCookie | apiKey | Interactive session cookie used by the bundled web UI. Not the integration path for API clients — use a bearer token. See Authentication in the API overview. |
Tags#
| Name | Description |
|---|---|
| System | Appliance health, status, hardware inventory, and network interface table. |