Skip to main content

API Reference

REST API versioned at /api/v2/. All endpoints require Bearer JWT unless noted. Base URL configured via NEXT_PUBLIC_API_URL.

Auth: RS256 JWT (15min) + TOTP MFARBAC: operator → supervisor → security_admin → super_adminContent-Type: application/json

Authentication

POST
/api/v2/auth/token

Login. Body: { username, password, mfa_code? }. Returns access_token + refresh_token.

POST
/api/v2/auth/refresh

Refresh access token. Body: { refresh_token }.

GET
/api/v2/auth/me

Current user: user_id, role, email.

POST
/api/v2/auth/mfa/setup

Generate TOTP secret + QR code URI.

POST
/api/v2/auth/mfa/verify

Confirm TOTP setup with first code.

Sites & Devices

GET
/api/v2/sites

List sites for authenticated tenant.

GET
/api/v2/sites/{site_id}

Site detail including active device count and alert summary.

GET
/api/v2/sites/{site_id}/devices

All devices for a site.

POST
/api/v2/sites/{site_id}/devices

Register a new device manually.

Alerts

GET
/api/v2/sites/{site_id}/alerts

List alerts. Query params: status, severity, limit, offset.

POST
/api/v2/sites/{site_id}/alerts/{id}/acknowledge

Mark OPEN alert as ACKNOWLEDGED.

POST
/api/v2/sites/{site_id}/alerts/{id}/escalate

Escalate to ESCALATED status. Dispatches to all notification channels.

POST
/api/v2/sites/{site_id}/alerts/{id}/flag-retrain

Flag alert event for model retraining. Body: { reason }.

Bollard Control

GET
/api/v2/sites/{site_id}/bollards

List bollards and current state for a site.

GET
/api/v2/sites/{site_id}/bollards/{id}/confirm

Get 2-step confirmation token (5,000ms TTL). Requires supervisor role.

POST
/api/v2/sites/{site_id}/bollards/{id}/raise

Raise bollard. Body: { confirmation_token, reason, operator_id }. QoS 2 MQTT.

POST
/api/v2/sites/{site_id}/bollards/{id}/lower

Lower bollard. No rate limit. All authenticated users.

POST
/api/v2/sites/{site_id}/bollards/emergency-lower

Emergency lower all bollards on site. Supervisor + MFA required.

POST
/api/v2/sites/{site_id}/panic

Panic button: raises all bollards, triggers siren, creates CRITICAL alert.

POST
/api/v2/sites/{site_id}/panic/cancel

Cancel panic: lowers siren. Bollards require manual rearm.

POST
/api/v2/sites/{site_id}/siren/{on|off}

Direct ESP32 siren control.

Device Discovery

POST
/api/v2/sites/{site_id}/discovery/scan

Scan subnet for ONVIF cameras, RTSP, ESP32, RMADOR edge nodes. Query: subnet.

GET
/api/v2/sites/{site_id}/discovery/results

Return last scan results cached in Redis.

POST
/api/v2/sites/{site_id}/discovery/add/{ip}

Register discovered device. Query: device_type.

AI Reasoning

GET
/api/v2/reasoning/status

Check Ollama availability and active model.

POST
/api/v2/reasoning/analyse-alert

Plain-language analysis of an alert event. Body: { alert_id, site_id }.

POST
/api/v2/reasoning/analyse-alert/stream

Streaming version of analyse-alert (Server-Sent Events).

POST
/api/v2/reasoning/generate-report

Generate law-enforcement-ready incident report.

POST
/api/v2/reasoning/explain-drift

Explain model drift metrics in plain language. Body: { metrics }.

Notifications

GET
/api/v2/notifications/status

Delivery status of all notification channels.

GET
/api/v2/notifications/config

Current notification configuration (Telegram, Twilio, PagerDuty, SMTP, FCM).

POST
/api/v2/notifications/config

Update notification config. Persisted in Redis. Header: X-Internal-Service-Token.

POST
/api/v2/notifications/test

Send test notification to all enabled channels. Body: { severity }.

Model Registry

GET
/api/v2/models

List all model versions with status and metrics.

GET
/api/v2/models/{id}

Model version detail: dataset hash, metrics, approval chain, lineage.

POST
/api/v2/models/{id}/promote

Promote model (SHADOW → CANARY → PRODUCTION). Requires AI Admin + Security Admin dual approval.

Healthcheck

GET /healthz{"status": "healthy"} · No auth required