api documentation
base url: https://statdash.thororen.com/api
authentication
the api supports two authentication methods:
session cookie
used by the web interface. login via POST /auth/login to receive a session cookie.
available scopes (click to filter, select multiple)
authentication
/auth/login login with username/email and password
view details
request body
{
"username": "user@example.com",
"password": "password123"
}response
{
"success": true,
"data": {
"user": {
"id": "uuid",
"username": "user",
"email": "user@example.com",
"role": "user",
"createdAt": "2025-01-01T00:00:00.000Z"
},
"sessionId": "uuid"
}
}/auth/register register a new user (requires invite code)
view details
request body
{
"username": "newuser",
"email": "newuser@example.com",
"password": "password123",
"inviteCode": "ABC123"
}response
{
"success": true,
"data": {
"user": {
"id": "uuid",
"username": "newuser",
"email": "newuser@example.com",
"role": "user",
"createdAt": "2025-01-01T00:00:00.000Z"
},
"sessionId": "uuid"
}
}/auth/first-user check if this is the first user (no invite needed)
view details
response
{
"success": true,
"data": { "isFirstUser": true }
}/auth/user/:id get user by id
view details
response
{
"success": true,
"data": {
"user": {
"id": "uuid",
"username": "user",
"email": "user@example.com",
"role": "admin",
"createdAt": "2025-01-01T00:00:00.000Z"
}
}
}/auth/user/:id/password change user password
view details
request body
{
"currentPassword": "oldpass",
"newPassword": "newpass123"
}response
{
"success": true,
"data": { "message": "Password updated" }
}services
/services list all services (admin only)
view details
response
{
"success": true,
"data": {
"services": [
{
"id": "uuid",
"name": "API Server",
"url": "https://api.example.com/health",
"displayUrl": "api.example.com",
"expectedStatus": 200,
"checkInterval": 60,
"enabled": true,
"isPublic": true,
"groupName": "Production",
"position": 0
}
]
}
}/services/public list public services
view details
response
{
"success": true,
"data": {
"services": [
{
"id": "uuid",
"name": "Website",
"displayUrl": "example.com",
"isPublic": true,
"groupName": "Production"
}
]
}
}/services/user/:id list services by user
view details
response
{
"success": true,
"data": { "services": [...] }
}/services create a new service
view details
request body
{
"name": "My API",
"url": "https://api.example.com/health",
"displayUrl": "api.example.com",
"expectedStatus": 200,
"checkInterval": 60,
"enabled": true,
"isPublic": true,
"groupName": "Production"
}response
{
"success": true,
"data": { "service": { "id": "uuid", ... } }
}/services/:id get service by id (public services accessible without auth)
view details
response
{
"success": true,
"data": {
"service": {
"id": "uuid",
"name": "API Server",
"url": "https://api.example.com/health",
"displayUrl": "api.example.com",
"expectedStatus": 200,
"expectedContentType": "application/json",
"expectedBody": null,
"checkInterval": 60,
"enabled": true,
"isPublic": true,
"emailNotifications": true,
"groupName": "Production",
"position": 0,
"createdBy": "uuid",
"createdAt": "2025-01-01T00:00:00.000Z"
}
}
}/services/:id update a service
view details
request body
{
"name": "Updated Name",
"enabled": false
}response
{
"success": true,
"data": { "service": { ... } }
}/services/:id delete a service
view details
response
{
"success": true,
"data": { "message": "Service deleted" }
}/services/positions update service positions
view details
request body
{
"positions": [
{ "id": "uuid1", "position": 0 },
{ "id": "uuid2", "position": 1 }
]
}response
{
"success": true,
"data": { "message": "Positions updated" }
}groups
/groups list all groups
view details
response
{
"success": true,
"data": {
"groups": [
{
"id": "uuid",
"name": "Production",
"position": 0,
"emailNotifications": true,
"parentGroupName": null,
"createdAt": "2025-01-01T00:00:00.000Z"
},
{
"id": "uuid",
"name": "API",
"position": 0,
"emailNotifications": true,
"parentGroupName": "Production",
"createdAt": "2025-01-01T00:00:00.000Z"
}
]
}
}/groups/hierarchy list groups in hierarchical structure
view details
response
{
"success": true,
"data": {
"masterGroups": [
{
"id": "uuid",
"name": "Production",
"position": 0,
"emailNotifications": true,
"parentGroupName": null,
"createdAt": "2025-01-01T00:00:00.000Z",
"subGroups": [
{
"id": "uuid",
"name": "API",
"position": 0,
"emailNotifications": true,
"parentGroupName": "Production",
"createdAt": "2025-01-01T00:00:00.000Z"
}
]
}
],
"groups": [...]
}
}/groups create or update a group
view details
request body
{
"name": "New Group",
"position": 0,
"parentGroupName": "Production"
}response
{
"success": true,
"data": { "group": { ... } }
}/groups/positions update group positions
view details
request body
{
"positions": [
{ "name": "Group1", "position": 0 },
{ "name": "Group2", "position": 1 }
]
}response
{
"success": true,
"data": { "message": "Positions updated" }
}/groups/rename rename a group
view details
request body
{
"oldName": "Old Name",
"newName": "New Name"
}response
{
"success": true,
"data": { "message": "Group renamed" }
}/groups/delete delete a group
view details
request body
{
"name": "Group to Delete"
}response
{
"success": true,
"data": { "message": "Group deleted" }
}/groups/email update group email notification settings
view details
request body
{
"name": "Production",
"emailNotifications": true
}response
{
"success": true,
"data": { "message": "Email notifications updated" }
}checks
/checks/service/:id get check history for a service
view details
response
{
"success": true,
"data": {
"checks": [
{
"id": "uuid",
"serviceId": "uuid",
"statusCode": 200,
"responseTime": 150,
"success": true,
"errorMessage": null,
"checkedAt": "2025-01-01T00:00:00.000Z"
}
]
}
}/checks/service/:id/latest get latest check for a service
view details
response
{
"success": true,
"data": {
"check": {
"id": "uuid",
"serviceId": "uuid",
"statusCode": 200,
"responseTime": 150,
"success": true,
"errorMessage": null,
"checkedAt": "2025-01-01T00:00:00.000Z"
}
}
}/checks/service/:id/stats get 24h stats for a service
view details
response
{
"success": true,
"data": {
"stats": {
"totalChecks": 1440,
"successfulChecks": 1435,
"uptimePercent": 99.65,
"avgResponseTime": 145,
"minResponseTime": 98,
"maxResponseTime": 520
}
}
}/checks/service/:id run a manual check
view details
response
{
"success": true,
"data": {
"check": {
"statusCode": 200,
"responseTime": 150,
"success": true
}
}
}/checks/batch get latest checks for multiple services
view details
request body
{
"serviceIds": ["uuid1", "uuid2", "uuid3"]
}response
{
"success": true,
"data": {
"checks": {
"uuid1": { "statusCode": 200, "success": true, ... },
"uuid2": { "statusCode": 200, "success": true, ... }
}
}
}/checks/stats/batch get stats for multiple services
view details
request body
{
"serviceIds": ["uuid1", "uuid2"]
}response
{
"success": true,
"data": {
"stats": {
"uuid1": { "uptimePercent": 99.9, ... },
"uuid2": { "uptimePercent": 100, ... }
}
}
}/checker/start/:id start the checker for a service
view details
response
{
"success": true,
"data": { "message": "Checker started" }
}/checker/stop/:id stop the checker for a service
view details
response
{
"success": true,
"data": { "message": "Checker stopped" }
}events
/events list all events
view details
response
{
"success": true,
"data": {
"events": [
{
"id": "uuid",
"title": "Scheduled Maintenance",
"description": "Database upgrade",
"type": "maintenance",
"status": "scheduled",
"groupName": "Production",
"createdAt": "2025-01-01T00:00:00.000Z",
"resolvedAt": null
}
]
}
}/events/active list active (unresolved) events
view details
response
{
"success": true,
"data": { "events": [...] }
}/events/stream sse stream for real-time updates
view details
response
event: status
data: {"serviceId":"uuid","success":true,"responseTime":150}
event: event
data: {"id":"uuid","title":"Incident","status":"ongoing"}/events create an event
view details
request body
{
"title": "Scheduled Maintenance",
"description": "Database upgrade",
"type": "maintenance",
"status": "scheduled",
"groupName": "Production"
}response
{
"success": true,
"data": { "event": { "id": "uuid", ... } }
}/events/:id get event by id
view details
response
{
"success": true,
"data": { "event": { ... } }
}/events/:id update an event
view details
request body
{
"title": "Updated Title",
"status": "ongoing"
}response
{
"success": true,
"data": { "event": { ... } }
}/events/:id delete an event
view details
response
{
"success": true,
"data": { "message": "Event deleted" }
}/events/:id/resolve resolve an event
view details
response
{
"success": true,
"data": { "event": { "resolvedAt": "2025-01-01T00:00:00.000Z", ... } }
}invites
/invites/user/:id list invites created by user
view details
response
{
"success": true,
"data": {
"invites": [
{
"id": "uuid",
"code": "ABC123",
"createdBy": "uuid",
"usedBy": null,
"expiresAt": "2025-02-01T00:00:00.000Z",
"createdAt": "2025-01-01T00:00:00.000Z"
}
]
}
}/invites/user/:id create an invite
view details
request body
{
"expiresAt": "2025-02-01T00:00:00.000Z"
}response
{
"success": true,
"data": { "invite": { "code": "XYZ789", ... } }
}/invites/:id delete an invite
view details
response
{
"success": true,
"data": { "message": "Invite deleted" }
}/invites/validate validate an invite code
view details
request body
{
"code": "ABC123"
}response
{
"success": true,
"data": { "valid": true, "invite": { ... } }
}/invites/:id/use mark invite as used
view details
request body
{
"userId": "uuid"
}response
{
"success": true,
"data": { "message": "Invite marked as used" }
}webhooks
/webhooks list all webhooks
view details
response
{
"success": true,
"data": {
"webhooks": [
{
"id": "uuid",
"name": "Discord Alerts",
"url": "https://discord.com/api/webhooks/...",
"type": "discord",
"enabled": true,
"isGlobal": true,
"groups": [],
"messageDown": "{service} is down!",
"messageUp": "{service} is back up"
}
]
}
}/webhooks create a webhook
view details
request body
{
"name": "Discord Alerts",
"url": "https://discord.com/api/webhooks/...",
"type": "discord",
"isGlobal": true,
"groups": [],
"messageDown": "{service} is down!",
"messageUp": "{service} is back up"
}response
{
"success": true,
"data": { "webhook": { "id": "uuid", ... } }
}/webhooks/:id update a webhook
view details
request body
{
"enabled": false
}response
{
"success": true,
"data": { "webhook": { ... } }
}/webhooks/:id delete a webhook
view details
response
{
"success": true,
"data": { "message": "Webhook deleted" }
}audit log
/audit list audit logs. query params: limit, offset, startDate, endDate, action, entityType, userId
view details
response
{
"success": true,
"data": {
"logs": [
{
"id": "uuid",
"userId": "uuid",
"action": "create",
"entityType": "service",
"entityId": "uuid",
"details": { "name": "New Service" },
"ipAddress": "192.168.1.1",
"createdAt": "2025-01-01T00:00:00.000Z",
"userName": "admin",
"userEmail": "admin@example.com"
}
],
"total": 150,
"limit": 20,
"offset": 0
}
}/audit create an audit log entry
view details
request body
{
"userId": "uuid",
"action": "custom",
"entityType": "service",
"entityId": "uuid",
"details": { "note": "Manual entry" }
}response
{
"success": true,
"data": { "message": "Audit log created" }
}settings
/settings get site settings
view details
response
{
"success": true,
"data": {
"settings": {
"siteName": "Status",
"siteUrl": "https://status.example.com",
"smtpEnabled": false,
...
}
}
}/settings update site settings
view details
request body
{
"siteName": "My Status Page",
"siteUrl": "https://status.example.com"
}response
{
"success": true,
"data": { "message": "Settings updated" }
}/settings/test-email send a test email
view details
response
{
"success": true,
"data": { "message": "Test email sent" }
}/.well-known/security.txt get security.txt
view details
response
Contact: security@example.com Canonical: https://example.com/.well-known/security.txt
export / import
/export/global export all data
view details
response
{
"success": true,
"data": {
"version": 1,
"exportedAt": "2025-01-01T00:00:00.000Z",
"groups": [...],
"services": [...],
"settings": {...}
}
}/export/group/:name export a group and its services
view details
response
{
"success": true,
"data": {
"group": { "name": "Production", ... },
"services": [...]
}
}/export/service/:id export a single service
view details
response
{
"success": true,
"data": {
"service": { ... }
}
}/import import data
view details
request body
{
"version": 1,
"groups": [...],
"services": [...]
}response
{
"success": true,
"data": {
"stats": {
"groupsCreated": 2,
"servicesCreated": 5
}
}
}api keys
/api-keys list your api keys (session auth only)
view details
response
{
"success": true,
"data": {
"apiKeys": [
{
"id": "uuid",
"userId": "uuid",
"name": "My API Key",
"keyPrefix": "sk_abc...",
"scopes": ["services:read", "checks:read"],
"lastUsedAt": "2025-01-01T00:00:00.000Z",
"expiresAt": null,
"createdAt": "2025-01-01T00:00:00.000Z"
}
]
}
}/api-keys create an api key. the key is only shown once! (session auth only)
view details
request body
{
"name": "My API Key",
"scopes": ["services:read", "checks:read"],
"expiresAt": "2025-12-31T00:00:00.000Z"
}response
{
"success": true,
"data": {
"apiKey": { ... },
"key": "sk_abc123..."
}
}/api-keys/:id update an api key (session auth only)
view details
request body
{
"name": "Renamed Key",
"scopes": ["services:read"]
}response
{
"success": true,
"data": { "apiKey": { ... } }
}/api-keys/:id delete an api key (session auth only)
view details
response
{
"success": true,
"data": { "message": "API key deleted" }
}