System#
Appliance health, status, hardware inventory, and network interface table.
21 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.
One endpoint refuses the cookie outright: GET /api/v1/metrics, the Prometheus scrape, accepts a
bearer token only, so that a scraper can never keep a login session alive.
NetavoBNG Management API v1#
System#
GET /api/v1/dataplane/drops#
Packets the data plane dropped, by reason and by pipeline stage.
Description
Cumulative since the data plane started. reasons are why (total counts every
forwarding drop; the named reasons are subsets and other is the remainder), sites are
where in the pipeline the same packets were when they were dropped, and other lists
losses outside the forwarding decision that total does not include. Counters at zero are
left out unless all=true. available: false means the statistics cannot be read (the
data plane is not running). The reasons from cgn-untranslatable on — what CG-NAT refused
and why, no session, no route, malformed, TTL and the rest — are kept by the data plane
itself and asked for on each request; when it does not answer they are left out, their
drops are in other, and detailNote says why. reassembly (#250) is asked for the same
way: how many outer-fragmented L2TP datagrams were put back together, why the rest were
lost (the losses tunnel-fragments counts), and which peers fragment. 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. |
all |
query | boolean | False | No | Include counters that are at zero. |
Responses
{
"available": true,
"reasons": [
{
"name": "total",
"packets": 812,
"meaning": "every forwarding-decision drop; the reasons below are subsets of it"
},
{
"name": "cgn-untranslatable",
"packets": 800,
"meaning": "CG-NAT cannot translate it: a TCP/UDP source port of 0, or a transport header cut short"
}
],
"sites": [
{
"name": "core-downstream",
"packets": 790,
"meaning": "from the core toward subscribers, including traffic for an address no session owns"
}
],
"other": [
{
"name": "punt-rate",
"packets": 12,
"meaning": "a punt rule's own rate limit discarded traffic for the box (show punt has the rule)"
}
],
"detailNote": null,
"reassembly": {
"inProgress": 0,
"counters": [
{
"name": "reassembled",
"packets": 1834,
"meaning": "outer-fragmented L2TP datagrams to this box put back together and passed on"
}
],
"peers": [
{
"peer": "192.0.2.10",
"vrf": "default",
"reassembled": 1834,
"failed": 2
}
],
"note": null
}
}
Schema of the response body
{
"required": [
"available",
"reasons",
"sites",
"other"
],
"type": "object",
"properties": {
"available": {
"type": "boolean",
"description": "False when the data plane's statistics cannot be read (it is not running); the lists are then empty."
},
"reasons": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DataPlaneDropRow"
},
"description": "Forwarding drops by reason. `total` counts them all and the named reasons are subsets of it — a dropped packet has at most one — and `other` is the remainder. The reasons from `cgn-untranslatable` on are kept by the data plane itself and restart at zero with it."
},
"sites": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DataPlaneDropRow"
},
"description": "The same drops by pipeline stage — where the packet was when it was dropped."
},
"other": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DataPlaneDropRow"
},
"description": "Losses outside the forwarding decision, not included in `total`: punt policing, unresolved next hops, transmit refusals, and what each NIC itself dropped."
},
"detailNote": {
"type": "string",
"description": "Null when the data plane reported its detailed reasons. Otherwise why it did not (it is not running, predates them, or this control plane runs the mock data plane); those drops are then in `other`.",
"nullable": true
},
"reassembly": {
"oneOf": [
{
"nullable": true
},
{
"$ref": "#/components/schemas/DataPlaneReassembly"
}
]
}
},
"description": "GET /api/v1/dataplane/drops — where and why the data plane discarded packets.",
"example": {
"available": true,
"reasons": [
{
"name": "total",
"packets": 812,
"meaning": "every forwarding-decision drop; the reasons below are subsets of it"
},
{
"name": "cgn-untranslatable",
"packets": 800,
"meaning": "CG-NAT cannot translate it: a TCP/UDP source port of 0, or a transport header cut short"
}
],
"sites": [
{
"name": "core-downstream",
"packets": 790,
"meaning": "from the core toward subscribers, including traffic for an address no session owns"
}
],
"other": [
{
"name": "punt-rate",
"packets": 12,
"meaning": "a punt rule's own rate limit discarded traffic for the box (show punt has the rule)"
}
],
"detailNote": null,
"reassembly": {
"inProgress": 0,
"counters": [
{
"name": "reassembled",
"packets": 1834,
"meaning": "outer-fragmented L2TP datagrams to this box put back together and passed on"
}
],
"peers": [
{
"peer": "192.0.2.10",
"vrf": "default",
"reassembled": 1834,
"failed": 2
}
],
"note": 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"
}
}
GET /api/v1/dataplane/drops/urpf#
uRPF failure counters and retained header samples. Operator role.
Description
Monotonic timestamps, header metadata only. A busy snapshot returns 503; retry. Session IDs name the current owner of a slot and may have changed since capture.
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
{
"counters": [
{
"reason": "string",
"count": null
}
],
"samples": [
{
"timestampNs": null,
"sessionIndex": null,
"sessionId": null,
"worker": null,
"reason": "string",
"family": null,
"source": "string",
"destination": "string",
"protocol": null,
"sourcePortOrType": null,
"destinationPortOrCode": null,
"path": "string"
}
],
"workers": null,
"ringSize": null,
"ratePps": null
}
Schema of the response body
{
"required": [
"counters",
"samples",
"workers",
"ringSize",
"ratePps"
],
"type": "object",
"properties": {
"counters": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DataPlaneUrpfReason"
}
},
"samples": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DataPlaneUrpfSample"
}
},
"workers": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "uint32"
},
"ringSize": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "uint32"
},
"ratePps": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "uint32"
}
}
}
{
"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/dataplane/load#
How loaded the data plane is and how much more it can take.
Description
Per forwarding worker, the share of its cycles spent in passes that did work
(busyPct — its real headroom; its core shows 100% CPU regardless, and poll occupancy
only says how often a poll found something), with the spray dispatcher's own dispatch share
split out; per port, packet and bit rates and what the NIC dropped over the last sample;
and the session table, CG-NAT tables, packet-buffer pool and command ring against their
limits. headroom puts it in one line. The worker figures are asked of the data plane on
each call with a bounded wait (about 250 ms), and not at all while its heartbeat is stale;
then the last sample is shown and note says why. Viewer role. 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
{
"available": true,
"note": null,
"intervalSeconds": 5.002,
"sprayed": true,
"busiestWorker": 0,
"busiestWorkerPct": 63.4,
"busiestWorkerPct5Min": 58.9,
"headroom": "busiest core: worker 0 (spray dispatcher) 63.4% busy; it is the limit for the sprayed ports, at roughly 1.6x today's traffic",
"workers": [
{
"worker": 0,
"role": "dispatcher",
"busyPct": 63.4,
"dispatchPct": 41.2,
"occupancyPct": 97,
"pps": 18211,
"dispatchPps": 71844,
"burstFill": 7.5,
"sprayDrops": 0,
"sprayDropsPerSecond": 0
}
],
"ports": [
{
"port": 0,
"name": "ens1f0",
"rxPps": 42011,
"txPps": 39874,
"rxMbps": 311.4,
"txMbps": 1290.7,
"rxMissed": 0,
"rxNoBuffer": 0,
"rxErrors": 0
}
],
"utilisation": [
{
"name": "sessions",
"used": 7310,
"limit": 65536,
"pct": 11.2,
"meaning": "subscriber sessions against the session table; at the limit new sessions are refused"
}
]
}
Schema of the response body
{
"required": [
"available",
"note",
"intervalSeconds",
"sprayed",
"busiestWorker",
"busiestWorkerPct",
"busiestWorkerPct5Min",
"headroom",
"workers",
"ports",
"utilisation"
],
"type": "object",
"properties": {
"available": {
"type": "boolean",
"description": "False when the data plane's statistics cannot be read (it is not running)."
},
"note": {
"type": "string",
"description": "Null when the data plane answered. Otherwise why the per-worker busy figures are missing or old: it was not asked (heartbeat stale), did not answer, or predates the query.",
"nullable": true
},
"intervalSeconds": {
"pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
"description": "What the rates are over. 0 = there was no earlier answer, so the percentages are since the data plane started and the rates are 0.",
"format": "double"
},
"sprayed": {
"type": "boolean",
"description": "At least one port uses software spray: worker 0 receives all of its traffic and hands it out, so worker 0 is the ceiling for those ports."
},
"busiestWorker": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "The worker with the highest busy %.",
"format": "int32",
"nullable": true
},
"busiestWorkerPct": {
"pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
"description": "Its busy %.",
"format": "double",
"nullable": true
},
"busiestWorkerPct5Min": {
"pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
"description": "The highest worker busy % averaged over the last 5 minutes — what the dataplane.worker.busy alarm judges. Null until 5 minutes of answers have been seen.",
"format": "double",
"nullable": true
},
"headroom": {
"type": "string",
"description": "One line for an operator: which core is the limit and roughly how much more traffic it could take."
},
"workers": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DataPlaneWorkerLoad"
},
"description": "Per worker."
},
"ports": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DataPlanePortLoad"
},
"description": "Per port, over the last sample interval."
},
"utilisation": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DataPlaneUtilisation"
},
"description": "Pools and tables against their limits."
}
},
"description": "GET /api/v1/dataplane/load — how loaded the data plane is and how much more it can take.",
"example": {
"available": true,
"note": null,
"intervalSeconds": 5.002,
"sprayed": true,
"busiestWorker": 0,
"busiestWorkerPct": 63.4,
"busiestWorkerPct5Min": 58.9,
"headroom": "busiest core: worker 0 (spray dispatcher) 63.4% busy; it is the limit for the sprayed ports, at roughly 1.6x today's traffic",
"workers": [
{
"worker": 0,
"role": "dispatcher",
"busyPct": 63.4,
"dispatchPct": 41.2,
"occupancyPct": 97,
"pps": 18211,
"dispatchPps": 71844,
"burstFill": 7.5,
"sprayDrops": 0,
"sprayDropsPerSecond": 0
}
],
"ports": [
{
"port": 0,
"name": "ens1f0",
"rxPps": 42011,
"txPps": 39874,
"rxMbps": 311.4,
"txMbps": 1290.7,
"rxMissed": 0,
"rxNoBuffer": 0,
"rxErrors": 0
}
],
"utilisation": [
{
"name": "sessions",
"used": 7310,
"limit": 65536,
"pct": 11.2,
"meaning": "subscriber sessions against the session table; at the limit new sessions are refused"
}
]
}
}
{
"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/dataplane/mpls/{label}#
What the data plane does with an MPLS label.
Description
The label table's own entry: not installed, pop (and the VRF the inner packet is then forwarded in), or swap with its next-hop group. 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. |
label |
path | No | MPLS label, 0-1048575. |
Responses
{
"label": 24010,
"installed": true,
"action": "pop",
"vrf": "residential",
"vrfId": 1,
"nextHopGroup": null,
"group": null
}
Schema of the response body
{
"required": [
"label",
"installed",
"action",
"vrf",
"vrfId",
"nextHopGroup",
"group"
],
"type": "object",
"properties": {
"label": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "The label asked about.",
"format": "uint32"
},
"installed": {
"type": "boolean",
"description": "False when the data plane has no entry for it: labelled packets are dropped."
},
"action": {
"type": "string",
"description": "pop, swap or none."
},
"vrf": {
"type": "string",
"description": "For pop: the VRF the inner packet is forwarded in — its name, or its number when the control plane has none.",
"nullable": true
},
"vrfId": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "That VRF's data-plane id.",
"format": "int32",
"nullable": true
},
"nextHopGroup": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "For swap: the group the packet is sent to.",
"format": "uint32",
"nullable": true
},
"group": {
"oneOf": [
{
"nullable": true
},
{
"$ref": "#/components/schemas/DataPlaneNextHopGroup"
}
]
}
},
"description": "GET /api/v1/dataplane/mpls/{label} — the data plane's answer for one label.",
"example": {
"label": 24010,
"installed": true,
"action": "pop",
"vrf": "residential",
"vrfId": 1,
"nextHopGroup": null,
"group": 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"
}
}
{
"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/dataplane/punt#
Punt rules installed in the data plane.
Description
Read from the data plane itself, not from what the control plane last sent: the
rules in evaluation order with each one's match, action, class and counters, plus the
per-class admitted and refused totals and the rate limits in force. A rising refused on
the routing class means routing protocols are losing packets to policing. 503 when the
data plane cannot be asked (not running, a build that predates this, or the mock data
plane of a development host). 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
{
"ruleCount": 1,
"maxRules": 256,
"workers": 4,
"limits": {
"perPortPps": 5000,
"globalPps": 20000,
"aggregatePps": 20000,
"perPeerPps": 2000,
"perCircuitPps": 100,
"routingPps": 20000,
"managementPps": 2000
},
"classes": [
{
"name": "routing",
"admitted": 184203,
"refused": 0,
"budget": "20000 pps box-wide",
"rules": 1
}
],
"rules": [
{
"id": 700,
"priority": 700,
"enabled": true,
"match": "ipv4 tcp dport 179 to-self on network",
"action": "kernel",
"class": "routing",
"rateLimitPps": 500,
"matched": 18211,
"punted": 18211,
"dropped": 0,
"description": "BGP",
"ethertype": "0x0800",
"ipProtocol": 6,
"interface": "network",
"destinationPort": 179,
"sourcePort": null,
"vlan": null,
"toSelf": true,
"source": null,
"dataPath": false
}
]
}
Schema of the response body
{
"required": [
"ruleCount",
"maxRules",
"workers",
"limits",
"classes",
"rules"
],
"type": "object",
"properties": {
"ruleCount": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Rules installed.",
"format": "int32"
},
"maxRules": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Rule table capacity.",
"format": "int32"
},
"workers": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Forwarding workers the tiered limits are divided across.",
"format": "int32"
},
"limits": {
"$ref": "#/components/schemas/DataPlanePuntLimits"
},
"classes": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DataPlanePuntClass"
},
"description": "Per-class counters and budgets."
},
"rules": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DataPlanePuntRule"
},
"description": "The rules, in evaluation order."
}
},
"description": "GET /api/v1/dataplane/punt — the punt table as the data plane holds it.",
"example": {
"ruleCount": 1,
"maxRules": 256,
"workers": 4,
"limits": {
"perPortPps": 5000,
"globalPps": 20000,
"aggregatePps": 20000,
"perPeerPps": 2000,
"perCircuitPps": 100,
"routingPps": 20000,
"managementPps": 2000
},
"classes": [
{
"name": "routing",
"admitted": 184203,
"refused": 0,
"budget": "20000 pps box-wide",
"rules": 1
}
],
"rules": [
{
"id": 700,
"priority": 700,
"enabled": true,
"match": "ipv4 tcp dport 179 to-self on network",
"action": "kernel",
"class": "routing",
"rateLimitPps": 500,
"matched": 18211,
"punted": 18211,
"dropped": 0,
"description": "BGP",
"ethertype": "0x0800",
"ipProtocol": 6,
"interface": "network",
"destinationPort": 179,
"sourcePort": null,
"vlan": null,
"toSelf": true,
"source": null,
"dataPath": false
}
]
}
}
{
"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/dataplane/route#
What the data plane would do with a destination.
Description
The forwarding plane's own answer, for comparing with the routing table when the
two are suspected of disagreeing: whether the address is the box's own, a subscriber's
(and which session), inside a CG-NAT pool, and the FIB's longest match with its next-hop
group — each member's egress port, MAC and labels. fromCore and fromSubscriber say what
those answers add up to for a packet arriving from each side. vrf is a configured VRF
name, default, or a data-plane VRF id; omitted, the global table. 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. |
destination |
query | string | No | IPv4 or IPv6 address. | |
vrf |
query | string | No | VRF name, `default`, or data-plane VRF id. |
Responses
{
"destination": "203.0.113.9",
"vrf": "residential",
"vrfId": 1,
"vrfExists": true,
"ownAddress": false,
"subscriberHost": null,
"subscriberPrefix": null,
"cgnPoolGroup": null,
"ipsecEgress": false,
"hasFibTable": true,
"fib": {
"prefix": "0.0.0.0/0",
"connected": false,
"blackhole": false,
"nextHopGroup": 12,
"group": {
"index": 12,
"sourceMac": "02:00:00:00:00:01",
"members": [
{
"member": 0,
"address": "10.0.0.1",
"mac": "00:11:22:33:44:55",
"port": 2,
"portName": "ens1f1",
"transportLabel": 16001,
"vpnLabel": 24005,
"usable": true,
"resolved": true,
"weight": 1
}
]
}
},
"fromCore": "no subscriber session owns this address: dropped, unless the packet's source is a CG-NAT subscriber or matches a source-VRF rule",
"fromSubscriber": "forwarded through next-hop group 12"
}
Schema of the response body
{
"required": [
"destination",
"vrf",
"vrfId",
"vrfExists",
"ownAddress",
"subscriberHost",
"subscriberPrefix",
"cgnPoolGroup",
"ipsecEgress",
"hasFibTable",
"fib",
"fromCore",
"fromSubscriber"
],
"type": "object",
"properties": {
"destination": {
"type": "string",
"description": "The address asked about."
},
"vrf": {
"type": "string",
"description": "The VRF's name, or its number when the control plane has no name for it."
},
"vrfId": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "The VRF's data-plane id.",
"format": "int32"
},
"vrfExists": {
"type": "boolean",
"description": "False when the id is beyond the data plane's VRF table."
},
"ownAddress": {
"type": "boolean",
"description": "True when the address is one of the box's own in this VRF."
},
"subscriberHost": {
"oneOf": [
{
"nullable": true
},
{
"$ref": "#/components/schemas/DataPlaneSubscriberMatch"
}
]
},
"subscriberPrefix": {
"oneOf": [
{
"nullable": true
},
{
"$ref": "#/components/schemas/DataPlaneSubscriberMatch"
}
]
},
"cgnPoolGroup": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "The CG-NAT group whose public pool contains it, or null.",
"format": "int32",
"nullable": true
},
"ipsecEgress": {
"type": "boolean",
"description": "True when it falls in an IPsec egress-divert prefix: control-plane-originated packets to it go to the kernel for encryption."
},
"hasFibTable": {
"type": "boolean",
"description": "False when the VRF has no forwarding table for this address family."
},
"fib": {
"oneOf": [
{
"nullable": true
},
{
"$ref": "#/components/schemas/DataPlaneFibMatch"
}
]
},
"fromCore": {
"type": "string",
"description": "What happens to a packet for this destination arriving from the core. Where no table claims the destination, the packet's source decides (CG-NAT, source-VRF rules) and this says so rather than \"dropped\"."
},
"fromSubscriber": {
"type": "string",
"description": "What happens to one arriving from a subscriber in this VRF."
}
},
"description": "GET /api/v1/dataplane/route — the data plane's own answer for one destination.",
"example": {
"destination": "203.0.113.9",
"vrf": "residential",
"vrfId": 1,
"vrfExists": true,
"ownAddress": false,
"subscriberHost": null,
"subscriberPrefix": null,
"cgnPoolGroup": null,
"ipsecEgress": false,
"hasFibTable": true,
"fib": {
"prefix": "0.0.0.0/0",
"connected": false,
"blackhole": false,
"nextHopGroup": 12,
"group": {
"index": 12,
"sourceMac": "02:00:00:00:00:01",
"members": [
{
"member": 0,
"address": "10.0.0.1",
"mac": "00:11:22:33:44:55",
"port": 2,
"portName": "ens1f1",
"transportLabel": 16001,
"vpnLabel": 24005,
"usable": true,
"resolved": true,
"weight": 1
}
]
}
},
"fromCore": "no subscriber session owns this address: dropped, unless the packet's source is a CG-NAT subscriber or matches a source-VRF rule",
"fromSubscriber": "forwarded through next-hop group 12"
}
}
{
"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/dataplane/urpf-sample#
Arm uRPF header sampling for one session or all sessions. Operator role.
Description
Count 1..4096, seconds 1..300; defaults 64 and 30. Exactly one sessionId or all. Single-session arms allow up to Count samples per worker, retaining the latest 64 per worker. All sessions is limited to 100 samples/second across workers; only all-session count quotas are split across workers and not borrowed. Re-arming replaces the previous request.
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
Other accepted types: application/*+json, text/json
Schema of the request body
{
"type": "object",
"properties": {
"sessionId": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "uint32",
"nullable": true
},
"all": {
"type": "boolean",
"default": false
},
"count": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "uint32",
"default": 64
},
"seconds": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "uint32",
"default": 30
}
}
}
Responses
Schema of the response body
{
"required": [
"sessionIndex",
"count",
"seconds"
],
"type": "object",
"properties": {
"sessionIndex": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "uint32"
},
"count": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "uint32"
},
"seconds": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "uint32"
}
}
}
{
"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/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 where it
would have been transmitted, as is anything the box would have originated for it (an ICMP
error, fragments, a tunnelled datagram), so a forwarding question can be asked of a live
customer VRF without forwarding the frame. A dry run is not free of side effects: a packet
that the pipeline punts is still delivered to the control plane or the kernel, a packet of
a session under capture is still mirrored to the collector, and the packet is policed,
NATed and counted like any other. 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"
}
}
POST /api/v1/diagnostics/traceroute#
Trace the path to a destination from the data plane, optionally inside a VRF.
Description
The same data-plane ICMP echo as ping, sent with the TTL walked up from
firstTtl so that each router on the path in turn expires it and answers. The appliance
is the origin, not a hop: hop 1 is the first router beyond it.
Several TTLs are probed at once, so a path with silent hops — an MPLS core, a filtered
destination — completes in seconds rather than one timeout per hop. A probe nothing
answered has a null `address`. Probes of one hop answered by different routers (ECMP) carry
different addresses. A trace ends when the destination answers (`reached`), when a router
declares it unreachable (the last hop's `annotation`: `!N` no route, `!H` host unreachable,
`!X` administratively prohibited, `!F-1400` fragmentation needed with that MTU), or at
`maxHops`.
`mplsLabels` is the label stack a label-switching router reports the probe was carrying
when it expired (RFC 4950), outermost first. `hostname` comes from the appliance's own
resolver, on the management side; a hop inside a service VRF often has no name visible
from there, which yields a null hostname and never an 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": "residential",
"source": null,
"maxHops": 30,
"probes": 3,
"firstTtl": 1,
"size": 32,
"timeoutMs": 1000,
"resolve": true
}
Other accepted types: application/*+json, text/json
Schema of the request body
{
"required": [
"destination",
"vrf",
"source",
"maxHops",
"probes",
"firstTtl",
"size",
"timeoutMs",
"resolve"
],
"type": "object",
"properties": {
"destination": {
"type": "string",
"description": "Address to trace to, IPv4 or IPv6."
},
"vrf": {
"type": "string",
"description": "VRF to trace 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
},
"maxHops": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Highest TTL to try (capped at 64).",
"format": "int32",
"nullable": true
},
"probes": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Probes per hop (capped at 5).",
"format": "int32",
"nullable": true
},
"firstTtl": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "TTL to start from.",
"format": "int32",
"nullable": true
},
"size": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "ICMP payload bytes (capped).",
"format": "int32",
"nullable": true
},
"timeoutMs": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Per-probe wait.",
"format": "int32",
"nullable": true
},
"resolve": {
"type": "boolean",
"description": "Reverse-resolve each hop's address. Default true.",
"nullable": true
}
},
"description": "POST /api/v1/diagnostics/traceroute body.",
"example": {
"destination": "192.0.2.50",
"vrf": "residential",
"source": null,
"maxHops": 30,
"probes": 3,
"firstTtl": 1,
"size": 32,
"timeoutMs": 1000,
"resolve": true
}
}
Responses
{
"destination": "192.0.2.50",
"source": "100.64.0.4",
"vrf": "residential",
"maxHops": 30,
"reached": true,
"hops": [
{
"ttl": 1,
"probes": [
{
"probe": 1,
"address": "100.64.0.1",
"hostname": "ae1.core1.example.net",
"rttMs": 1.874,
"annotation": null,
"mplsLabels": [
299840
]
}
]
}
]
}
Schema of the response body
{
"required": [
"destination",
"source",
"vrf",
"maxHops",
"reached",
"hops"
],
"type": "object",
"properties": {
"destination": {
"type": "string",
"description": "Address traced to."
},
"source": {
"type": "string",
"description": "Address actually sourced from."
},
"vrf": {
"type": "string",
"description": "VRF used, or null for the default table.",
"nullable": true
},
"maxHops": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Highest TTL that would have been tried, after capping.",
"format": "int32"
},
"reached": {
"type": "boolean",
"description": "True when the destination itself answered."
},
"hops": {
"type": "array",
"items": {
"$ref": "#/components/schemas/TraceHop"
},
"description": "Hops in TTL order, ending at the one that ended the trace."
}
},
"description": "The result of a traceroute.",
"example": {
"destination": "192.0.2.50",
"source": "100.64.0.4",
"vrf": "residential",
"maxHops": 30,
"reached": true,
"hops": [
{
"ttl": 1,
"probes": [
{
"probe": 1,
"address": "100.64.0.1",
"hostname": "ae1.core1.example.net",
"rttMs": 1.874,
"annotation": null,
"mplsLabels": [
299840
]
}
]
}
]
}
}
{
"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/l2-circuits#
Access circuits handed off at layer 2.
Description
Every circuit a row of the subscriber view hands off and this box has claimed:
its NNI and C-VLAN, the line (service id) that is the data plane's service reference, the
action - forward into VXLAN or deny - and why it is denied, the VNI, hand-off VLAN and
remote VTEP, where the data plane would send its VXLAN (egress), what the data plane
itself holds for it (dataPlane), and its counters summed over the data plane's workers
and over the entries the circuit has had for the same line. A circuit a load hands off that
waits for a second refresh to agree is listed with disposition served. Also the VTEP and
how full the data plane's table is. 503 on a box without IPoE or PPPoE access.
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
{
"vtep": {
"configured": true,
"localAddress": "45.84.200.65",
"underlayVrf": null,
"underlayMtu": 1600,
"dataPlaneConfigured": true
},
"activeEntries": 2,
"capacity": 4096,
"installRefusals": 0,
"circuits": [
{
"nni": "ms3-lon-1-a",
"port": 0,
"sVlan": 200,
"cVlan": 141,
"serviceId": "7a0f0e0c-0d5c-4e8e-9f55-0b6a7c1d2e01",
"action": "forward",
"denyReason": null,
"disposition": "claimed",
"vni": 100000,
"handoffVlan": 3990,
"remote": "10.255.0.1",
"egress": "via 10.255.1.1 (port 1)",
"dataPlane": "forward",
"awaitingGrace": false,
"pending": null,
"upPackets": 1532,
"upBytes": 1203554,
"downPackets": 1844,
"downBytes": 2011398,
"drops": 0
}
]
}
Schema of the response body
{
"required": [
"vtep",
"activeEntries",
"capacity",
"installRefusals",
"circuits"
],
"type": "object",
"properties": {
"vtep": {
"$ref": "#/components/schemas/L2VtepStatus"
},
"activeEntries": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "ACTIVE entries in the data plane's table; null when it cannot be\n read.",
"format": "uint32",
"nullable": true
},
"capacity": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "How many entries the table holds.",
"format": "uint32"
},
"installRefusals": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Entries the data plane refused since the control plane started\n (a full table, mostly); each such circuit stayed as it was.",
"format": "int64"
},
"circuits": {
"type": "array",
"items": {
"$ref": "#/components/schemas/L2CircuitStatus"
},
"description": "The claimed circuits, and those that wait to be."
}
},
"description": "The cross-connects, as `show l2-circuits` and `GET /api/v1/l2-circuits`\n show them (docs/design/55 §55.9).",
"example": {
"vtep": {
"configured": true,
"localAddress": "45.84.200.65",
"underlayVrf": null,
"underlayMtu": 1600,
"dataPlaneConfigured": true
},
"activeEntries": 2,
"capacity": 4096,
"installRefusals": 0,
"circuits": [
{
"nni": "ms3-lon-1-a",
"port": 0,
"sVlan": 200,
"cVlan": 141,
"serviceId": "7a0f0e0c-0d5c-4e8e-9f55-0b6a7c1d2e01",
"action": "forward",
"denyReason": null,
"disposition": "claimed",
"vni": 100000,
"handoffVlan": 3990,
"remote": "10.255.0.1",
"egress": "via 10.255.1.1 (port 1)",
"dataPlane": "forward",
"awaitingGrace": false,
"pending": null,
"upPackets": 1532,
"upBytes": 1203554,
"downPackets": 1844,
"downBytes": 2011398,
"drops": 0
}
]
}
}
{
"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/l2-circuits/drops#
Frames the layer-2 cross-connects dropped, by reason.
Description
The data plane's global cross-connect drop reasons (docs/design/55 §55.7),
summed over its workers since it started: no_route, unresolved, mtu,
unknown_circuit, malformed, bad_source, fragment, deny, contention. 503 when
the data plane's table cannot be read, or on a box without IPoE or PPPoE access.
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"
}
}
{
"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"
}
}
GET /api/v1/system/hardware/health#
Host hardware health.
Description
BMC sensors (power supplies, fans, temperatures, voltages) and System Event Log,
SMART health of every drive, EDAC memory errors, CPU thermal throttling and filesystem
state, each normalised to ok / warning / degraded / failed / unknown (doc 48). Refreshed by
a background poll every minute (SMART every five). sources says which readers are
available on this box, so an empty section is never mistaken for a healthy one. Hardware
RAID is GET /api/v1/system/raid. 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
{
"collectedAtUtc": "2026-09-28T19:30:00Z",
"health": "failed",
"sources": [
{
"name": "ipmi",
"available": true,
"message": null
},
{
"name": "smart",
"available": true,
"message": null
}
],
"sensors": [
{
"id": "PS2 Status",
"name": "PS2 Status",
"type": "power-supply",
"entity": "Power Supply",
"reading": null,
"unit": null,
"status": null,
"states": [
"Presence detected",
"Failure detected",
"Power Supply AC lost"
],
"health": "failed",
"message": "Failure detected, Power Supply AC lost"
}
],
"disks": [],
"memory": null,
"cpu": null,
"filesystems": [],
"eventLog": null,
"recentEvents": []
}
Schema of the response body
{
"type": "object",
"properties": {
"collectedAtUtc": {
"type": "string",
"description": "When the last poll finished; null until the first one has run.",
"format": "date-time",
"nullable": true
},
"health": {
"type": "string",
"description": "Worst verdict across every sensor, disk, memory, CPU and filesystem reading."
},
"sources": {
"type": "array",
"items": {
"$ref": "#/components/schemas/HardwareSource"
},
"description": "Each source and whether it could be read, so an empty section is never mistaken\n for a healthy one."
},
"sensors": {
"type": "array",
"items": {
"$ref": "#/components/schemas/SensorReading"
}
},
"disks": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DiskHealth"
}
},
"memory": {
"oneOf": [
{
"nullable": true
},
{
"$ref": "#/components/schemas/MemoryHealth"
}
]
},
"cpu": {
"oneOf": [
{
"nullable": true
},
{
"$ref": "#/components/schemas/CpuHealth"
}
]
},
"filesystems": {
"type": "array",
"items": {
"$ref": "#/components/schemas/FilesystemHealth"
}
},
"eventLog": {
"oneOf": [
{
"nullable": true
},
{
"$ref": "#/components/schemas/BmcEventLog"
}
]
},
"recentEvents": {
"type": "array",
"items": {
"$ref": "#/components/schemas/BmcEvent"
},
"description": "The most recent BMC System Event Log entries, newest first."
}
},
"description": "GET /api/v1/system/hardware/health.",
"example": {
"collectedAtUtc": "2026-09-28T19:30:00Z",
"health": "failed",
"sources": [
{
"name": "ipmi",
"available": true,
"message": null
},
{
"name": "smart",
"available": true,
"message": null
}
],
"sensors": [
{
"id": "PS2 Status",
"name": "PS2 Status",
"type": "power-supply",
"entity": "Power Supply",
"reading": null,
"unit": null,
"status": null,
"states": [
"Presence detected",
"Failure detected",
"Power Supply AC lost"
],
"health": "failed",
"message": "Failure detected, Power Supply AC lost"
}
],
"disks": [],
"memory": null,
"cpu": null,
"filesystems": [],
"eventLog": null,
"recentEvents": []
}
}
{
"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"
}
}
GET /api/v1/system/raid#
Hardware RAID health.
Description
Every hardware RAID controller in the box with its virtual and physical drives,
normalised across vendors (doc 47). Refreshed by a background poll every minute; a
controller that cannot be read (no vendor tool installed, unsupported model) is listed with
monitored: false and a message saying why. Empty controllers means the box has no
hardware RAID controller. 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
{
"collectedAtUtc": "2026-09-28T08:51:46Z",
"health": "ok",
"controllers": [
{
"id": "c0",
"pciAddress": "0000:02:00.0",
"driver": "megaraid_sas",
"provider": "megaraid-cli",
"tool": "/opt/MegaRAID/perccli/perccli64",
"model": "PERC H330 Mini",
"serial": "8A400UY",
"firmware": "25.5.6.0009",
"status": "Optimal",
"monitored": true,
"health": "ok",
"message": null,
"lastGoodReadUtc": "2026-09-28T08:51:46Z",
"battery": null,
"virtualDrives": [
{
"id": "c0/v0",
"name": null,
"raidLevel": "RAID1",
"state": "optimal",
"rawState": "Optl",
"health": "ok",
"sizeBytes": 999653638144
}
],
"physicalDrives": [
{
"id": "c0/e32/s0",
"model": "CT1000MX500SSD1",
"serial": "2007E28C0C52",
"firmware": "M3CR033",
"media": "SSD",
"interface": "SATA",
"sizeBytes": 999653638144,
"state": "online",
"rawState": "Onln",
"health": "ok",
"driveGroup": 0,
"temperatureC": 32,
"mediaErrors": 0,
"otherErrors": 6,
"predictiveFailures": 0,
"smartAlert": false,
"rebuildPercent": null
}
]
}
]
}
Schema of the response body
{
"type": "object",
"properties": {
"collectedAtUtc": {
"type": "string",
"description": "When the last poll finished; null until the first one has run.",
"format": "date-time",
"nullable": true
},
"health": {
"type": "string",
"description": "Worst health across every controller, virtual drive and physical drive, or \"ok\"\n when the box has no hardware RAID controller at all."
},
"controllers": {
"type": "array",
"items": {
"$ref": "#/components/schemas/RaidController"
}
}
},
"description": "GET /api/v1/system/raid — hardware RAID controllers and their drives.",
"example": {
"collectedAtUtc": "2026-09-28T08:51:46Z",
"health": "ok",
"controllers": [
{
"id": "c0",
"pciAddress": "0000:02:00.0",
"driver": "megaraid_sas",
"provider": "megaraid-cli",
"tool": "/opt/MegaRAID/perccli/perccli64",
"model": "PERC H330 Mini",
"serial": "8A400UY",
"firmware": "25.5.6.0009",
"status": "Optimal",
"monitored": true,
"health": "ok",
"message": null,
"lastGoodReadUtc": "2026-09-28T08:51:46Z",
"battery": null,
"virtualDrives": [
{
"id": "c0/v0",
"name": null,
"raidLevel": "RAID1",
"state": "optimal",
"rawState": "Optl",
"health": "ok",
"sizeBytes": 999653638144
}
],
"physicalDrives": [
{
"id": "c0/e32/s0",
"model": "CT1000MX500SSD1",
"serial": "2007E28C0C52",
"firmware": "M3CR033",
"media": "SSD",
"interface": "SATA",
"sizeBytes": 999653638144,
"state": "online",
"rawState": "Onln",
"health": "ok",
"driveGroup": 0,
"temperatureC": 32,
"mediaErrors": 0,
"otherErrors": 6,
"predictiveFailures": 0,
"smartAlert": false,
"rebuildPercent": 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/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
],
"housekeepingCpuPct": 7.4,
"housekeepingCpuBusiestPct": 12.9,
"housekeepingCpus": "0-1,8-9",
"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",
"busiestWorkerPct": 3,
"workerOccupancyPct": [
2,
3,
1,
2
],
"busiestWorkerBusyPct": 41,
"workerBusyPct": [
41,
22,
19,
23
]
}
}
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"
},
"description": "1/5/15-minute load averages. On a DPDK box each data-plane worker busy-polls\n its core and adds ~1.0 here permanently, so read double? SystemStatusDto.HousekeepingCpuPct for how\n busy the host really is.",
"nullable": true
},
"housekeepingCpuPct": {
"pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
"description": "Mean CPU busy % over the housekeeping cores — everything except isolated CPUs\n and data-plane lcores — averaged since the previous status request. What the control\n plane, FRR and the kernel share, and what can actually run out.",
"format": "double",
"nullable": true
},
"housekeepingCpuBusiestPct": {
"pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
"description": "The busiest single housekeeping core, same interval. One pinned thread (a\n spinning daemon) shows here long before it moves the mean.",
"format": "double",
"nullable": true
},
"housekeepingCpus": {
"type": "string",
"description": "The housekeeping cores measured, in cpulist form (\"0-1,8-9\").",
"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
],
"housekeepingCpuPct": 7.4,
"housekeepingCpuBusiestPct": 12.9,
"housekeepingCpus": "0-1,8-9",
"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",
"busiestWorkerPct": 3,
"workerOccupancyPct": [
2,
3,
1,
2
],
"busiestWorkerBusyPct": 41,
"workerBusyPct": [
41,
22,
19,
23
]
}
}
}
{
"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. |
BmcEvent#
| Name | Type | Description |
|---|---|---|
asserted |
boolean | True for an assertion, false for a deassertion (the condition going away). |
description |
string | null | |
recordId |
||
sensor |
string | null | |
timestamp |
string | null | The BMC's own clock, as it prints it. |
BmcEventLog#
| Name | Type | Description |
|---|---|---|
entries |
||
overflow |
boolean | The log is full and the BMC is discarding new events. |
percentUsed |
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. |
CpuHealth#
| Name | Type | Description |
|---|---|---|
coreThrottleEvents |
Core-level throttle events since boot, summed over cores. | |
health |
string | |
packageThrottleEvents |
Package-level throttle events since boot, summed over sockets. | |
throttleEventsLast15Min |
Package throttle events in the last 15 minutes. |
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 |
DataPlaneDropRow#
| Name | Type | Description |
|---|---|---|
meaning |
string | What it counts and where to look next. |
name |
string | Stable name of the reason, stage or counter. |
packets |
Packets, since the data plane started. |
DataPlaneDrops#
| Name | Type | Description |
|---|---|---|
available |
boolean | False when the data plane's statistics cannot be read (it is not running); the lists are then empty. |
detailNote |
string | null | Null when the data plane reported its detailed reasons. Otherwise why it did not (it is not running, predates them, or this control plane runs the mock data plane); those drops are then in `other`. |
other |
Array<DataPlaneDropRow> | Losses outside the forwarding decision, not included in `total`: punt policing, unresolved next hops, transmit refusals, and what each NIC itself dropped. |
reasons |
Array<DataPlaneDropRow> | Forwarding drops by reason. `total` counts them all and the named reasons are subsets of it — a dropped packet has at most one — and `other` is the remainder. The reasons from `cgn-untranslatable` on are kept by the data plane itself and restart at zero with it. |
reassembly |
||
sites |
Array<DataPlaneDropRow> | The same drops by pipeline stage — where the packet was when it was dropped. |
DataPlaneFibMatch#
| Name | Type | Description |
|---|---|---|
blackhole |
boolean | A blackhole route: matching traffic is dropped. |
connected |
boolean | Marked directly connected. |
group |
||
nextHopGroup |
The next-hop group the route points at. | |
prefix |
string | The matched prefix. |
DataPlaneLoad#
| Name | Type | Description |
|---|---|---|
available |
boolean | False when the data plane's statistics cannot be read (it is not running). |
busiestWorker |
The worker with the highest busy %. | |
busiestWorkerPct |
Its busy %. | |
busiestWorkerPct5Min |
The highest worker busy % averaged over the last 5 minutes — what the dataplane.worker.busy alarm judges. Null until 5 minutes of answers have been seen. | |
headroom |
string | One line for an operator: which core is the limit and roughly how much more traffic it could take. |
intervalSeconds |
What the rates are over. 0 = there was no earlier answer, so the percentages are since the data plane started and the rates are 0. | |
note |
string | null | Null when the data plane answered. Otherwise why the per-worker busy figures are missing or old: it was not asked (heartbeat stale), did not answer, or predates the query. |
ports |
Array<DataPlanePortLoad> | Per port, over the last sample interval. |
sprayed |
boolean | At least one port uses software spray: worker 0 receives all of its traffic and hands it out, so worker 0 is the ceiling for those ports. |
utilisation |
Array<DataPlaneUtilisation> | Pools and tables against their limits. |
workers |
Array<DataPlaneWorkerLoad> | Per worker. |
DataPlaneMpls#
| Name | Type | Description |
|---|---|---|
action |
string | pop, swap or none. |
group |
||
installed |
boolean | False when the data plane has no entry for it: labelled packets are dropped. |
label |
The label asked about. | |
nextHopGroup |
For swap: the group the packet is sent to. | |
vrf |
string | null | For pop: the VRF the inner packet is forwarded in — its name, or its number when the control plane has none. |
vrfId |
That VRF's data-plane id. |
DataPlaneNextHop#
| Name | Type | Description |
|---|---|---|
address |
string | null | Next-hop address, or null when the data plane holds none. |
mac |
string | Next-hop MAC address. |
member |
Position in the group. | |
port |
Egress data-plane port index. | |
portName |
string | null | That port's configured name, or null when the configuration has no port with this index. |
resolved |
boolean | False while the next hop has no MAC address: packets are handed to the kernel to resolve it, or dropped. |
transportLabel |
Outer MPLS label pushed, or null. | |
usable |
boolean | False when the forwarding path would not use this member as it stands: it is not marked valid, or its MAC is not resolved. |
vpnLabel |
Inner (VPN) MPLS label pushed, or null. | |
weight |
ECMP weight. |
DataPlaneNextHopGroup#
| Name | Type | Description |
|---|---|---|
index |
Group index. | |
members |
Array<DataPlaneNextHop> | The members; a flow is hashed onto one of them. Empty means traffic routed to this group is dropped. |
sourceMac |
string | Source MAC the group's frames leave with. |
DataPlanePortLoad#
| Name | Type | Description |
|---|---|---|
name |
string | null | Its configured name, or null. |
port |
Data-plane port index. | |
rxErrors |
Frames received in error, same interval. | |
rxMbps |
||
rxMissed |
Frames the NIC dropped because its receive ring overflowed, over the last sample interval: the workers fell behind. | |
rxNoBuffer |
Receives that failed for want of a packet buffer, same interval. | |
rxPps |
||
txMbps |
||
txPps |
DataPlanePunt#
| Name | Type | Description |
|---|---|---|
classes |
Array<DataPlanePuntClass> | Per-class counters and budgets. |
limits |
DataPlanePuntLimits | |
maxRules |
Rule table capacity. | |
ruleCount |
Rules installed. | |
rules |
Array<DataPlanePuntRule> | The rules, in evaluation order. |
workers |
Forwarding workers the tiered limits are divided across. |
DataPlanePuntClass#
| Name | Type | Description |
|---|---|---|
admitted |
Punts handed to the kernel or the control plane, since the data plane started. | |
budget |
string | The limits this class is held to, in words. |
name |
string | routing, management, subscriber or default. |
refused |
Punts discarded by a rate limit — the rule's own, a tier, or the class budget. | |
rules |
Installed rules whose punts are charged to this class when they arrive on a network port. |
DataPlanePuntLimits#
| Name | Type | Description |
|---|---|---|
aggregatePps |
Ceiling for the subscriber class, and separately for the default class. | |
globalPps |
Protocol-classified subscriber punts (PPP, L2TP control). | |
managementPps |
Management class budget. | |
perCircuitPps |
Per access circuit (port and VLANs). | |
perPeerPps |
Per L2TP peer. | |
perPortPps |
Per ingress port. | |
routingPps |
Routing class budget. |
DataPlanePuntRule#
| Name | Type | Description |
|---|---|---|
action |
string | kernel, control-plane or drop. |
class |
string | The class its punts are charged to on a network port. Anything arriving on a subscriber port is charged to subscriber whatever the rule says. |
dataPath |
boolean | True for a rule carrying subscriber data rather than control traffic (ESP on an IPsec LNS): its punts skip the shared tiers. |
description |
string | The rule's name. |
destinationPort |
Matched L4 destination port, or null for any. | |
dropped |
Of those, discarded: by a rate limit, or because the action is drop. | |
enabled |
boolean | False for a rule that is installed but switched off. |
ethertype |
string | null | Matched EtherType as 0xNNNN, or null for any. |
id |
Rule id. | |
interface |
string | any, subscriber or network. |
ipProtocol |
Matched IP protocol number, or null for any. | |
match |
string | The match, in words. |
matched |
Packets that matched the rule. | |
priority |
Evaluation priority: lower is earlier, first match wins. | |
punted |
Of those, delivered. | |
rateLimitPps |
The rule's own cap; 0 is no cap. | |
source |
string | null | Source prefix the packet must come from, or null for any. |
sourcePort |
Matched L4 source port, or null for any. | |
toSelf |
boolean | True when the rule only matches packets addressed to one of the box's own addresses. |
vlan |
Matched VLAN, or null for any. |
DataPlaneReassembly#
| Name | Type | Description |
|---|---|---|
counters |
Array<DataPlaneDropRow> | What the reassembler counted since the data plane started. `reassembled` and `fragments-joined` are work done; each counter after them up to `too-big` is a datagram given up, all of which `tunnel-fragments` also counts. |
inProgress |
Datagrams being reassembled when asked. | |
note |
string | null | Null when the data plane answered. Otherwise why it did not (it is not running, predates reassembly, or this control plane runs the mock data plane). |
peers |
Array<DataPlaneReassemblyPeer> | The outer sources that fragment, busiest first. |
DataPlaneReassemblyPeer#
| Name | Type | Description |
|---|---|---|
failed |
Its datagrams given up (a piece missing at the timeout, evicted, over a limit, or inconsistent). | |
peer |
string | The outer source address — a LAC (or, toward our LAC role, an LNS). |
reassembled |
Its datagrams put back together and passed on. | |
vrf |
string | The transport VRF its datagrams arrived in: a configured name, `default`, or the data-plane id. |
DataPlaneRoute#
| Name | Type | Description |
|---|---|---|
cgnPoolGroup |
The CG-NAT group whose public pool contains it, or null. | |
destination |
string | The address asked about. |
fib |
||
fromCore |
string | What happens to a packet for this destination arriving from the core. Where no table claims the destination, the packet's source decides (CG-NAT, source-VRF rules) and this says so rather than "dropped". |
fromSubscriber |
string | What happens to one arriving from a subscriber in this VRF. |
hasFibTable |
boolean | False when the VRF has no forwarding table for this address family. |
ipsecEgress |
boolean | True when it falls in an IPsec egress-divert prefix: control-plane-originated packets to it go to the kernel for encryption. |
ownAddress |
boolean | True when the address is one of the box's own in this VRF. |
subscriberHost |
||
subscriberPrefix |
||
vrf |
string | The VRF's name, or its number when the control plane has no name for it. |
vrfExists |
boolean | False when the id is beyond the data plane's VRF table. |
vrfId |
The VRF's data-plane id. |
DataPlaneStatus#
| Name | Type | Description |
|---|---|---|
busiestWorkerBusyPct |
doc 44 §44.12: busy % of the busiest worker — the share of its cycles spent in passes that did work, over the last sample. Unlike occupancy this is how close the core is to full. Null when the data plane cannot be asked (or predates the query). | |
busiestWorkerPct |
Poll occupancy of the busiest data-plane worker: the % of its polls that returned packets over the last sample. The worker's real headroom — its core shows 100% CPU regardless. Null when the data plane is down or not yet sampled. | |
heartbeatAgeSeconds |
||
palBackend |
string | PAL backend: dpdk / af_xdp / mock (config dataPlane.mode). |
running |
boolean | |
workerBusyPct |
Array<> | Busy % per data-plane worker, in worker order; null as above. |
workerOccupancyPct |
Array<> | Poll occupancy % per data-plane worker, in worker order. |
DataPlaneSubscriberMatch#
| Name | Type | Description |
|---|---|---|
blocked |
boolean | True when the data plane holds the session as blocked: it is matched, and its traffic is then dropped. |
knownToControlPlane |
boolean | False when the control plane has no session with that id — the two disagree. |
prefix |
string | The subscriber address or prefix that covers it. |
sessionId |
Session id the data plane holds in that slot. | |
sessionIndex |
Session-table slot the entry points at. | |
state |
string | That slot's state in the data plane: active, draining or free. |
username |
string | null | The control plane's user for that session id, or null. |
DataPlaneUrpf#
| Name | Type | Description |
|---|---|---|
counters |
Array<DataPlaneUrpfReason> | |
ratePps |
||
ringSize |
||
samples |
Array<DataPlaneUrpfSample> | |
workers |
DataPlaneUrpfReason#
| Name | Type | Description |
|---|---|---|
count |
||
reason |
string |
DataPlaneUrpfSample#
| Name | Type | Description |
|---|---|---|
destination |
string | |
destinationPortOrCode |
||
family |
||
path |
string | |
protocol |
||
reason |
string | |
sessionId |
||
sessionIndex |
||
source |
string | |
sourcePortOrType |
||
timestampNs |
||
worker |
DataPlaneUtilisation#
| Name | Type | Description |
|---|---|---|
limit |
Its capacity; null when not known. | |
meaning |
string | What it is and what happens when it is full. |
name |
string | `sessions`, `cgn-flows`, `cgn-bindings`, `packet-buffers` or `command-ring`. |
pct |
Used as a % of the limit. | |
used |
In use now; null when not known. |
DataPlaneWorkerLoad#
| Name | Type | Description |
|---|---|---|
burstFill |
Average distinct packets handled per pass that did work. A pass polls up to 32 per RX queue, so the dispatcher (which polls every sprayed queue) can exceed 32. Low fill means busy % overstates the load. | |
busyPct |
Share of the worker's cycles spent in passes that did work, over the interval. Its headroom: at 100% it can take no more. Null when the data plane could not be asked. | |
dispatchPct |
Dispatcher only: the share of its cycles spent dispatching. The rest of its busy time is its own share of the traffic. | |
dispatchPps |
Dispatcher only: frames it dispatched per second. | |
occupancyPct |
Share of its polls that found packets (the older gauge). High occupancy with low busy % means many small bursts, not a full core. | |
pps |
Packets it processed per second: its own RX queues, its spray ring and, on worker 0, frames from the kernel TAP. | |
role |
string | `dispatcher` for worker 0 when a port is sprayed (it takes every sprayed port's frames off the NIC and hands them out), otherwise `worker`. |
sprayDrops |
Frames for this worker the dispatcher dropped because its spray ring was full, since the data plane started. | |
sprayDropsPerSecond |
The same, per second over the interval. | |
worker |
Worker (core) id. |
DiskHealth#
| Name | Type | Description |
|---|---|---|
availableSparePercent |
NVMe spare capacity remaining, percent. | |
device |
string | |
firmware |
string | null | |
health |
string | |
id |
string | Device plus pass-through type ("/dev/bus/0 megaraid,1") — unique per drive. |
mediaErrors |
||
messages |
Array<string> | Every reason the verdict is not ok. |
model |
string | null | |
pendingSectors |
ATA attribute 197 raw value. | |
percentUsed |
NVMe endurance used, 0-100+ percent. | |
powerOnHours |
||
protocol |
string | null | ATA / NVMe / SCSI. |
readState |
string | How current this reading is: "current"; "standby" (spun down, not woken — the last reading is shown); "stale" (the last read failed, the previous reading is shown); "failed" (reads keep failing). Alarms on a drive that is not current are held, never cleared. |
reallocatedSectors |
ATA attribute 5 raw value. | |
serial |
string | null | |
smartPassed |
boolean | null | The drive's own overall SMART verdict; null when it could not be read. |
temperatureC |
||
type |
string | null | smartctl device type: nvme / sat / sat+megaraid,0 / ... |
uncorrectableSectors |
ATA attribute 198 raw value. |
DpUrpfArm#
| Name | Type | Description |
|---|---|---|
count |
||
seconds |
||
sessionIndex |
Filesystem#
| Name | Type | Description |
|---|---|---|
availableBytes |
||
fsType |
string | null | |
mountPoint |
string | |
totalBytes |
FilesystemHealth#
| Name | Type | Description |
|---|---|---|
availableBytes |
||
device |
string | null | |
fsType |
string | null | |
health |
string | |
mountPoint |
string | |
readOnly |
boolean | Mounted read-only — on the appliance that means the kernel remounted it after I/O errors. |
totalBytes |
||
usedPercent |
HardwareHealth#
| Name | Type | Description |
|---|---|---|
collectedAtUtc |
string(date-time) | null | When the last poll finished; null until the first one has run. |
cpu |
||
disks |
Array<DiskHealth> | |
eventLog |
||
filesystems |
Array<FilesystemHealth> | |
health |
string | Worst verdict across every sensor, disk, memory, CPU and filesystem reading. |
memory |
||
recentEvents |
Array<BmcEvent> | The most recent BMC System Event Log entries, newest first. |
sensors |
Array<SensorReading> | |
sources |
Array<HardwareSource> | Each source and whether it could be read, so an empty section is never mistaken for a healthy one. |
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. |
HardwareSource#
| Name | Type | Description |
|---|---|---|
available |
boolean | |
message |
string | null | Why it is unavailable, or a note about a partial read. |
name |
string | ipmi / smart / edac / cpu-thermal / filesystems. |
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. |
L2CircuitsReport#
| Name | Type | Description |
|---|---|---|
activeEntries |
ACTIVE entries in the data plane's table; null when it cannot be read. | |
capacity |
How many entries the table holds. | |
circuits |
Array<L2CircuitStatus> | The claimed circuits, and those that wait to be. |
installRefusals |
Entries the data plane refused since the control plane started (a full table, mostly); each such circuit stayed as it was. | |
vtep |
L2VtepStatus |
L2CircuitStatus#
| Name | Type | Description |
|---|---|---|
action |
string | `forward` or `deny`. |
awaitingGrace |
boolean | Just claimed: DENY until the data plane's grace period has passed. |
cVlan |
The C-VLAN. | |
dataPlane |
string | What the data plane holds for it: `forward`, `deny`, `missing` or `unknown`. |
denyReason |
string | null | Why it is denied. |
disposition |
string | `claimed`, or `served` while a claim waits for a second refresh. |
downBytes |
Their bytes. | |
downPackets |
Packets cross-connected towards the customer. | |
drops |
Frames of the circuit dropped (DENY, MTU, no route, …). | |
egress |
string | null | Where the data plane would send its VXLAN (FORWARD only). |
handoffVlan |
The circuit's VLAN inside the VNI. | |
nni |
string | null | Its access NNI's key; null when the NNI is no longer declared. |
pending |
string | null | A change that waits for a second refresh to agree. |
port |
The data-plane port. | |
remote |
string | null | The far VTEP. |
serviceId |
string | null | The line's service id (the entry's service reference). |
sVlan |
The S-VLAN. | |
upBytes |
Their bytes (customer frame without service tags). | |
upPackets |
Packets cross-connected towards the wholesaler. | |
vni |
The group's VNI. |
L2DropCount#
| Name | Type | Description |
|---|---|---|
count |
||
reason |
string |
L2VtepStatus#
| Name | Type | Description |
|---|---|---|
configured |
boolean | A local address is configured. |
dataPlaneConfigured |
boolean | null | Whether the data plane has a VTEP; null when it cannot be read. |
localAddress |
string | null | The VTEP source address. |
underlayMtu |
The provisioned underlay IP MTU. | |
underlayVrf |
string | null | The underlay VRF; null = the global table. |
MemoryController#
| Name | Type | Description |
|---|---|---|
correctedErrors |
||
name |
string | |
uncorrectedErrors |
MemoryHealth#
| Name | Type | Description |
|---|---|---|
controllers |
Array<MemoryController> | |
correctedErrors |
||
correctedLastHour |
Corrected errors counted in the last hour — the rate that matters, as the since-boot total only ever grows. | |
health |
string | |
uncorrectedErrors |
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. |
RaidController#
| Name | Type | Description |
|---|---|---|
battery |
string | null | Cache battery / supercap state as the controller reports it; null when absent. |
driver |
string | null | Kernel driver bound to the controller (megaraid_sas, hpsa, smartpqi, ...). |
firmware |
string | null | |
health |
string | The controller's own health only; its drives are judged separately. |
id |
string | Stable identifier: the vendor tool's controller index ("c0") when a provider read it, otherwise the PCI address. Alarm instances are scoped by it. |
lastGoodReadUtc |
string(date-time) | null | When the drive lists were last read in full. On a failed read the previous lists are kept (health "unknown") and this says how stale they are; null if never read. |
message |
string | null | Why the controller cannot be monitored, or what went wrong reading it. |
model |
string | null | |
monitored |
boolean | True when this poll read the controller's state in full. False when there is no provider for it, its tool is missing, the read failed, or it has vanished — in which case any drive lists shown are the last good ones (see DateTime? RaidControllerDto.LastGoodReadUtc). |
pciAddress |
string | null | |
physicalDrives |
Array<RaidPhysicalDrive> | |
provider |
string | null | Provider that read it ("megaraid-cli"), or null when no provider supports it. |
serial |
string | null | |
status |
string | null | The controller's own word for its state ("Optimal", "Needs Attention"). |
tool |
string | null | Full path of the vendor tool that was run, when there is one. |
virtualDrives |
Array<RaidVirtualDrive> |
RaidPhysicalDrive#
| Name | Type | Description |
|---|---|---|
driveGroup |
Drive group (array) the drive belongs to; null for spares and unconfigured drives. | |
firmware |
string | null | |
health |
string | |
id |
string | "c0/e32/s0" — controller, enclosure and slot, in the vendor's addressing. |
interface |
string | null | SATA / SAS / NVMe. |
media |
string | null | SSD / HDD. |
mediaErrors |
||
model |
string | null | |
otherErrors |
||
predictiveFailures |
||
rawState |
string | null | The vendor's own state string ("Onln", "Rbld"). |
rebuildPercent |
Rebuild progress 0-100 while the drive is rebuilding. | |
serial |
string | null | |
sizeBytes |
||
smartAlert |
boolean | null | The drive's own SMART threshold-exceeded flag, as relayed by the controller. |
state |
string | Normalised state: online / rebuilding / hot-spare / unconfigured-good / unconfigured-bad / offline / missing / failed / jbod / copyback / other. |
temperatureC |
RaidStatus#
| Name | Type | Description |
|---|---|---|
collectedAtUtc |
string(date-time) | null | When the last poll finished; null until the first one has run. |
controllers |
Array<RaidController> | |
health |
string | Worst health across every controller, virtual drive and physical drive, or "ok" when the box has no hardware RAID controller at all. |
RaidVirtualDrive#
| Name | Type | Description |
|---|---|---|
health |
string | |
id |
string | "c0/v0" — controller id plus the vendor's virtual-drive number. |
name |
string | null | |
raidLevel |
string | null | |
rawState |
string | null | The vendor's own state string ("Optl", "Dgrd"). |
sizeBytes |
||
state |
string | Normalised state: optimal / degraded / partially-degraded / recovering / offline / unknown. |
RestartResult#
| Name | Type | Description |
|---|---|---|
message |
string | Human-readable detail for display. |
status |
string | Always "restarting" — the request was accepted. |
SensorReading#
| Name | Type | Description |
|---|---|---|
entity |
string | null | What the sensor belongs to ("Power Supply", "Processor", "System Board"). |
health |
string | |
id |
string | Stable identity: the sensor name, suffixed with its number where the BMC reuses a name ("Status #0x62"). |
message |
string | null | What is wrong, when something is. |
name |
string | |
reading |
Numeric reading of a threshold sensor. | |
states |
Array<string> | Asserted states of a discrete sensor ("Presence detected", "Power Supply AC lost"). |
status |
string | null | Threshold status as the BMC reports it ("ok", "Upper Critical"). |
type |
string | temperature / fan / voltage / current / power-supply / processor / memory / drive-slot / physical-security / battery / other. |
unit |
string | null |
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). |
housekeepingCpuBusiestPct |
The busiest single housekeeping core, same interval. One pinned thread (a spinning daemon) shows here long before it moves the mean. | |
housekeepingCpuPct |
Mean CPU busy % over the housekeeping cores — everything except isolated CPUs and data-plane lcores — averaged since the previous status request. What the control plane, FRR and the kernel share, and what can actually run out. | |
housekeepingCpus |
string | null | The housekeeping cores measured, in cpulist form ("0-1,8-9"). |
kernelVersion |
string | null | |
loadAverages |
Array<> | 1/5/15-minute load averages. On a DPDK box each data-plane worker busy-polls its core and adds ~1.0 here permanently, so read double? SystemStatusDto.HousekeepingCpuPct for how busy the host really is. |
memoryAvailableBytes |
||
memoryTotalBytes |
||
osDescription |
string | null | |
rootFsAvailableBytes |
||
rootFsTotalBytes |
||
systemUptimeSeconds |
TraceHop#
| Name | Type | Description |
|---|---|---|
probes |
Array<TraceProbe> | Per-probe detail. Different addresses within one hop mean ECMP. |
ttl |
TTL / hop limit these probes were sent with — the hop number. |
TraceProbe#
| Name | Type | Description |
|---|---|---|
address |
string | null | Who answered, or null if nothing came back. |
annotation |
string | null | Set when the answer was neither Time Exceeded nor an echo reply: `!N`, `!H`, `!X`, `!F-1400`. Null otherwise. |
hostname |
string | null | Reverse-DNS name of `address`, or null when none resolved. |
mplsLabels |
Array<> | MPLS label stack reported by the hop (RFC 4950), outermost first; empty when it reported none. |
probe |
1-based probe number within its hop. | |
rttMs |
Round-trip time in milliseconds, or null if nothing came back. |
TracerouteRequest#
| Name | Type | Description |
|---|---|---|
destination |
string | Address to trace to, IPv4 or IPv6. |
firstTtl |
TTL to start from. | |
maxHops |
Highest TTL to try (capped at 64). | |
probes |
Probes per hop (capped at 5). | |
resolve |
boolean | null | Reverse-resolve each hop's address. Default true. |
size |
ICMP payload bytes (capped). | |
source |
string | null | Address to source from; defaults to that VRF's configured gateway. |
timeoutMs |
Per-probe wait. | |
vrf |
string | null | VRF to trace from; omit for the default table. |
TracerouteResult#
| Name | Type | Description |
|---|---|---|
destination |
string | Address traced to. |
hops |
Array<TraceHop> | Hops in TTL order, ending at the one that ended the trace. |
maxHops |
Highest TTL that would have been tried, after capping. | |
reached |
boolean | True when the destination itself answered. |
source |
string | Address actually sourced from. |
vrf |
string | null | VRF used, or null for the default table. |
TraceStep#
| Name | Type | Description |
|---|---|---|
a |
||
b |
||
stage |
string | |
verdict |
string |
UrpfArmRequest#
| Name | Type | Description |
|---|---|---|
all |
boolean | |
count |
||
seconds |
||
sessionId |
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. |