API Reference

All API endpoints are prefixed with /api/v1. All endpoints except /auth/* and /health require JWT authentication via Authorization: Bearer header.

Health

GET /health

Response: {"status": "ok"}

Authentication

Login

POST /api/v1/auth/login
{"email": "user@example.com", "password": "..."}

Register

POST /api/v1/auth/register
{"email": "user@example.com", "password": "...", "name": "User Name"}

Refresh Token

POST /api/v1/auth/refresh
{"refresh_token": "..."}

Verify 2FA

POST /api/v1/auth/verify-2fa
{"code": "123456"}

Get Current User

GET /api/v1/auth/me

Logout

POST /api/v1/auth/logout

Dashboard

Summary

GET /api/v1/dashboard

Returns aggregated counts: servers, containers, deployments, users, compliance summary, recent activity.


Servers

GET    /api/v1/servers              — List all servers
POST   /api/v1/servers              — Create server
GET    /api/v1/servers/{id}         — Get server details
PUT    /api/v1/servers/{id}         — Update server
DELETE /api/v1/servers/{id}         — Delete server
GET    /api/v1/servers/{id}/stats   — Server resource stats

Server payload:

{
  "name": "production-01",
  "host": "192.168.1.100",
  "port": 22,
  "ssh_user": "root",
  "ssh_auth_type": "key",
  "ssh_key_id": "key-uuid",
  "server_group": "production"
}

SSH Terminal (WebSocket)

GET /api/v1/servers/{id}/terminal

Upgrades to WebSocket for interactive SSH terminal session.


SSH Keys

GET    /api/v1/ssh-keys         — List keys
POST   /api/v1/ssh-keys         — Create key
DELETE /api/v1/ssh-keys/{id}    — Delete key

Containers

GET /api/v1/containers                        — List all containers across servers
GET /api/v1/containers?server_id={id}         — Filter by server
GET /api/v1/containers/stats                  — Container statistics
GET /api/v1/containers/{id}                   — Container detail

Each container includes optional security scan data (latest container image scan).


Container Registry

User Self-Service

GET  /api/v1/registry/config                        — Get registry URL
GET  /api/v1/registry/my-credentials                 — Get personal credentials (auto-creates if none)
POST /api/v1/registry/my-credentials/reset-password  — Reset personal password

Repository Browser

GET    /api/v1/registry/repos                       — List repositories
GET    /api/v1/registry/repos/{name}/tags           — List tags
GET    /api/v1/registry/repos/{name}/{tag}          — Image detail (layers, config, history)
DELETE /api/v1/registry/repos/{name}/manifests/{digest}  — Delete manifest (admin)
DELETE /api/v1/registry/repos/{name}/tags/{tag}          — Delete tag (admin)
POST   /api/v1/registry/gc                          — Trigger garbage collection (admin)

User Management (Admin)

GET    /api/v1/registry/users              — List registry users
POST   /api/v1/registry/users              — Create registry user
PUT    /api/v1/registry/users/{id}         — Update registry user
DELETE /api/v1/registry/users/{id}         — Delete registry user
POST   /api/v1/registry/users/{id}/reset-password  — Reset user password
POST   /api/v1/registry/sync-htpasswd      — Sync htpasswd + restart Zot

Compliance

Global

GET /api/v1/compliance/summary       — Compliance summary across all servers
GET /api/v1/compliance/checks        — List all available checks (grouped by category)

Per-Server

GET  /api/v1/compliance/{serverID}/latest            — Latest scan result (?scan_type=, ?category=)
GET  /api/v1/compliance/{serverID}/latest/categories  — Latest scan categorized
POST /api/v1/compliance/{serverID}/scan               — Trigger CIS scan (?profile=cis_level_1|cis_level_2|cis_docker|all)
POST /api/v1/compliance/{serverID}/scan/lynis         — Trigger Lynis audit
POST /api/v1/compliance/{serverID}/scan/docker        — Trigger CIS Docker scan (alias)
POST /api/v1/compliance/{serverID}/scan/containers    — Scan all containers on server
POST /api/v1/compliance/{serverID}/scan/containers/{containerID}  — Scan single container
POST /api/v1/compliance/{serverID}/scan/check/{checkID}          — Run single check

History

GET /api/v1/compliance/history                              — Global scan history
GET /api/v1/compliance/active                               — Currently running scans
GET /api/v1/compliance/{serverID}/history                   — Server scan history
GET /api/v1/compliance/{serverID}/history/{scanID}          — Scan detail with findings
GET /api/v1/compliance/{serverID}/history/categories/{category}  — History by category
GET /api/v1/compliance/{serverID}/containers/{containerName}/history  — Container scan history

Deployments

GET    /api/v1/deployments                     — List deployments (?environment_id=)
POST   /api/v1/deployments                     — Create deployment
GET    /api/v1/deployments/{id}                — Get deployment details
POST   /api/v1/deployments/{id}/restart        — Restart deployment
POST   /api/v1/deployments/{id}/redeploy       — Redeploy
POST   /api/v1/deployments/{id}/rollback       — Rollback
GET    /api/v1/deployments/{id}/history        — Deployment history
GET    /api/v1/deployments/history             — Global history

Environments

GET    /api/v1/deployments/environments        — List environments
POST   /api/v1/deployments/environments        — Create environment
PUT    /api/v1/deployments/environments/{id}   — Update environment
DELETE /api/v1/deployments/environments/{id}   — Delete environment

Repositories

GET    /api/v1/repositories                    — List repositories
GET    /api/v1/repositories/connections        — List provider connections
POST   /api/v1/repositories/connections        — Create connection (validate token first)
DELETE /api/v1/repositories/connections/{id}   — Delete connection
GET    /api/v1/repositories/selections         — List selections

Admin

GET    /api/v1/admin/users               — List users
POST   /api/v1/admin/users               — Create user
GET    /api/v1/admin/users/{id}          — Get user
PUT    /api/v1/admin/users/{id}          — Update user
DELETE /api/v1/admin/users/{id}          — Delete user
POST   /api/v1/admin/users/{id}/unlock   — Unlock locked user

Audit Log

GET /api/v1/admin/audit-log               — List audit logs (paginated)
GET /api/v1/admin/audit-log/actions       — List unique audit actions
GET /api/v1/admin/audit-log/entity-types  — List entity types
GET /api/v1/admin/audit-log/export        — Export as CSV

Auth Activity

Auth activity endpoints under /api/v1/auth-activity — login monitoring, brute force detection, IP blocking.

GET    /api/v1/auth-activity/events             — Auth events (paginated, filterable)
GET    /api/v1/auth-activity/events/mine        — Current user's own login history (last 20)
GET    /api/v1/auth-activity/events/export      — CSV export for audit
GET    /api/v1/auth-activity/summary             — Dashboard summary cards
GET    /api/v1/auth-activity/lockouts            — Currently locked accounts
GET    /api/v1/auth-activity/trend               — Aggregated daily stats for charts (?days=7, max 90)
GET    /api/v1/auth-activity/brute-force         — Brute force detection results
GET    /api/v1/auth-activity/top-ips             — IPs with most failures (?days=7)
GET    /api/v1/auth-activity/top-users           — Users with most failures (?days=7)
GET    /api/v1/auth-activity/heatmap             — Hourly auth event distribution (?days=7)
POST   /api/v1/auth-activity/block-ip            — Block an IP address
POST   /api/v1/auth-activity/unblock-ip          — Unblock an IP address
GET    /api/v1/auth-activity/blocked-ips         — List blocked IPs
GET    /api/v1/auth-activity/config              — Brute force notification config
PUT    /api/v1/auth-activity/config              — Update brute force config

Query Parameters (GET /events)

Param Type Description
page int Page number (default 1)
limit int Page size (default 50)
event_type string Filter by event type
status string Filter by success/failure
email string Filter by email
ip_address string Filter by IP address
search string Full-text search
start_date string ISO date (YYYY-MM-DD)
end_date string ISO date (YYYY-MM-DD)
sort string Sort column (default: created_at)
order string Sort order: asc/desc

Events Response

{
  "events": [{
    "id": "aev_xxx",
    "user_id": "usr_xxx",
    "email": "admin@example.com",
    "event_type": "login_failure",
    "status": "failure",
    "failure_reason": "invalid_password",
    "ip_address": "185.220.101.23",
    "country": "RU",
    "asn": "AS12345",
    "isp": "Example ISP",
    "user_agent": "Mozilla/5.0 ...",
    "auth_method": "password",
    "created_at": "2026-06-11T08:30:00Z"
  }],
  "_meta": { "total": 543, "page": 1, "per_page": 50, "total_pages": 11 }
}

Summary Response

{
  "today_logins": 128,
  "today_failures": 47,
  "today_success_rate": 63.3,
  "today_lockouts": 0,
  "unique_ips": 24,
  "blocked_ips_count": 2,
  "active_brute_force_alerts": 2
}

Settings

GET  /api/v1/settings/compliance-thresholds    — Get thresholds + defaults
PUT  /api/v1/settings/compliance-thresholds    — Update thresholds

Threshold payload:

{"compliant": 90, "warning": 70}

Validation: compliant > warning > 0. Default: compliant=90, warning=70.


SSL Monitoring

Monitors CRUD

GET    /api/v1/ssl-monitors                          — List (?page=&limit=&search=&status=&sort=&order=&all=)
POST   /api/v1/ssl-monitors                          — Create monitor
GET    /api/v1/ssl-monitors/summary                  — KPI counts (total, valid, expiring_soon, expired, error)
GET    /api/v1/ssl-monitors/export/csv                — Export as CSV
POST   /api/v1/ssl-monitors/import                   — Batch import [{domain, port, display_name}]
POST   /api/v1/ssl-monitors/check-all                — Check all enabled monitors
POST   /api/v1/ssl-monitors/discover                 — Server-side discovery {server_id, provider}
POST   /api/v1/ssl-monitors/discover/import           — Import discovered domains
GET    /api/v1/ssl-monitors/{id}                     — Get detail
PUT    /api/v1/ssl-monitors/{id}                     — Update
DELETE /api/v1/ssl-monitors/{id}                     — Delete
POST   /api/v1/ssl-monitors/{id}/check               — Manual TLS check
GET    /api/v1/ssl-monitors/{id}/history             — Paginated check history (?limit=&offset=)
GET    /api/v1/ssl-monitors/{id}/trend               — Trend chart data (?limit=90, default 90)

Create monitor payload:

{
  "domain": "app1.edsuwarna.id",
  "port": 443,
  "display_name": "App 1 Production",
  "check_interval": "1h",
  "notify_before": "14d",
  "webhook_ids": ["target-uuid"],
  "enabled": true
}

Summary response:

{
  "total": 8,
  "valid": 5,
  "expiring_soon": 2,
  "expired": 0,
  "error": 1
}

Notification Targets

GET    /api/v1/ssl-monitors/notification-targets             — List all
POST   /api/v1/ssl-monitors/notification-targets             — Create
GET    /api/v1/ssl-monitors/notification-targets/{id}        — Get
PUT    /api/v1/ssl-monitors/notification-targets/{id}        — Update
DELETE /api/v1/ssl-monitors/notification-targets/{id}        — Delete
POST   /api/v1/ssl-monitors/notification-targets/{id}/test   — Send test notification

Platforms: telegram, discord, slack, generic. Formatting is auto-applied per platform.

Discover

POST /api/v1/ssl-monitors/discover
{
  "server_id": "server-uuid",
  "provider": "auto"
}

Providers: auto, traefik, nginx, caddy, letsencrypt, filesystem.

POST /api/v1/ssl-monitors/discover/import
{
  "domains": [
    {"domain": "app1.edsuwarna.id", "port": 443, "display_name": "App 1", "source_provider": "traefik", "server_id": "server-uuid"}
  ],
  "enabled": true
}