Skip to content
Skip to content

Configuration#

Schema-driven appliance configuration: read, validate, commit, history, and rollback — the same candidate/commit pipeline as the CLI.

13 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

Configuration#


GET /api/v1/config#

Current configuration values (secrets redacted).

Description

Every field of the active configuration keyed by its schema path. List-mode fields join their elements with newlines; secret fields return the redaction placeholder (write the placeholder back to mean "unchanged"). Keyed lists (e.g. RADIUS servers, login users) return one item per key with the child values keyed by child path. Where the key is itself a secret — an SNMP read-only community — it is returned to the super-user, who needs it to edit the entry, and as a numbered placeholder to every other role. A URL can carry a credential in its userinfo, path or query: the super-user gets it whole, every other role gets scheme://host[:port]/##SECRET-DATA##. The accounts and sign-in configuration (system login …, web-ui auth …) are returned to the super-user only; for other roles those paths are absent, as they are from the schema.

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

{
    "fields": {
        "syslog enabled": "true",
        "syslog server": "10.20.2.40"
    },
    "lists": {
        "auth radius server": [
            {
                "key": "10.20.2.31",
                "values": {
                    "auth radius server authPort": "1812",
                    "auth radius server secret": "********"
                }
            }
        ]
    }
}
Schema of the response body
{
    "required": [
        "fields",
        "lists"
    ],
    "type": "object",
    "properties": {
        "fields": {
            "type": "object",
            "additionalProperties": {
                "type": "string"
            },
            "description": "Field values keyed by schema path (secrets redacted; list fields joined\n            with newlines; null = unset)."
        },
        "lists": {
            "type": "object",
            "additionalProperties": {
                "type": "array",
                "items": {
                    "$ref": "#/components/schemas/ConfigListItem"
                }
            },
            "description": "Keyed-list contents keyed by list path."
        }
    },
    "description": "GET /api/v1/config response — the active configuration's values.",
    "example": {
        "fields": {
            "syslog enabled": "true",
            "syslog server": "10.20.2.40"
        },
        "lists": {
            "auth radius server": [
                {
                    "key": "10.20.2.31",
                    "values": {
                        "auth radius server authPort": "1812",
                        "auth radius server secret": "********"
                    }
                }
            ]
        }
    }
}
{
    "type": "https://tools.ietf.org/html/rfc9110#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"
    }
}

PUT /api/v1/config#

Apply a change set (validate + commit).

Description

Runs the CLI's commit pipeline: exclusive candidate edit → validate → atomic persist → hot-apply event. Hot-appliable sections take effect immediately; others (see the schema's requiresRestart) need a restart. The previous version goes into the rollback history. Super-user only; local appliance 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

{
    "fields": {
        "syslog enabled": "true",
        "syslog server": "10.20.2.40"
    },
    "listOps": [
        {
            "listPath": "auth radius server",
            "key": "10.20.2.31",
            "delete": false,
            "fields": {
                "auth radius server authPort": "1812",
                "auth radius server secret": "s3cr3t"
            }
        }
    ],
    "comment": "point syslog at the new collector"
}

Other accepted types: application/*+json, text/json

Schema of the request body
{
    "required": [
        "fields",
        "listOps",
        "comment"
    ],
    "type": "object",
    "properties": {
        "fields": {
            "type": "object",
            "additionalProperties": {
                "type": "string"
            },
            "description": "Field writes keyed by schema `path`. null clears a field; list-mode\n            fields take newline/comma-separated elements with replace semantics; a secret field set to\n            the redaction placeholder is left unchanged.",
            "nullable": true
        },
        "listOps": {
            "type": "array",
            "items": {
                "$ref": "#/components/schemas/KeyedListOp"
            },
            "description": "Keyed-list operations (add/update/delete items such as RADIUS\n            servers or login users).",
            "nullable": true
        },
        "comment": {
            "type": "string",
            "description": "Commit comment recorded in the config history (apply only).",
            "nullable": true
        }
    },
    "description": "A batch of configuration changes (the body of validate and apply).",
    "example": {
        "fields": {
            "syslog enabled": "true",
            "syslog server": "10.20.2.40"
        },
        "listOps": [
            {
                "listPath": "auth radius server",
                "key": "10.20.2.31",
                "delete": false,
                "fields": {
                    "auth radius server authPort": "1812",
                    "auth radius server secret": "s3cr3t"
                }
            }
        ],
        "comment": "point syslog at the new collector"
    }
}

Responses

{
    "status": "committed",
    "committedUtc": "2026-08-03T10:24:11Z",
    "confirmDeadlineUtc": null,
    "confirmNotice": null
}
Schema of the response body
{
    "required": [
        "status",
        "committedUtc"
    ],
    "type": "object",
    "properties": {
        "status": {
            "type": "string",
            "description": "Always \"committed\"."
        },
        "committedUtc": {
            "type": "string",
            "description": "UTC timestamp the new configuration version became active.",
            "format": "date-time",
            "nullable": true
        },
        "confirmDeadlineUtc": {
            "type": "string",
            "description": "Deadline of an existing rollback, if still pending.",
            "format": "date-time",
            "nullable": true
        },
        "confirmNotice": {
            "type": "string",
            "description": "Operator notice when this commit confirms a pending rollback.",
            "nullable": true
        }
    },
    "description": "PUT /api/v1/config result.",
    "example": {
        "status": "committed",
        "committedUtc": "2026-08-03T10:24:11Z",
        "confirmDeadlineUtc": null,
        "confirmNotice": 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"
    }
}
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/config/cache-refresh#

Refresh the subscriber cache from the subscriber source now.

Description

Runs one pass of the subscriber refresh - the pass the timer runs every auth.database.cacheRefreshIntervalSeconds - and returns what it did: rows loaded, whether the load was believed, and the sessions re-policed, ended or held. refreshed: false means nothing was applied (no source configured, the source could not be read, or the load was not believed); detail says which. A session whose row has gone is still ended only when two loads in a row say so. Audited. Super-user only; local appliance 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.

Responses

{
    "refreshed": true,
    "detail": "Loaded 451 row(s) from SQL (bng.BroadbandSubscribers); applied.\nSessions: 1 re-policed, 0 ended, 0 adopted.",
    "rows": 451,
    "acceptedRows": 451,
    "suspect": false,
    "rePoliced": 1,
    "ended": 0,
    "adopted": 0,
    "awaitingConfirmation": 0,
    "deferredByLimit": 0,
    "heldForUnreadableRows": 0,
    "failedEnds": 0,
    "guestsDeferred": 0,
    "errors": 0
}
Schema of the response body
{
    "required": [
        "refreshed"
    ],
    "type": "object",
    "properties": {
        "refreshed": {
            "type": "boolean",
            "description": "True when the source was read and the load applied. False when there\n            is no source, it could not be read, or the load was read and not believed\n            (Suspect); Detail says which."
        },
        "detail": {
            "type": "string",
            "description": "The outcome in words, as the CLI prints it.",
            "nullable": true
        },
        "rows": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "description": "Rows the load returned.",
            "format": "int32",
            "default": 0
        },
        "acceptedRows": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "description": "Rows in the view now being served.",
            "format": "int32",
            "default": 0
        },
        "suspect": {
            "type": "boolean",
            "description": "True when the load was read and not applied: it was empty, or had lost\n            more rows - or had more rows turn non-active - than a load plausibly does. Nobody is\n            disconnected and new and changed subscribers are not applied either; accept it with\n            `request subscribers source accept` if it is right.",
            "default": false
        },
        "rePoliced": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "description": "Live sessions whose state or rates were changed.",
            "format": "int32",
            "default": 0
        },
        "ended": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "description": "Live sessions ended.",
            "format": "int32",
            "default": 0
        },
        "adopted": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "description": "Guest sessions adopted by a line.",
            "format": "int32",
            "default": 0
        },
        "awaitingConfirmation": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "description": "Sessions with no authority that are ended only if the next\n            refresh agrees.",
            "format": "int32",
            "default": 0
        },
        "deferredByLimit": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "description": "Sessions not ended because the limit for one refresh was\n            reached.",
            "format": "int32",
            "default": 0
        },
        "heldForUnreadableRows": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "description": "Sessions left alone because the source had a row for them\n            that could not be read.",
            "format": "int32",
            "default": 0
        },
        "failedEnds": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "description": "Sessions whose disconnect failed; tried again at the next refresh.",
            "format": "int32",
            "default": 0
        },
        "guestsDeferred": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "description": "Guest sessions left for the next refresh: this one had adopted or\n            ended as many guests as one refresh may.",
            "format": "int32",
            "default": 0
        },
        "errors": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "description": "Sessions that could not be reconciled because of a fault; the rest were.",
            "format": "int32",
            "default": 0
        }
    },
    "description": "POST /api/v1/config/cache-refresh result: what one pass of the subscriber refresh\n            did.",
    "example": {
        "refreshed": true,
        "detail": "Loaded 451 row(s) from SQL (bng.BroadbandSubscribers); applied.\nSessions: 1 re-policed, 0 ended, 0 adopted.",
        "rows": 451,
        "acceptedRows": 451,
        "suspect": false,
        "rePoliced": 1,
        "ended": 0,
        "adopted": 0,
        "awaitingConfirmation": 0,
        "deferredByLimit": 0,
        "heldForUnreadableRows": 0,
        "failedEnds": 0,
        "guestsDeferred": 0,
        "errors": 0
    }
}
{
    "type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
    "title": "VRF not found",
    "status": 404,
    "detail": "No VRF named 'wholesale-b' is configured.",
    "instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
    "type": "object",
    "properties": {
        "type": {
            "type": "string",
            "nullable": true
        },
        "title": {
            "type": "string",
            "nullable": true
        },
        "status": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "format": "int32",
            "nullable": true
        },
        "detail": {
            "type": "string",
            "nullable": true
        },
        "instance": {
            "type": "string",
            "nullable": true
        }
    },
    "example": {
        "type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
        "title": "VRF not found",
        "status": 404,
        "detail": "No VRF named 'wholesale-b' is configured.",
        "instance": "/api/v1/vrfs/wholesale-b"
    }
}
{
    "type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
    "title": "VRF not found",
    "status": 404,
    "detail": "No VRF named 'wholesale-b' is configured.",
    "instance": "/api/v1/vrfs/wholesale-b"
}
Schema of the response body
{
    "type": "object",
    "properties": {
        "type": {
            "type": "string",
            "nullable": true
        },
        "title": {
            "type": "string",
            "nullable": true
        },
        "status": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "format": "int32",
            "nullable": true
        },
        "detail": {
            "type": "string",
            "nullable": true
        },
        "instance": {
            "type": "string",
            "nullable": true
        }
    },
    "example": {
        "type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
        "title": "VRF not found",
        "status": 404,
        "detail": "No VRF named 'wholesale-b' is configured.",
        "instance": "/api/v1/vrfs/wholesale-b"
    }
}

GET /api/v1/config/confirm#

Whether a confirmed commit is waiting to be confirmed.

Description

A commit made with a confirm window — an import with action: "commitConfirm", or commit confirm at the CLI — rolls back at deadlineUtc unless any authorized operator commits first (CLI, web UI, API, import or account changes). Internal token-use and login bookkeeping never confirm it. The deadline survives control-plane restarts.

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

{
    "pending": true,
    "deadlineUtc": "2026-10-01T12:10:00Z"
}
Schema of the response body
{
    "required": [
        "pending",
        "deadlineUtc"
    ],
    "type": "object",
    "properties": {
        "pending": {
            "type": "boolean",
            "description": "True while a commit made with a confirm window awaits confirmation."
        },
        "deadlineUtc": {
            "type": "string",
            "description": "When it rolls back unless confirmed; null when none is pending.",
            "format": "date-time",
            "nullable": true
        }
    },
    "description": "Whether a confirmed commit is pending.",
    "example": {
        "pending": true,
        "deadlineUtc": "2026-10-01T12:10:00Z"
    }
}
{
    "type": "https://tools.ietf.org/html/rfc9110#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/config/confirm#

Confirm a pending confirmed commit, cancelling its automatic rollback.

Description

Makes the configuration committed with a confirm window permanent. Super-user only; local appliance only. Any authorized operator may confirm, regardless of who started it.

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

{
    "pending": true,
    "deadlineUtc": "2026-10-01T12:10:00Z"
}
Schema of the response body
{
    "required": [
        "pending",
        "deadlineUtc"
    ],
    "type": "object",
    "properties": {
        "pending": {
            "type": "boolean",
            "description": "True while a commit made with a confirm window awaits confirmation."
        },
        "deadlineUtc": {
            "type": "string",
            "description": "When it rolls back unless confirmed; null when none is pending.",
            "format": "date-time",
            "nullable": true
        }
    },
    "description": "Whether a confirmed commit is pending.",
    "example": {
        "pending": true,
        "deadlineUtc": "2026-10-01T12:10:00Z"
    }
}
{
    "type": "https://tools.ietf.org/html/rfc9110#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/config/export#

Export a redacted backup of the active configuration.

Description

The whole configuration with every secret replaced by a placeholder — safe to hand to support, and what any signed-in role can already read through GET /api/v1/config. It restores only onto a box that already holds the secrets: on import each placeholder takes the value the target has at the same path. For a backup that can rebuild a box, use the encrypted export. Audited.

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

{
    "fileName": "lns1-config-encrypted-20261001T120000Z.json",
    "kind": "encrypted",
    "backup": "{ \"format\": \"netavo-config-backup\", \"formatVersion\": 1, \"kind\": \"encrypted\", … }"
}
Schema of the response body
{
    "required": [
        "fileName",
        "kind",
        "backup"
    ],
    "type": "object",
    "properties": {
        "fileName": {
            "type": "string",
            "description": "A name to save it under: host, kind and time of export."
        },
        "kind": {
            "type": "string",
            "description": "\"redacted\" or \"encrypted\"."
        },
        "backup": {
            "type": "string",
            "description": "The backup itself — a JSON document, as text. Save it as it is; it is\n            what `POST /api/v1/config/import` and the CLI's `load override` take."
        }
    },
    "description": "A configuration backup, as an export returns it.",
    "example": {
        "fileName": "lns1-config-encrypted-20261001T120000Z.json",
        "kind": "encrypted",
        "backup": "{ \"format\": \"netavo-config-backup\", \"formatVersion\": 1, \"kind\": \"encrypted\", … }"
    }
}
{
    "type": "https://tools.ietf.org/html/rfc9110#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/config/export#

Export an encrypted backup of the active configuration.

Description

The whole configuration, secrets included, encrypted with AES-256-GCM under a key derived from the passphrase (PBKDF2-HMAC-SHA256); the envelope's header is authenticated with it. This is the backup that restores a replacement box. The passphrase travels in the request body, never the URL, and is neither stored nor logged — a backup whose passphrase is lost cannot be opened. Audited. Super-user 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

{
    "passphrase": "correct horse battery staple"
}

Other accepted types: application/*+json, text/json

Schema of the request body
{
    "required": [
        "passphrase"
    ],
    "type": "object",
    "properties": {
        "passphrase": {
            "type": "string",
            "description": "The passphrase the backup is encrypted under: at least 12\n            characters. It is not stored and cannot be recovered.",
            "nullable": true
        }
    },
    "description": "POST /api/v1/config/export body.",
    "example": {
        "passphrase": "correct horse battery staple"
    }
}

Responses

{
    "fileName": "lns1-config-encrypted-20261001T120000Z.json",
    "kind": "encrypted",
    "backup": "{ \"format\": \"netavo-config-backup\", \"formatVersion\": 1, \"kind\": \"encrypted\", … }"
}
Schema of the response body
{
    "required": [
        "fileName",
        "kind",
        "backup"
    ],
    "type": "object",
    "properties": {
        "fileName": {
            "type": "string",
            "description": "A name to save it under: host, kind and time of export."
        },
        "kind": {
            "type": "string",
            "description": "\"redacted\" or \"encrypted\"."
        },
        "backup": {
            "type": "string",
            "description": "The backup itself — a JSON document, as text. Save it as it is; it is\n            what `POST /api/v1/config/import` and the CLI's `load override` take."
        }
    },
    "description": "A configuration backup, as an export returns it.",
    "example": {
        "fileName": "lns1-config-encrypted-20261001T120000Z.json",
        "kind": "encrypted",
        "backup": "{ \"format\": \"netavo-config-backup\", \"formatVersion\": 1, \"kind\": \"encrypted\", … }"
    }
}
{
    "type": "https://tools.ietf.org/html/rfc9110#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/config/history#

Configuration version history (rollback points).

Description

Newest first: version number, commit time, comment and committing identity. Any version listed here can be restored with POST /api/v1/config/rollback.

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

[
    {
        "version": 42,
        "committedUtc": "2026-08-03T10:24:11Z",
        "comment": "point syslog at the new collector",
        "username": "noc-alice"
    }
]
Schema of the response body
{
    "type": "array",
    "items": {
        "$ref": "#/components/schemas/ConfigVersion"
    }
}
{
    "type": "https://tools.ietf.org/html/rfc9110#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/config/import#

Import a backup: preview it, or restore it.

Description

The backup is loaded into the candidate configuration and validated — never written to the active configuration directly. The response reports what it would change before anything is committed: the diff (secrets redacted), the secrets that differ, and the box-specific values (hostname, router id, management addresses, data-plane ports…) that differ from this box. With action: "preview" that is all; "commit" and "commitConfirm" then commit it as any other change is committed.

         A **redacted** backup holds no secrets: each placeholder takes the secret this box holds
         at the same path (`secretsKept`). One with no counterpart is `secretsMissing`, and an
         import with missing secrets can be previewed but not committed here.

         A backup from another release is read as that release's `config.json` would be at
         start-up; one holding a setting this release does not know is refused, naming it. A
         wrong passphrase, or a file altered since it was exported, is refused; nothing is
         loaded. Every attempt is audited. Super-user only; local appliance 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

{
    "backup": "{ \"format\": \"netavo-config-backup\", … }",
    "passphrase": "correct horse battery staple",
    "action": "preview",
    "confirmMinutes": 10,
    "comment": "restore after disk replacement"
}

Other accepted types: application/*+json, text/json

Schema of the request body
{
    "required": [
        "backup",
        "passphrase",
        "action",
        "confirmMinutes",
        "comment"
    ],
    "type": "object",
    "properties": {
        "backup": {
            "type": "string",
            "description": "The backup, as text — the `backup` an export returned, or the\n            contents of the file it was saved to.",
            "nullable": true
        },
        "passphrase": {
            "type": "string",
            "description": "The passphrase of an encrypted backup. Ignored for a redacted\n            one.",
            "nullable": true
        },
        "action": {
            "type": "string",
            "description": "\"preview\" (the default): validate and report, change nothing.\n            \"commit\": validate and commit. \"commitConfirm\": commit, and roll back automatically\n            unless any authorized operator commits or calls `POST /api/v1/config/confirm` within `confirmMinutes`.",
            "nullable": true
        },
        "confirmMinutes": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "description": "The confirm window for \"commitConfirm\" (default 10).",
            "format": "int32",
            "nullable": true
        },
        "comment": {
            "type": "string",
            "description": "Commit comment recorded in the history; defaults to \"restore from\n            backup of <hostname> (<exported>)\".",
            "nullable": true
        }
    },
    "description": "POST /api/v1/config/import body.",
    "example": {
        "backup": "{ \"format\": \"netavo-config-backup\", … }",
        "passphrase": "correct horse battery staple",
        "action": "preview",
        "confirmMinutes": 10,
        "comment": "restore after disk replacement"
    }
}

Responses

{
    "status": "previewed",
    "origin": {
        "kind": "encrypted",
        "product": "netavo-bng",
        "softwareVersion": "1.0.0 (192c4e68)",
        "hostname": "lns1",
        "exportedUtc": "2026-10-01T12:00:00.0000000Z",
        "exportedBy": "noc-alice",
        "committedUtc": "2026-09-30T08:15:00.0000000Z",
        "commitComment": "point syslog at the new collector",
        "commitUsername": "noc-bob"
    },
    "valid": true,
    "validationError": null,
    "noChanges": false,
    "linesAdded": 2,
    "linesRemoved": 1,
    "diff": "[edit routing]\n-  hostname replacement;\n+  hostname lns1;\n[edit syslog]\n+  port 6514;",
    "secretsChanged": [
        "auth radius server 10.20.2.31 secret"
    ],
    "secretsKept": [],
    "secretsMissing": [],
    "boxSpecific": [
        "- set routing hostname replacement",
        "+ set routing hostname lns1"
    ],
    "notes": [
        "The backup was written by release 1.0.0 (192c4e68); this box runs 1.1.0 (5f1cc70a)."
    ],
    "committedUtc": null,
    "confirmDeadlineUtc": null
}
Schema of the response body
{
    "required": [
        "status",
        "origin",
        "valid",
        "validationError",
        "noChanges",
        "linesAdded",
        "linesRemoved",
        "diff",
        "secretsChanged",
        "secretsKept",
        "secretsMissing",
        "boxSpecific",
        "notes",
        "committedUtc",
        "confirmDeadlineUtc"
    ],
    "type": "object",
    "properties": {
        "status": {
            "type": "string",
            "description": "\"previewed\" (nothing changed), \"unchanged\" (the backup is what is\n            already running; nothing committed), \"committed\", or \"committedPendingConfirm\"."
        },
        "origin": {
            "$ref": "#/components/schemas/ConfigBackupOrigin"
        },
        "valid": {
            "type": "boolean",
            "description": "Whether the configuration in it passes validation on this box."
        },
        "validationError": {
            "type": "string",
            "description": "The validation error when it does not.",
            "nullable": true
        },
        "noChanges": {
            "type": "boolean",
            "description": "True when it is identical to the running configuration."
        },
        "linesAdded": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "description": "Set-format lines the restore adds.",
            "format": "int32"
        },
        "linesRemoved": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "description": "Set-format lines the restore removes.",
            "format": "int32"
        },
        "diff": {
            "type": "string",
            "description": "The change against the running configuration, as the CLI's `compare`\n            prints it; secret values are redacted."
        },
        "secretsChanged": {
            "type": "array",
            "items": {
                "type": "string"
            },
            "description": "Paths of secrets whose value differs — the diff cannot show\n            these."
        },
        "secretsKept": {
            "type": "array",
            "items": {
                "type": "string"
            },
            "description": "Redacted backup: paths of secrets taken from this box."
        },
        "secretsMissing": {
            "type": "array",
            "items": {
                "type": "string"
            },
            "description": "Redacted backup: paths of secrets neither in the backup nor on\n            this box. Non-empty means it cannot be committed here."
        },
        "boxSpecific": {
            "type": "array",
            "items": {
                "type": "string"
            },
            "description": "Changes to values that describe a particular box — hostname,\n            router id, management and interface addresses, data-plane ports — as \"+\"/\"-\" set lines.\n            Expected when restoring a replacement; a warning anywhere else."
        },
        "notes": {
            "type": "array",
            "items": {
                "type": "string"
            },
            "description": "Anything else worth knowing, e.g. that another release wrote it."
        },
        "committedUtc": {
            "type": "string",
            "description": "When the restore was committed (commit actions only).",
            "format": "date-time",
            "nullable": true
        },
        "confirmDeadlineUtc": {
            "type": "string",
            "description": "When it rolls back unless confirmed (\"commitConfirm\").",
            "format": "date-time",
            "nullable": true
        }
    },
    "description": "POST /api/v1/config/import result: what the backup is and what restoring it does\n            (or did). It never contains a secret.",
    "example": {
        "status": "previewed",
        "origin": {
            "kind": "encrypted",
            "product": "netavo-bng",
            "softwareVersion": "1.0.0 (192c4e68)",
            "hostname": "lns1",
            "exportedUtc": "2026-10-01T12:00:00.0000000Z",
            "exportedBy": "noc-alice",
            "committedUtc": "2026-09-30T08:15:00.0000000Z",
            "commitComment": "point syslog at the new collector",
            "commitUsername": "noc-bob"
        },
        "valid": true,
        "validationError": null,
        "noChanges": false,
        "linesAdded": 2,
        "linesRemoved": 1,
        "diff": "[edit routing]\n-  hostname replacement;\n+  hostname lns1;\n[edit syslog]\n+  port 6514;",
        "secretsChanged": [
            "auth radius server 10.20.2.31 secret"
        ],
        "secretsKept": [],
        "secretsMissing": [],
        "boxSpecific": [
            "- set routing hostname replacement",
            "+ set routing hostname lns1"
        ],
        "notes": [
            "The backup was written by release 1.0.0 (192c4e68); this box runs 1.1.0 (5f1cc70a)."
        ],
        "committedUtc": null,
        "confirmDeadlineUtc": 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"
    }
}
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/config/rollback#

Roll back to a historical configuration version.

Description

Stages the historical version as a candidate and commits it (CLI semantics), so the rollback itself becomes a new history entry and hot-appliable changes take effect immediately. Super-user only; local appliance 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

{
    "version": 41
}

Other accepted types: application/*+json, text/json

Schema of the request body
{
    "required": [
        "version"
    ],
    "type": "object",
    "properties": {
        "version": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "description": "The history version number to restore.",
            "format": "int32"
        }
    },
    "description": "POST /api/v1/config/rollback body.",
    "example": {
        "version": 41
    }
}

Responses

{
    "status": "rolledBack",
    "version": 41,
    "committedUtc": "2026-08-03T10:26:02Z",
    "confirmDeadlineUtc": null,
    "confirmNotice": null
}
Schema of the response body
{
    "required": [
        "status",
        "version",
        "committedUtc"
    ],
    "type": "object",
    "properties": {
        "status": {
            "type": "string",
            "description": "Always \"rolledBack\"."
        },
        "version": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "description": "The restored version number.",
            "format": "int32"
        },
        "committedUtc": {
            "type": "string",
            "description": "UTC timestamp the rollback commit became active.",
            "format": "date-time",
            "nullable": true
        },
        "confirmDeadlineUtc": {
            "type": "string",
            "description": "Deadline of an existing rollback, if still pending.",
            "format": "date-time",
            "nullable": true
        },
        "confirmNotice": {
            "type": "string",
            "description": "Operator notice when this commit confirms a pending rollback.",
            "nullable": true
        }
    },
    "description": "POST /api/v1/config/rollback result.",
    "example": {
        "status": "rolledBack",
        "version": 41,
        "committedUtc": "2026-08-03T10:26:02Z",
        "confirmDeadlineUtc": null,
        "confirmNotice": 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/config/schema#

Configuration schema: every editable field, grouped by section.

Description

Field-level schema for the whole appliance configuration, grouped by section (first CLI-path token) — the same registry the CLI uses, so paths, types, enum values and secret handling match the CLI exactly. Field path values are the keys for reads and writes; secret: true fields read back as a redaction placeholder; visibleWhen describes fields that only apply for a particular driver/mode selection; sections with requiresRestart: true only take full effect after a restart. Super-user surface (reads allowed for any role, without the accounts and sign-in sections — system login, web-ui auth — which only a super-user is shown).

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

{
    "sections": [
        {
            "section": "syslog",
            "display": "Syslog",
            "group": "Monitoring",
            "groupOrder": 7,
            "requiresRestart": false,
            "fields": [
                {
                    "path": "syslog server",
                    "label": "Server",
                    "description": "Collector the appliance exports RFC 5424 events to.",
                    "type": "IpAddress",
                    "list": false,
                    "allowedValues": null,
                    "allowedValueLabels": null,
                    "secret": false,
                    "visibleWhen": {
                        "field": "syslog enabled",
                        "equals": [
                            "true"
                        ],
                        "contains": false
                    }
                }
            ],
            "keyedLists": []
        }
    ]
}
Schema of the response body
{
    "required": [
        "sections"
    ],
    "type": "object",
    "properties": {
        "sections": {
            "type": "array",
            "items": {
                "$ref": "#/components/schemas/SectionSchema"
            },
            "description": "Every configuration section, alphabetical by section key."
        }
    },
    "description": "GET /api/v1/config/schema response.",
    "example": {
        "sections": [
            {
                "section": "syslog",
                "display": "Syslog",
                "group": "Monitoring",
                "groupOrder": 7,
                "requiresRestart": false,
                "fields": [
                    {
                        "path": "syslog server",
                        "label": "Server",
                        "description": "Collector the appliance exports RFC 5424 events to.",
                        "type": "IpAddress",
                        "list": false,
                        "allowedValues": null,
                        "allowedValueLabels": null,
                        "secret": false,
                        "visibleWhen": {
                            "field": "syslog enabled",
                            "equals": [
                                "true"
                            ],
                            "contains": false
                        }
                    }
                ],
                "keyedLists": []
            }
        ]
    }
}
{
    "type": "https://tools.ietf.org/html/rfc9110#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/config/validate#

Validate a change set without persisting (dry-run).

Description

Applies the change set to a throwaway candidate and runs full validation; nothing is persisted regardless of outcome. Validation problems are reported in the 200 body (valid: false + error), not as an error status. Super-user only; local appliance 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

{
    "fields": {
        "syslog enabled": "true",
        "syslog server": "10.20.2.40"
    },
    "listOps": [
        {
            "listPath": "auth radius server",
            "key": "10.20.2.31",
            "delete": false,
            "fields": {
                "auth radius server authPort": "1812",
                "auth radius server secret": "s3cr3t"
            }
        }
    ],
    "comment": "point syslog at the new collector"
}

Other accepted types: application/*+json, text/json

Schema of the request body
{
    "required": [
        "fields",
        "listOps",
        "comment"
    ],
    "type": "object",
    "properties": {
        "fields": {
            "type": "object",
            "additionalProperties": {
                "type": "string"
            },
            "description": "Field writes keyed by schema `path`. null clears a field; list-mode\n            fields take newline/comma-separated elements with replace semantics; a secret field set to\n            the redaction placeholder is left unchanged.",
            "nullable": true
        },
        "listOps": {
            "type": "array",
            "items": {
                "$ref": "#/components/schemas/KeyedListOp"
            },
            "description": "Keyed-list operations (add/update/delete items such as RADIUS\n            servers or login users).",
            "nullable": true
        },
        "comment": {
            "type": "string",
            "description": "Commit comment recorded in the config history (apply only).",
            "nullable": true
        }
    },
    "description": "A batch of configuration changes (the body of validate and apply).",
    "example": {
        "fields": {
            "syslog enabled": "true",
            "syslog server": "10.20.2.40"
        },
        "listOps": [
            {
                "listPath": "auth radius server",
                "key": "10.20.2.31",
                "delete": false,
                "fields": {
                    "auth radius server authPort": "1812",
                    "auth radius server secret": "s3cr3t"
                }
            }
        ],
        "comment": "point syslog at the new collector"
    }
}

Responses

{
    "valid": false,
    "error": "syslog server: '10.20.2' is not a valid IP address"
}
Schema of the response body
{
    "required": [
        "valid",
        "error"
    ],
    "type": "object",
    "properties": {
        "valid": {
            "type": "boolean",
            "description": "Whether the change set passes validation against the current config."
        },
        "error": {
            "type": "string",
            "description": "The validation error when Valid is false.",
            "nullable": true
        }
    },
    "description": "POST /api/v1/config/validate result. Validation problems are reported here with a\n            200 status — an error status means the request itself failed.",
    "example": {
        "valid": false,
        "error": "syslog server: '10.20.2' is not a valid IP address"
    }
}
{
    "type": "https://tools.ietf.org/html/rfc9110#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/config/webui/certificate#

Upload a TLS certificate for the web listeners.

Description

Validates that the PEM pair loads as a usable server certificate before anything is written, persists it atomically, switches webUi.tls.mode to "custom" via a config commit, and hot-reloads the listeners — no restart, existing sessions undisturbed. Super-user only; local appliance 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

{
    "certPem": "-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIJAK...\n-----END CERTIFICATE-----\n",
    "keyPem": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0B...\n-----END PRIVATE KEY-----\n"
}

Other accepted types: application/*+json, text/json

Schema of the request body
{
    "required": [
        "certPem",
        "keyPem"
    ],
    "type": "object",
    "properties": {
        "certPem": {
            "type": "string",
            "description": "Server certificate in PEM format (leaf first, then any chain)."
        },
        "keyPem": {
            "type": "string",
            "description": "Matching private key in PEM format."
        }
    },
    "description": "POST /api/v1/config/webui/certificate body.",
    "example": {
        "certPem": "-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIJAK...\n-----END CERTIFICATE-----\n",
        "keyPem": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0B...\n-----END PRIVATE KEY-----\n"
    }
}

Responses

{
    "status": "installed",
    "subject": "CN=lns1.hul1.example.net",
    "notAfter": "2027-08-03T10:24:00Z"
}
Schema of the response body
{
    "required": [
        "status",
        "subject",
        "notAfter"
    ],
    "type": "object",
    "properties": {
        "status": {
            "type": "string",
            "description": "Always \"installed\"."
        },
        "subject": {
            "type": "string",
            "description": "Subject DN of the installed certificate."
        },
        "notAfter": {
            "type": "string",
            "description": "Expiry of the installed certificate.",
            "format": "date-time"
        }
    },
    "description": "POST /api/v1/config/webui/certificate result.",
    "example": {
        "status": "installed",
        "subject": "CN=lns1.hul1.example.net",
        "notAfter": "2027-08-03T10:24:00Z"
    }
}
{
    "type": "https://tools.ietf.org/html/rfc9110#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"
    }
}
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"
    }
}

Schemas#

CacheRefreshResult#

Name Type Description
acceptedRows Rows in the view now being served.
adopted Guest sessions adopted by a line.
awaitingConfirmation Sessions with no authority that are ended only if the next refresh agrees.
deferredByLimit Sessions not ended because the limit for one refresh was reached.
detail string | null The outcome in words, as the CLI prints it.
ended Live sessions ended.
errors Sessions that could not be reconciled because of a fault; the rest were.
failedEnds Sessions whose disconnect failed; tried again at the next refresh.
guestsDeferred Guest sessions left for the next refresh: this one had adopted or ended as many guests as one refresh may.
heldForUnreadableRows Sessions left alone because the source had a row for them that could not be read.
refreshed boolean True when the source was read and the load applied. False when there is no source, it could not be read, or the load was read and not believed (Suspect); Detail says which.
rePoliced Live sessions whose state or rates were changed.
rows Rows the load returned.
suspect boolean True when the load was read and not applied: it was empty, or had lost more rows - or had more rows turn non-active - than a load plausibly does. Nobody is disconnected and new and changed subscribers are not applied either; accept it with `request subscribers source accept` if it is right.

CertificateInstallResult#

Name Type Description
notAfter string(date-time) Expiry of the installed certificate.
status string Always "installed".
subject string Subject DN of the installed certificate.

CertificateUploadRequest#

Name Type Description
certPem string Server certificate in PEM format (leaf first, then any chain).
keyPem string Matching private key in PEM format.

ChangeSet#

Name Type Description
comment string | null Commit comment recorded in the config history (apply only).
fields Field writes keyed by schema `path`. null clears a field; list-mode fields take newline/comma-separated elements with replace semantics; a secret field set to the redaction placeholder is left unchanged.
listOps Array<KeyedListOp> Keyed-list operations (add/update/delete items such as RADIUS servers or login users).

ConfigBackupFile#

Name Type Description
backup string The backup itself — a JSON document, as text. Save it as it is; it is what `POST /api/v1/config/import` and the CLI's `load override` take.
fileName string A name to save it under: host, kind and time of export.
kind string "redacted" or "encrypted".

ConfigBackupOrigin#

Name Type Description
commitComment string | null That commit's comment.
committedUtc string | null When the configuration in it was committed, if known.
commitUsername string | null Who made that commit.
exportedBy string Who exported it.
exportedUtc string When it was exported.
hostname string The box it was exported from.
kind string "redacted" or "encrypted".
product string The product it is a configuration of.
softwareVersion string The release that wrote it.

ConfigCommitResult#

Name Type Description
committedUtc string(date-time) | null UTC timestamp the new configuration version became active.
confirmDeadlineUtc string(date-time) | null Deadline of an existing rollback, if still pending.
confirmNotice string | null Operator notice when this commit confirms a pending rollback.
status string Always "committed".

ConfigConfirmState#

Name Type Description
deadlineUtc string(date-time) | null When it rolls back unless confirmed; null when none is pending.
pending boolean True while a commit made with a confirm window awaits confirmation.

ConfigImportResult#

Name Type Description
boxSpecific Array<string> Changes to values that describe a particular box — hostname, router id, management and interface addresses, data-plane ports — as "+"/"-" set lines. Expected when restoring a replacement; a warning anywhere else.
committedUtc string(date-time) | null When the restore was committed (commit actions only).
confirmDeadlineUtc string(date-time) | null When it rolls back unless confirmed ("commitConfirm").
diff string The change against the running configuration, as the CLI's `compare` prints it; secret values are redacted.
linesAdded Set-format lines the restore adds.
linesRemoved Set-format lines the restore removes.
noChanges boolean True when it is identical to the running configuration.
notes Array<string> Anything else worth knowing, e.g. that another release wrote it.
origin ConfigBackupOrigin
secretsChanged Array<string> Paths of secrets whose value differs — the diff cannot show these.
secretsKept Array<string> Redacted backup: paths of secrets taken from this box.
secretsMissing Array<string> Redacted backup: paths of secrets neither in the backup nor on this box. Non-empty means it cannot be committed here.
status string "previewed" (nothing changed), "unchanged" (the backup is what is already running; nothing committed), "committed", or "committedPendingConfirm".
valid boolean Whether the configuration in it passes validation on this box.
validationError string | null The validation error when it does not.

ConfigListItem#

Name Type Description
key string The item's key (e.g. the RADIUS server host).
values Child-field values keyed by child path (secrets redacted).

ConfigRollbackResult#

Name Type Description
committedUtc string(date-time) | null UTC timestamp the rollback commit became active.
confirmDeadlineUtc string(date-time) | null Deadline of an existing rollback, if still pending.
confirmNotice string | null Operator notice when this commit confirms a pending rollback.
status string Always "rolledBack".
version The restored version number.

ConfigSchema#

Name Type Description
sections Array<SectionSchema> Every configuration section, alphabetical by section key.

ConfigValidateResult#

Name Type Description
error string | null The validation error when Valid is false.
valid boolean Whether the change set passes validation against the current config.

ConfigValues#

Name Type Description
fields Field values keyed by schema path (secrets redacted; list fields joined with newlines; null = unset).
lists Keyed-list contents keyed by list path.

ConfigVersion#

Name Type Description
comment string | null The commit comment, or null.
committedUtc string(date-time) When this version was committed.
username string | null The committing identity, or null.
version Version number for `POST /api/v1/config/rollback`.

ExportRequest#

Name Type Description
passphrase string | null The passphrase the backup is encrypted under: at least 12 characters. It is not stored and cannot be recovered.

FieldSchema#

Name Type Description
allowedValueLabels Optional value→friendly-label map for the dropdown (driver name, humanized enum, …).
allowedValues Array<string> Allowed values when the field is an enum/dropdown; null for free-form fields.
description string What the field does (from the config mapping registry).
label string Human-friendly field label.
list boolean True for multi-element fields (written as newline/comma-separated elements).
path string The field's full path — the key used in reads and change sets.
secret boolean True for secrets: reads return a placeholder, writing the placeholder means "unchanged".
type string Value type: String, Int, Bool, IpAddress, IpV4Address, IpV6Address, MacAddress…
visibleWhen

ImportRequest#

Name Type Description
action string | null "preview" (the default): validate and report, change nothing. "commit": validate and commit. "commitConfirm": commit, and roll back automatically unless any authorized operator commits or calls `POST /api/v1/config/confirm` within `confirmMinutes`.
backup string | null The backup, as text — the `backup` an export returned, or the contents of the file it was saved to.
comment string | null Commit comment recorded in the history; defaults to "restore from backup of <hostname> (<exported>)".
confirmMinutes The confirm window for "commitConfirm" (default 10).
passphrase string | null The passphrase of an encrypted backup. Ignored for a redacted one.

KeyedListOp#

Name Type Description
delete boolean true deletes the item (Fields is then ignored).
fields Child-field writes keyed by child path; same secret/list semantics as top-level field writes.
key string The item key (e.g. the server host). Created if it doesn't exist.
listPath string The list's schema `path` (e.g. "auth radius server").

KeyedListSchema#

Name Type Description
children Array<FieldSchema> Schema of each item's child fields.
description string What the list configures (from the config mapping registry).
keyLabel string Display form of string KeyedListSchema.KeyName for the key column header. Supplied by the server so every label in the editor comes from ONE acronym table — the client's own humaniser has none, which is how "Cpe GRE Circuit" and "Frr" reached the page.
keyName string What the item key is (e.g. "host", "name").
label string Human-friendly list title (e.g. "RADIUS Server", "Login User").
path string The list's full path — the `listPath` used in keyed-list operations.
visibleWhen

ProblemDetails#

Name Type Description
detail string | null
instance string | null
status
title string | null
type string | null

RollbackRequest#

Name Type Description
version The history version number to restore.

SectionSchema#

Name Type Description
display string Human-friendly card title (e.g. "DHCP", "PPPoE").
fields Array<FieldSchema> The section's scalar/list fields.
group string Editor area this section belongs to — the tab an editing client files it under (e.g. "Routing", "Subscribers", "Monitoring"). Sections sharing a group share an int SectionSchema.GroupOrder; a section the server does not classify is "Advanced".
groupOrder Display order of string SectionSchema.Group relative to the other groups (ascending; "Advanced" sorts last). Sections within a group keep the response's alphabetical order.
keyedLists Array<KeyedListSchema> The section's keyed lists (e.g. RADIUS servers keyed by host).
requiresRestart boolean True when changes in this section only take full effect after a restart.
section string Section key (first CLI-path token(s), e.g. "syslog", "protocols dhcp").

VisibleWhenSchema#

Name Type Description
contains boolean True when the discriminator is a multi-select list: the gate matches if the list CONTAINS any of string[] VisibleWhenSchema.Equals (e.g. show the SNMP sink fields while `alerting sinks` includes "snmp"), rather than equalling one value. Omitted from JSON when false so single-value gates (auth/accounting) serialize exactly as before.
equals Array<string> Values of the discriminator for which this field/list applies.
field string Path of the discriminator field.

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
Configuration Schema-driven appliance configuration: read, validate, commit, history, and rollback — the same candidate/commit pipeline as the CLI.