Sessions#
Live subscriber sessions: list/filter, detail with traffic counters, high-resolution live rates, and force-disconnect.
5 operations. Roles, error format and pagination are common to the whole API — see the REST API overview.
Authentication
Use a named bearer token. Every endpoint except POST /api/v1/auth/login,
POST /api/v1/auth/enrol and GET /api/v1/system/health requires one. A super-user creates a
token with POST /api/v1/auth/tokens; the plaintext (bngtok_…) is returned exactly once at
creation and only a SHA-256 hash is stored on the appliance, so a lost token is replaced rather
than recovered. Send it on every request:
Each token carries a fixed role (read-only, operator or super-user) and is exempt from CSRF
checks. This is the single credential you need for scripts, integrations and monitoring.
Accounts and tokens share one identity model with the appliance CLI (login.users). Repeated
authentication failures lock the account/source-IP pair out temporarily (HTTP 423 on login).
Session cookies (bundled web UI only)
The appliance also accepts an interactive session cookie, which is how the bundled web UI authenticates. It is documented for completeness — API clients should not use it. It is bound to a login session and obliges the caller to manage a CSRF token, neither of which suits automation.
POST /api/v1/auth/login with username + password (and a TOTP code when enrolled) sets the
bng_session cookie and returns a csrfToken (also available from GET /api/v1/auth/whoami).
Cookie-authenticated mutating requests (anything other than GET/HEAD/OPTIONS) must also send
that value in the X-CSRF-Token header or they are rejected with 403.
NetavoBNG Management API v1#
Sessions#
GET /api/v1/sessions#
List active sessions (filtered, newest first, paged).
Description
All filters combine with AND. String filters are case-insensitive; username and
ip are prefix/substring matches, the rest are exact. 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. |
encap |
query | string | No | Access encapsulation: ipoe | pppoe-local | pppoe-lac | l2tp. | |
ip |
query | string | No | Prefix match on the assigned IPv4 or IPv6 WAN address. | |
limit |
query | 100 | No | Page size, clamped to 1–500 (default 100). | |
offset |
query | 0 | No | Items to skip from the start of the (filtered, sorted) result. | |
port |
query | No | Subscriber-facing data-plane port id (excludes LNS-terminated sessions). | ||
type |
query | string | No | Session type, e.g. "ipoe" or "ppp". | |
username |
query | string | No | Substring match on the subscriber username. | |
vrf |
query | string | No | Exact VRF name ("default" for the global table). | |
walledGarden |
query | boolean | No | true returns only walled-garden sessions. |
Responses
{
"total": 1842,
"offset": 0,
"items": [
{
"id": 40213,
"type": "ppp",
"encap": "pppoe-local",
"username": "alice@example.net",
"ipv4": "100.64.12.37",
"ipv6": "2001:db8:64:12::1",
"vrf": "residential",
"mac": "a4:2b:8c:11:9f:03",
"svlan": 101,
"vlan": 1337,
"plan": "fibre-900",
"walledGarden": false,
"uptimeSeconds": 86412.538912
}
]
}
Schema of the response body
{
"required": [
"total",
"offset",
"items"
],
"type": "object",
"properties": {
"total": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Total sessions matching the filters (before paging).",
"format": "int32"
},
"offset": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "The offset this page was taken at.",
"format": "int32"
},
"items": {
"type": "array",
"items": {
"$ref": "#/components/schemas/SessionSummary"
},
"description": "The page of session summaries, newest session first."
}
},
"description": "GET /api/v1/sessions — one page of the filtered session list.",
"example": {
"total": 1842,
"offset": 0,
"items": [
{
"id": 40213,
"type": "ppp",
"encap": "pppoe-local",
"username": "alice@example.net",
"ipv4": "100.64.12.37",
"ipv6": "2001:db8:64:12::1",
"vrf": "residential",
"mac": "a4:2b:8c:11:9f:03",
"svlan": 101,
"vlan": 1337,
"plan": "fibre-900",
"walledGarden": false,
"uptimeSeconds": 86412.538912
}
]
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#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/sessions/summary#
Session counts for dashboard tiles.
Description
Returns the total number of active subscriber sessions plus breakdowns by session type, access encapsulation, subscriber-facing port, and VRF, and the number of sessions currently in the walled garden. Cheap to poll; 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
{
"total": 1842,
"byType": {
"ppp": 1503,
"ipoe": 339
},
"byEncap": {
"pppoe-local": 1200,
"l2tp": 303,
"ipoe": 339
},
"byPort": [
{
"portId": 0,
"label": "xe-0/0/0",
"count": 1503
}
],
"byVrf": {
"residential": 1789,
"default": 53
},
"walledGarden": 7
}
Schema of the response body
{
"required": [
"total",
"byType",
"byEncap",
"byPort",
"byVrf",
"walledGarden"
],
"type": "object",
"properties": {
"total": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Number of active subscriber sessions.",
"format": "int32"
},
"byType": {
"type": "object",
"additionalProperties": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32"
},
"description": "Session count per session type (e.g. \"ipoe\", \"ppp\")."
},
"byEncap": {
"type": "object",
"additionalProperties": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32"
},
"description": "Session count per access encapsulation (ipoe | pppoe-local | pppoe-lac | l2tp)."
},
"byPort": {
"type": "array",
"items": {
"$ref": "#/components/schemas/PortSessionCount"
},
"description": "Session count per subscriber-facing port (LNS-terminated sessions excluded)."
},
"byVrf": {
"type": "object",
"additionalProperties": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32"
},
"description": "Session count per VRF; sessions in the global table count under \"default\"."
},
"walledGarden": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Number of sessions currently redirected to the walled garden.",
"format": "int32"
}
},
"description": "GET /api/v1/sessions/summary — dashboard counts over the active sessions.",
"example": {
"total": 1842,
"byType": {
"ppp": 1503,
"ipoe": 339
},
"byEncap": {
"pppoe-local": 1200,
"l2tp": 303,
"ipoe": 339
},
"byPort": [
{
"portId": 0,
"label": "xe-0/0/0",
"count": 1503
}
],
"byVrf": {
"residential": 1789,
"default": 53
},
"walledGarden": 7
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#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/sessions/{id}#
Full detail for one active session.
Description
Includes addressing, VLANs, service plan, live data-plane traffic counters and — for L2TP-carried sessions — the tunnel endpoints. Fields that don't apply to the session's encapsulation 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. |
id |
path | No | The BNG session id (from the list endpoint). |
Responses
{
"id": 40213,
"type": "ppp",
"encap": "pppoe-local",
"username": "alice@example.net",
"ipv4": "100.64.12.37",
"ipv6": "2001:db8:64:12::1",
"ipv6PdPrefix": "2001:db8:1234:5600::/56",
"vrf": "residential",
"mac": "a4:2b:8c:11:9f:03",
"svlan": 101,
"vlan": 1337,
"portId": 0,
"portLabel": "xe-0/0/0",
"plan": "fibre-900",
"walledGarden": false,
"pppoeSessionId": 4118,
"additionalRoutes": [
"198.51.100.64/29"
],
"traffic": {
"bytesIn": 184320000,
"bytesOut": 2216755200,
"packetsIn": 812004,
"packetsOut": 1904321,
"dropsUrpf": 0,
"dropsRateLimit": 152
},
"createdUtc": "2026-08-02T10:24:00Z",
"lastActivityUtc": "2026-08-03T10:23:58Z",
"uptimeSeconds": 86412.538912,
"sessionTimeoutSeconds": 0,
"idleTimeoutSeconds": 1800,
"l2tp": null
}
Schema of the response body
{
"type": "object",
"properties": {
"id": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "BNG session id.",
"format": "uint32"
},
"type": {
"type": "string",
"description": "Session type: \"ipoe\" or \"ppp\"."
},
"encap": {
"type": "string",
"description": "Access encapsulation — drives which fields apply (requirements 21.7):\n ipoe | pppoe-local | pppoe-lac | l2tp (LNS-terminated, subscriber behind a LAC)."
},
"username": {
"type": "string",
"description": "Subscriber username."
},
"ipv4": {
"type": "string",
"description": "Assigned IPv4 address, or null if IPv6-only.",
"nullable": true
},
"ipv6": {
"type": "string",
"description": "IPv6 WAN address, or null.",
"nullable": true
},
"ipv6PdPrefix": {
"type": "string",
"description": "Delegated IPv6 prefix (DHCPv6-PD), or null.",
"nullable": true
},
"vrf": {
"type": "string",
"description": "VRF carrying the session (\"default\" = global table)."
},
"mac": {
"type": "string",
"description": "Subscriber MAC address, or null when unknown.",
"nullable": true
},
"svlan": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Outer (service) VLAN id; 0 when untagged.",
"format": "uint16"
},
"vlan": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Inner (customer) VLAN id; 0 when untagged.",
"format": "uint16"
},
"portId": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Data-plane port the session terminates on.",
"format": "uint8"
},
"portLabel": {
"type": "string",
"description": "Operator-friendly label for that port, or null.",
"nullable": true
},
"plan": {
"type": "string",
"description": "Service plan name, or null.",
"nullable": true
},
"walledGarden": {
"type": "boolean",
"description": "True while the session is redirected to the walled garden."
},
"pppoeSessionId": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "PPPoE session id on the access side, or null for non-PPPoE sessions.",
"format": "uint16",
"nullable": true
},
"additionalRoutes": {
"type": "array",
"items": {
"type": "string"
},
"description": "Extra framed routes installed for this subscriber, as \"prefix/len\" strings."
},
"traffic": {
"oneOf": [
{
"nullable": true
},
{
"$ref": "#/components/schemas/SessionTraffic"
}
]
},
"createdUtc": {
"type": "string",
"description": "UTC time the session was established.",
"format": "date-time"
},
"lastActivityUtc": {
"type": "string",
"description": "UTC time of the last packet seen from the subscriber.",
"format": "date-time"
},
"uptimeSeconds": {
"pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
"description": "Seconds since the session was established.",
"format": "double"
},
"sessionTimeoutSeconds": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "RADIUS Session-Timeout being enforced; 0 = none.",
"format": "uint32"
},
"idleTimeoutSeconds": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "RADIUS Idle-Timeout being enforced; 0 = none.",
"format": "uint32"
},
"l2tp": {
"oneOf": [
{
"nullable": true
},
{
"$ref": "#/components/schemas/SessionL2tp"
}
]
}
},
"description": "GET /api/v1/sessions/{id} — full detail for one session.",
"example": {
"id": 40213,
"type": "ppp",
"encap": "pppoe-local",
"username": "alice@example.net",
"ipv4": "100.64.12.37",
"ipv6": "2001:db8:64:12::1",
"ipv6PdPrefix": "2001:db8:1234:5600::/56",
"vrf": "residential",
"mac": "a4:2b:8c:11:9f:03",
"svlan": 101,
"vlan": 1337,
"portId": 0,
"portLabel": "xe-0/0/0",
"plan": "fibre-900",
"walledGarden": false,
"pppoeSessionId": 4118,
"additionalRoutes": [
"198.51.100.64/29"
],
"traffic": {
"bytesIn": 184320000,
"bytesOut": 2216755200,
"packetsIn": 812004,
"packetsOut": 1904321,
"dropsUrpf": 0,
"dropsRateLimit": 152
},
"createdUtc": "2026-08-02T10:24:00Z",
"lastActivityUtc": "2026-08-03T10:23:58Z",
"uptimeSeconds": 86412.538912,
"sessionTimeoutSeconds": 0,
"idleTimeoutSeconds": 1800,
"l2tp": null
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
"type": "object",
"properties": {
"type": {
"type": "string",
"nullable": true
},
"title": {
"type": "string",
"nullable": true
},
"status": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"format": "int32",
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"instance": {
"type": "string",
"nullable": true
}
},
"example": {
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "VRF not found",
"status": 404,
"detail": "No VRF named 'wholesale-b' is configured.",
"instance": "/api/v1/vrfs/wholesale-b"
}
}
DELETE /api/v1/sessions/{id}#
Force-disconnect a session.
Description
Tears the session down exactly like the CLI request subscribers disconnect
command: the subscriber is disconnected, accounting Stop is emitted, and the action is
written to the audit log with the acting identity. Requires the operator role (or above);
local appliance only — not available through the fleet proxy.
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. |
id |
path | No | The BNG session id to disconnect. |
Responses
Schema of the response body
{
"required": [
"status",
"id",
"username"
],
"type": "object",
"properties": {
"status": {
"type": "string",
"description": "Always \"disconnected\"."
},
"id": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "The disconnected session's id.",
"format": "uint32"
},
"username": {
"type": "string",
"description": "The disconnected subscriber's username."
}
},
"description": "DELETE /api/v1/sessions/{id} result.",
"example": {
"status": "disconnected",
"id": 40213,
"username": "alice@example.net"
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#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/sessions/{id}/live#
High-resolution live traffic rates for one session.
Description
2-second samples for the session-detail live chart (requirements: watched
sessions). Polling this endpoint IS the watch keepalive — the appliance samples a session
only while something polls it, so the first call may return an empty series. Returns
parallel arrays keyed by the shared times axis. Fleet-proxyable (watching a remote
appliance's session registers the watch on that appliance).
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. |
id |
path | No | The BNG session id. |
Responses
{
"intervalSeconds": 5,
"times": [
"2026-08-03T10:24:00Z",
"2026-08-03T10:24:05Z"
],
"rxBps": [
18422137.6,
17980412.8
],
"txBps": [
214880993.6,
221304476.8
],
"rxPps": [
2140.4,
2098.2
],
"txPps": [
19040.8,
19422.6
]
}
Schema of the response body
{
"required": [
"intervalSeconds",
"times",
"rxBps",
"txBps",
"rxPps",
"txPps"
],
"type": "object",
"properties": {
"intervalSeconds": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"description": "Sampling interval of the series (seconds).",
"format": "int32"
},
"times": {
"type": "array",
"items": {
"type": "string",
"format": "date-time"
},
"description": "UTC sample timestamps; all rate arrays align to this axis."
},
"rxBps": {
"type": "array",
"items": {
"pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
"format": "double"
},
"description": "Bits/second received from the subscriber (upload)."
},
"txBps": {
"type": "array",
"items": {
"pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
"format": "double"
},
"description": "Bits/second sent to the subscriber (download)."
},
"rxPps": {
"type": "array",
"items": {
"pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
"format": "double"
},
"description": "Packets/second received from the subscriber."
},
"txPps": {
"type": "array",
"items": {
"pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
"format": "double"
},
"description": "Packets/second sent to the subscriber."
}
},
"description": "GET /api/v1/sessions/{id}/live — parallel rate series keyed by the shared\n List<DateTime> SessionLiveRatesDto.Times axis. Arrays are empty until the watch has collected samples.",
"example": {
"intervalSeconds": 5,
"times": [
"2026-08-03T10:24:00Z",
"2026-08-03T10:24:05Z"
],
"rxBps": [
18422137.6,
17980412.8
],
"txBps": [
214880993.6,
221304476.8
],
"rxPps": [
2140.4,
2098.2
],
"txPps": [
19040.8,
19422.6
]
}
}
{
"type": "https://tools.ietf.org/html/rfc9110#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"
}
}
Schemas#
PortSessionCount#
| Name | Type | Description |
|---|---|---|
count |
Active sessions on this port. | |
label |
string | null | Operator-friendly port label from config (label/ifname/PCI), or null. |
portId |
Data-plane port id (subscriber interfaces first, then network interfaces). |
ProblemDetails#
| Name | Type | Description |
|---|---|---|
detail |
string | null | |
instance |
string | null | |
status |
||
title |
string | null | |
type |
string | null |
SessionDetail#
| Name | Type | Description |
|---|---|---|
additionalRoutes |
Array<string> | Extra framed routes installed for this subscriber, as "prefix/len" strings. |
createdUtc |
string(date-time) | UTC time the session was established. |
encap |
string | Access encapsulation — drives which fields apply (requirements 21.7): ipoe | pppoe-local | pppoe-lac | l2tp (LNS-terminated, subscriber behind a LAC). |
id |
BNG session id. | |
idleTimeoutSeconds |
RADIUS Idle-Timeout being enforced; 0 = none. | |
ipv4 |
string | null | Assigned IPv4 address, or null if IPv6-only. |
ipv6 |
string | null | IPv6 WAN address, or null. |
ipv6PdPrefix |
string | null | Delegated IPv6 prefix (DHCPv6-PD), or null. |
l2tp |
||
lastActivityUtc |
string(date-time) | UTC time of the last packet seen from the subscriber. |
mac |
string | null | Subscriber MAC address, or null when unknown. |
plan |
string | null | Service plan name, or null. |
portId |
Data-plane port the session terminates on. | |
portLabel |
string | null | Operator-friendly label for that port, or null. |
pppoeSessionId |
PPPoE session id on the access side, or null for non-PPPoE sessions. | |
sessionTimeoutSeconds |
RADIUS Session-Timeout being enforced; 0 = none. | |
svlan |
Outer (service) VLAN id; 0 when untagged. | |
traffic |
||
type |
string | Session type: "ipoe" or "ppp". |
uptimeSeconds |
Seconds since the session was established. | |
username |
string | Subscriber username. |
vlan |
Inner (customer) VLAN id; 0 when untagged. | |
vrf |
string | VRF carrying the session ("default" = global table). |
walledGarden |
boolean | True while the session is redirected to the walled garden. |
SessionDisconnectResult#
| Name | Type | Description |
|---|---|---|
id |
The disconnected session's id. | |
status |
string | Always "disconnected". |
username |
string | The disconnected subscriber's username. |
SessionL2tp#
| Name | Type | Description |
|---|---|---|
localSessionId |
Session id inside the tunnel on this appliance. | |
localTunnelId |
Tunnel id on this appliance. | |
peerIp |
string | null | Peer tunnel endpoint IP, or null when unknown. |
peerSessionId |
Session id on the peer. | |
peerTunnelId |
Tunnel id on the peer (LAC or LNS). | |
remoteHostname |
string | null | The peer's L2TP Host Name AVP, or null when unknown. |
SessionListPage#
| Name | Type | Description |
|---|---|---|
items |
Array<SessionSummary> | The page of session summaries, newest session first. |
offset |
The offset this page was taken at. | |
total |
Total sessions matching the filters (before paging). |
SessionLiveRates#
| Name | Type | Description |
|---|---|---|
intervalSeconds |
Sampling interval of the series (seconds). | |
rxBps |
Array<> | Bits/second received from the subscriber (upload). |
rxPps |
Array<> | Packets/second received from the subscriber. |
times |
Array<string(date-time)> | UTC sample timestamps; all rate arrays align to this axis. |
txBps |
Array<> | Bits/second sent to the subscriber (download). |
txPps |
Array<> | Packets/second sent to the subscriber. |
SessionsSummary#
| Name | Type | Description |
|---|---|---|
byEncap |
Session count per access encapsulation (ipoe | pppoe-local | pppoe-lac | l2tp). | |
byPort |
Array<PortSessionCount> | Session count per subscriber-facing port (LNS-terminated sessions excluded). |
byType |
Session count per session type (e.g. "ipoe", "ppp"). | |
byVrf |
Session count per VRF; sessions in the global table count under "default". | |
total |
Number of active subscriber sessions. | |
walledGarden |
Number of sessions currently redirected to the walled garden. |
SessionSummary#
| Name | Type | Description |
|---|---|---|
encap |
string | Access encapsulation: ipoe | pppoe-local | pppoe-lac | l2tp (LNS-terminated). |
id |
BNG session id — the key for the detail/live/disconnect endpoints. | |
ipv4 |
string | null | Assigned IPv4 address, or null if the session is IPv6-only. |
ipv6 |
string | null | IPv6 WAN address, or null if not dual-stack. |
mac |
string | null | Subscriber MAC address (aa:bb:cc:dd:ee:ff), or null when unknown. |
plan |
string | null | Service plan name, or null when no plan is applied. |
svlan |
Outer (service) VLAN id; 0 when untagged. | |
type |
string | Session type: "ipoe" or "ppp". |
uptimeSeconds |
Seconds since the session was established. | |
username |
string | Subscriber username (PPP username, or the IPoE circuit identity). |
vlan |
Inner (customer) VLAN id; 0 when untagged. | |
vrf |
string | VRF carrying the session ("default" = global table). |
walledGarden |
boolean | True while the session is redirected to the walled garden. |
SessionTraffic#
| Name | Type | Description |
|---|---|---|
bytesIn |
Bytes received from the subscriber. | |
bytesOut |
Bytes sent to the subscriber. | |
dropsRateLimit |
Packets dropped by the plan rate limiter. | |
dropsUrpf |
Upstream packets dropped by the uRPF source check. | |
packetsIn |
Packets received from the subscriber. | |
packetsOut |
Packets sent to the subscriber. |
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 |
|---|---|
| Sessions | Live subscriber sessions: list/filter, detail with traffic counters, high-resolution live rates, and force-disconnect. |