Vistralio — API Reference
This is the current runtime API surface for build 0.1.8 (Beta) Build 20260420.1.
The WebUI uses the same endpoints described here.
Conventions
- base URL:
https://connect.vistralio.co.uk(primary external entry point) orhttps://saas.vistralio.co.uk(web UI host) - auth: Bearer JWT unless otherwise noted
- media auth: short-lived media token accepted on media routes
- tenant context:
- normal users use their current tenant
- admins can override with
X-Tenant-Idor?tenant_id=
The interactive API Explorer is available at https://connect.vistralio.co.uk/api/ — authenticated, permission-aware, and lists every endpoint your account can access.
Public / pre-auth endpoints
POST /api/auth/loginPOST /api/auth/login/2faGET /api/brandingGET /api/dns/probe
Auth and account
POST /api/auth/login- username/password
- returns either a normal access token or
{requires_2fa, challenge_token}
POST /api/auth/login/2faGET /api/auth/mePOST /api/auth/media-tokenPUT /api/auth/meGET /api/auth/2fa/statusPOST /api/auth/2fa/setup/startPOST /api/auth/2fa/setup/enablePOST /api/auth/2fa/disablePOST /api/auth/switch-tenant
Devices
Product UI calls these “Devices”, API keeps /api/cameras.
GET /api/camerasPOST /api/camerasPUT /api/cameras/{camera_id}DELETE /api/cameras/{camera_id}GET /api/cameras/{camera_id}/configPOST /api/cameras/{camera_id}/doorbell-pressPOST /api/cameras/add-test-cameras
Device payload highlights:
device_typeconnection_methodsite_idedge_router_idpaths.detect|live|recordaudio.talk_path|talk_codecdetection.object_overrideszonesmasksclear_passwordonvif.clear_password
Streams and media
GET /api/streams/{camera_id}/detectionsGET /api/streams/{camera_id}/snapshotGET /api/streams/internal/{camera_id}/stream-url- websocket live stream routes are handled by the media service under
/api/streams/...
Recording/media routes:
GET /api/recordings/snapshot/{event_id}GET /api/recordings/clip/{event_id}GET /api/recordings/crop/{event_id}GET /api/recordings/plate-crop/{event_id}GET /api/recordings/segmentsGET /api/recordings/segment/{camera_id}/{name}POST /api/recordings/exportGET /api/recordings/exportGET /api/recordings/export/{id}GET /api/recordings/export/{id}/download
Events
GET /api/eventsGET /api/events/{event_id}POST /api/events/{event_id}/ack
Event payloads now include:
camera_namearea_namedevice_typeconnection_methodedge_router_namesnapshotclipcropplate_cropmetadata
Schedules
GET /api/schedulesPOST /api/schedulesPATCH /api/schedules/{id}DELETE /api/schedules/{id}
Schedule payloads support:
camera_idcamera_idsone_timeenablednote
Users, groups, tenants
GET /api/usersGET /api/users/permissions/catalogPOST /api/usersPUT /api/users/{id}DELETE /api/users/{id}GET /api/groupsPOST /api/groupsPUT /api/groups/{id}DELETE /api/groups/{id}GET /api/tenantsPOST /api/tenantsPUT /api/tenants/{id}DELETE /api/tenants/{id}
Areas and edge routers
GET /api/sitesPOST /api/sitesDELETE /api/sites/{id}GET /api/edge-routersPOST /api/edge-routersPUT /api/edge-routers/{id}POST /api/edge-routers/{id}/rotate-tokenDELETE /api/edge-routers/{id}
Bridge websocket:
WS /api/edge/ws
AI registries and event types
GET /api/facesPOST /api/facesPUT /api/faces/{id}DELETE /api/faces/{id}GET /api/platesPOST /api/platesPUT /api/plates/{id}DELETE /api/plates/{id}GET /api/event-typesPOST /api/event-typesPUT /api/event-types/{id}DELETE /api/event-types/{id}
Dashboard and activity
GET /api/dashboard/layoutPUT /api/dashboard/layoutGET /api/dashboard/dataGET /api/activity
Settings and branding
GET /api/settingsPUT /api/settings/{key}GET /api/brandingPUT /api/brandingPOST /api/branding/logoPOST /api/branding/logo-urlPOST /api/branding/faviconPOST /api/branding/favicon-url
PTZ
GET /api/ptz/{camera_id}/infoPOST /api/ptz/{camera_id}/movePOST /api/ptz/{camera_id}/stopGET /api/ptz/{camera_id}/presetsPOST /api/ptz/{camera_id}/preset/{token}
Licensing
GET /api/licensing/statusPOST /api/licensing/applyPOST /api/licensing/refresh
System
GET /api/system/metricsGET /api/system/detectors/{detector}/labelsGET /api/system/docsGET /api/system/docs/{doc_path:path}GET /api/system/cleanup/scanPOST /api/system/cleanup/runGET /api/system/update/statusGET /api/system/update/releasesGET /api/system/update/local-packagesPOST /api/system/update/local-uploadPOST /api/system/update/checkPOST /api/system/update/applyPOST /api/system/restartGET /api/system/services
DNS and hostname management
GET /api/dns— current web hostname, API hostname, edge WebSocket URL, staging statePOST /api/dns/set-api-hostname— set the API/Connect hostname directly (no nginx reload; takes effect immediately)POST /api/dns/stage— stage a new web UI hostname for dry-run verificationGET /api/dns/probe— public endpoint; verifies DNS resolves here (used by the staged flow)POST /api/dns/promote— push staged → live (must be verified first)
The API hostname (dns.api_hostname) controls edge router enrollment commands and the API Explorer link.
The web hostname (dns.current) requires nginx + TLS changes; use scripts/apply-dns.sh after promoting.
Notes
/api/system/docspowers the in-app documentation browser atAdmin -> Advanced -> Documentation/api/system/restartis permission-gated bysystem.restartorsettings.admin- media-serving routes accept short-lived media tokens because browsers cannot attach normal auth headers to every media surface cleanly