Skip to content
Skip to content

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:

Authorization: Bearer bngtok_…

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#

Contact: Netavo

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
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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"
    }
}
Schema of the response body

{
    "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"
    }
}
Schema of the response body

{
    "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"
    }
}
Schema of the response body

{
    "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"
    }
}
Schema of the response body

{
    "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"
    }
}
Schema of the response body

{
    "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

{
    "sessionId": null,
    "all": true,
    "count": null,
    "seconds": null
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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

{
    "sessionIndex": null,
    "count": null,
    "seconds": null
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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"
    }
}
Schema of the response body

{
    "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"
    }
}
Schema of the response body

{
    "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"
    }
}
Schema of the response body

{
    "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"
    }
}
Schema of the response body

{
    "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"
    }
}
Schema of the response body

{
    "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"
    }
}
Schema of the response body

{
    "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"
    }
}
Schema of the response body

{
    "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

[
    {
        "reason": "unknown_circuit",
        "count": 12
    }
]
Schema of the response body
{
    "type": "array",
    "items": {
        "$ref": "#/components/schemas/L2DropCount"
    }
}
{
    "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"
    }
}
Schema of the response body

{
    "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

{
    "refreshed": true
}
Schema of the response body
{
    "required": [
        "refreshed"
    ],
    "type": "object",
    "properties": {
        "refreshed": {
            "type": "boolean",
            "description": "Always true — the cached inventory was invalidated."
        }
    },
    "description": "POST /api/v1/system/hardware/refresh result.",
    "example": {
        "refreshed": true
    }
}
{
    "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

{
    "status": "ok"
}
Schema of the response body
{
    "required": [
        "status"
    ],
    "type": "object",
    "properties": {
        "status": {
            "type": "string",
            "description": "Always \"ok\" while the control plane can serve requests."
        }
    },
    "description": "Liveness probe response.",
    "example": {
        "status": "ok"
    }
}

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

[
    {
        "name": "core0",
        "label": "MS3 NNI 2",
        "pciAddress": "0000:5e:00.1",
        "mac": "a4:2b:8c:11:04:02",
        "driver": "vfio-pci",
        "operState": "up",
        "speedMbps": 10000,
        "mtu": 9000,
        "role": "network",
        "owner": "dataplane",
        "vrfMaster": null
    }
]
Schema of the response body
{
    "type": "array",
    "items": {
        "$ref": "#/components/schemas/Interface"
    }
}
{
    "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.