Health & heartbeat
Heartbeat
POST /api/system/heartbeat
Updates the authenticated user’s last_activity timestamp and returns current system state. Called automatically by the browser client every 60 seconds to maintain the online-users list and keep the session alive.
A
GET /api/system/heartbeat?health_check=1 variant is also available without authentication for uptime monitors. It returns a minimal status payload without updating any session state.Auth: Session or Bearer token
System status
GET /api/system/statusPOST /api/system/status
Returns online user count, or status for a specific user. Also supports a force_license_check action (Staff only, POST).
Required permission: api.system.status.manageAccount types: Staff only
If provided, returns status details for a specific user (status, last_activity, status_color, status_text).
POST action. Supported value:
force_license_check (Staff only).?user_id=42):
Maintenance mode
Get maintenance mode status
GET /api/system/maintenance-mode
Returns the current maintenance mode state and reason. Available to unauthenticated requests so the login page can detect maintenance windows.
Permission: None (public)
Toggle maintenance mode
POST /api/system/maintenance-mode
Enables or disables maintenance mode. When enabled, all non-Staff users are shown a maintenance screen. Staff users retain full access.
Required permission: api.system.maintenance_mode.manageAccount types: Staff only
Requires CSRF token.
true to enable maintenance mode, false to disable.Human-readable message shown to users during maintenance (e.g. “Scheduled upgrade”).
CSRF token from
GET /api/security/csrf-token.Settings
Get application settings
GET /api/system/settings
Returns the current application configuration (branding, defaults, feature flags). Some settings are redacted for non-Staff users.
Required permission: api.system.settings.manageAccount types: Staff only
System logs
Get system logs
GET /api/system/logs
Returns paginated application log entries. Restricted to Staff with log-viewing permission.
Required permission: api.system.logs.manageAccount types: Staff only
Filter by log level:
error, warning, info, debug.Filter by service name (e.g.
jobs-manage, notifications).ISO 8601 start datetime for date range filter.
ISO 8601 end datetime for date range filter.
Page number.
Results per page (max 200).
Device tokens
Register a device token
POST /api/system/device-tokens
Registers a device push-notification token (FCM or APNS) for the authenticated user. Used by mobile and PWA clients to receive push notifications.
Permission: All authenticated users
The device push token issued by the operating system or browser.
Platform identifier:
web, ios, or android.CSRF token from
GET /api/security/csrf-token.Delete a device token
DELETE /api/system/device-tokens
Removes a device token for the authenticated user. Call this on logout to stop notifications reaching the device.
Permission: All authenticated usersRequires CSRF token.
The device push token to remove.
CSRF token.
Web push subscriptions
Subscribe to web push
POST /api/system/web-push-subscriptions
Saves a Web Push API subscription object (generated by the browser’s pushManager.subscribe()) for the authenticated user.
Permission: All authenticated usersRequires CSRF token.
The full PushSubscription JSON object from the browser, including
endpoint, keys.p256dh, and keys.auth.CSRF token.
Help & Documentation
Fetch help documentation
GET /api/help
Fetches documentation from the PropOps internal knowledge base (powered by Craft.do). Supports listing all topics, retrieving a specific document, full-text search, and context-sensitive page-level help.
Required permission: api.help.readAuth: Session or Bearer token required
Operation to perform:
list— Return all available help topicsget— Return a specific document by IDsearch— Full-text search across all help contentpage_help— Retrieve contextual help content for a given app pagepage_list— List all page-level help entriespage_doc— Retrieve a specific page-level documentation document
Document ID (required for
action=get and action=page_doc).Search query (required for
action=search).App page path (required for
action=page_help, e.g. /jobs).Set to
1 to bypass the server-side documentation cache and force a fresh fetch.action=get):
action=search):
Responses are cached server-side for two hours. Append
?bust=1 to force a fresh fetch from the knowledge base.