Skip to content

API

Everything the panel does, it does through its own HTTP API — there is no private path the interface uses and callers cannot.

Authentication

Either sign in for a session token:

bash
curl -X POST 'https://panel:2053/PATH/api/auth/login' \
  -H 'Content-Type: application/json' \
  -d '{"username":"admin","password":"…"}'

or use an API token — the one the installer printed, or one from Nodes → tokens or wui token issue --name NAME — and send it as:

Authorization: Bearer wui_…

The documentation is in the panel

API in the sidebar lists every endpoint, grouped, with an example body and a curl command carrying the address you reached the panel on. The page is built from the same table the routes are registered from, so it can only describe endpoints that exist, and a new one is documented by being added.

GET /api/docs returns the same as JSON.

A few you will reach for

GET /api/overview/fulltelemetry, panel state and inventory in one call
GET /api/clients?search=&status=&group=&page=&perPage=customers
POST /api/clientscreate one; telegramId, quotaBytes, expiresAt, deviceLimit, interfaceIds
POST /api/clients/{id}/resetreset traffic
GET /api/clients/{id}/configs · GET /api/devices/{id}/profilesevery config, per device and host
GET /api/interfaces · POST · PATCH /{id} · DELETE /{id}tunnels
GET /api/outbounds · POST /api/outbounds/{id}/checkhops and probes
GET /api/routing · POST /api/routing/rules/orderrules
GET /api/template?section= · PUTthe whole configuration
POST /api/backups · GET /api/backups/{name}backups
GET /api/system · GET /api/system/historythe host

Errors come back as {"error": "…", "field": "…"} with a status that means what it says; a validation error names the field.

Released under the AGPL-3.0 License.