equicord/status

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.

api key (bearer token)

for programmatic access. create an api key

Authorization: Bearer sk_...

available scopes (click to filter, select multiple)

authentication

POST /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"
  }
}
POST /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"
  }
}
GET /auth/first-user

check if this is the first user (no invite needed)

view details

response

{
  "success": true,
  "data": { "isFirstUser": true }
}
GET /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"
    }
  }
}
PUT /auth/user/:id/password

change user password

view details

request body

{
  "currentPassword": "oldpass",
  "newPassword": "newpass123"
}

response

{
  "success": true,
  "data": { "message": "Password updated" }
}

services

GET /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
      }
    ]
  }
}
GET /services/public

list public services

view details

response

{
  "success": true,
  "data": {
    "services": [
      {
        "id": "uuid",
        "name": "Website",
        "displayUrl": "example.com",
        "isPublic": true,
        "groupName": "Production"
      }
    ]
  }
}
GET /services/user/:id

list services by user

view details

response

{
  "success": true,
  "data": { "services": [...] }
}
POST /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", ... } }
}
GET /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"
    }
  }
}
PUT /services/:id

update a service

view details

request body

{
  "name": "Updated Name",
  "enabled": false
}

response

{
  "success": true,
  "data": { "service": { ... } }
}
DELETE /services/:id

delete a service

view details

response

{
  "success": true,
  "data": { "message": "Service deleted" }
}
PUT /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

GET /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"
      }
    ]
  }
}
GET /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": [...]
  }
}
POST /groups

create or update a group

view details

request body

{
  "name": "New Group",
  "position": 0,
  "parentGroupName": "Production"
}

response

{
  "success": true,
  "data": { "group": { ... } }
}
PUT /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" }
}
PUT /groups/rename

rename a group

view details

request body

{
  "oldName": "Old Name",
  "newName": "New Name"
}

response

{
  "success": true,
  "data": { "message": "Group renamed" }
}
DELETE /groups/delete

delete a group

view details

request body

{
  "name": "Group to Delete"
}

response

{
  "success": true,
  "data": { "message": "Group deleted" }
}
PUT /groups/email

update group email notification settings

view details

request body

{
  "name": "Production",
  "emailNotifications": true
}

response

{
  "success": true,
  "data": { "message": "Email notifications updated" }
}

checks

GET /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"
      }
    ]
  }
}
GET /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"
    }
  }
}
GET /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
    }
  }
}
POST /checks/service/:id

run a manual check

view details

response

{
  "success": true,
  "data": {
    "check": {
      "statusCode": 200,
      "responseTime": 150,
      "success": true
    }
  }
}
POST /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, ... }
    }
  }
}
POST /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, ... }
    }
  }
}
POST /checker/start/:id

start the checker for a service

view details

response

{
  "success": true,
  "data": { "message": "Checker started" }
}
POST /checker/stop/:id

stop the checker for a service

view details

response

{
  "success": true,
  "data": { "message": "Checker stopped" }
}

events

GET /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
      }
    ]
  }
}
GET /events/active

list active (unresolved) events

view details

response

{
  "success": true,
  "data": { "events": [...] }
}
GET /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"}
POST /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", ... } }
}
GET /events/:id

get event by id

view details

response

{
  "success": true,
  "data": { "event": { ... } }
}
PUT /events/:id

update an event

view details

request body

{
  "title": "Updated Title",
  "status": "ongoing"
}

response

{
  "success": true,
  "data": { "event": { ... } }
}
DELETE /events/:id

delete an event

view details

response

{
  "success": true,
  "data": { "message": "Event deleted" }
}
POST /events/:id/resolve

resolve an event

view details

response

{
  "success": true,
  "data": { "event": { "resolvedAt": "2025-01-01T00:00:00.000Z", ... } }
}

invites

GET /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"
      }
    ]
  }
}
POST /invites/user/:id

create an invite

view details

request body

{
  "expiresAt": "2025-02-01T00:00:00.000Z"
}

response

{
  "success": true,
  "data": { "invite": { "code": "XYZ789", ... } }
}
DELETE /invites/:id

delete an invite

view details

response

{
  "success": true,
  "data": { "message": "Invite deleted" }
}
POST /invites/validate

validate an invite code

view details

request body

{
  "code": "ABC123"
}

response

{
  "success": true,
  "data": { "valid": true, "invite": { ... } }
}
POST /invites/:id/use

mark invite as used

view details

request body

{
  "userId": "uuid"
}

response

{
  "success": true,
  "data": { "message": "Invite marked as used" }
}

webhooks

GET /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"
      }
    ]
  }
}
POST /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", ... } }
}
PUT /webhooks/:id

update a webhook

view details

request body

{
  "enabled": false
}

response

{
  "success": true,
  "data": { "webhook": { ... } }
}
DELETE /webhooks/:id

delete a webhook

view details

response

{
  "success": true,
  "data": { "message": "Webhook deleted" }
}

audit log

GET /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
  }
}
POST /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

GET /settings

get site settings

view details

response

{
  "success": true,
  "data": {
    "settings": {
      "siteName": "Status",
      "siteUrl": "https://status.example.com",
      "smtpEnabled": false,
      ...
    }
  }
}
PUT /settings

update site settings

view details

request body

{
  "siteName": "My Status Page",
  "siteUrl": "https://status.example.com"
}

response

{
  "success": true,
  "data": { "message": "Settings updated" }
}
POST /settings/test-email

send a test email

view details

response

{
  "success": true,
  "data": { "message": "Test email sent" }
}
GET /.well-known/security.txt

get security.txt

view details

response

Contact: security@example.com
Canonical: https://example.com/.well-known/security.txt

export / import

GET /export/global

export all data

view details

response

{
  "success": true,
  "data": {
    "version": 1,
    "exportedAt": "2025-01-01T00:00:00.000Z",
    "groups": [...],
    "services": [...],
    "settings": {...}
  }
}
GET /export/group/:name

export a group and its services

view details

response

{
  "success": true,
  "data": {
    "group": { "name": "Production", ... },
    "services": [...]
  }
}
GET /export/service/:id

export a single service

view details

response

{
  "success": true,
  "data": {
    "service": { ... }
  }
}
POST /import

import data

view details

request body

{
  "version": 1,
  "groups": [...],
  "services": [...]
}

response

{
  "success": true,
  "data": {
    "stats": {
      "groupsCreated": 2,
      "servicesCreated": 5
    }
  }
}

api keys

GET /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"
      }
    ]
  }
}
POST /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..."
  }
}
PUT /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": { ... } }
}
DELETE /api-keys/:id

delete an api key (session auth only)

view details

response

{
  "success": true,
  "data": { "message": "API key deleted" }
}