API Reference
Complete REST API documentation for integrating with SysTeam HealthChecks.
Authentication
All API requests (except public endpoints) require authentication. Two methods are supported:
Method 1: JWT Cookie (Web Sessions)
The web interface uses JWT tokens stored in cookies. This is handled automatically when you log in.
Method 2: Personal Access Token (Scripts/API)
For scripts, CI/CD, and API integrations, use a Personal Access Token:
Authorization: Bearer pat_your_token_hereGetting a JWT Token
/api/auth/tokenusername=user@example.com
password=your-password{
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"token_type": "bearer"
}Checks API
/api/checks//api/checks//api/checks/{id}/api/checks/{id}/api/checks/{id}/api/checks/{id}/logs/api/checks/{id}/stats/api/checks/{id}/incidents/api/checks/{id}/sla/api/checks/{id}/slo/api/checks/{id}/slo/api/checks/{id}/sloCreate Check Example
{
"name": "My Website",
"type": "uptime",
"url": "https://example.com",
"interval": 60,
"grace_period": 60,
"expected_status_codes": [200],
"content_match_enabled": true,
"content_match_text": "Welcome",
"content_match_type": "contains",
"geo_monitoring_enabled": false,
"assigned_agent_ids": [1, 2],
"check_source_critical": {"agent:1": true, "geo:EU-PL": false}
}Execution Source Fields
Checks support a flexible execution model. Private agents and geo monitoring can be used simultaneously on the same check.
| Field | Type | Description |
|---|---|---|
assigned_agent_ids | array of int | IDs of private agents assigned to execute this check. Multiple agents can be assigned — the check runs on all of them simultaneously. If empty and geo monitoring is disabled, the check runs from the central server. |
geo_monitoring_enabled | bool | When true, the check is distributed across all active geo agents. Can be combined with assigned_agent_ids to run from both private agents and geo locations at the same time. |
check_source_critical | dict | Maps source keys to their critical flag. A critical source failing immediately sets the check to DOWN, regardless of other sources. Keys use the format agent:<id> for private agents and geo:<location_id> for geo locations. Example: {"agent:5": true, "geo:EU-PL": true} |
agent_location_statuses | dict (read-only) | Per-source status breakdown returned in GET responses. Keys are the same agent:<id> / geo:<location_id> format. Values are UP, DOWN, DEGRADED, or UNKNOWN. This field is populated by the server and ignored on create/update. |
Tip
The old single-value field assigned_agent_id is deprecated. Use assigned_agent_ids (array) instead. The API still accepts the singular form for backward compatibility and converts it automatically.
Notification Channels API
/api/notification-channels//api/notification-channels//api/notification-channels/{id}/api/notification-channels/{id}/api/notification-channels/{id}/testCreate Slack Channel Example
{
"name": "Ops Alerts",
"channel_type": "slack",
"config": {
"webhook_url": "https://hooks.slack.com/services/..."
}
}Maintenance Windows API
/api/maintenance//api/maintenance//api/maintenance/{id}/api/maintenance/{id}/api/maintenance/{id}/api/maintenance/check/{id}/statusStatus Pages API
/api/status-pages//api/status-pages//api/status-pages/{id}/api/status-pages/{id}/api/status-pages/{id}/api/status-pages/public/{slug}/api/status-pages/public/{slug}/uptime/api/status-pages/public/{slug}/feed.atom/api/status-pages/public/{slug}/subscribeAgents API
/api/agents//api/agents/register/api/agents/heartbeat/api/agents/checks/api/agents/results/api/agents/checks/{id}/geo-summary/api/agents/checks/{id}/geo-timeseries/api/agents/geo-locationsReports API
/api/reports/generate/api/reports/{id}/api/reports//api/checks/{id}/export/incidents.csv/api/checks/{id}/export/logs.csvBadges API (Public)
/api/badges/{uuid}/api/badges/{uuid}/uptimeMetrics API
/api/metrics/{key}/api/metrics/{key}?format=otlpMetrics keys are managed in the Integrations page. See the integrations documentation for Grafana and OTel Collector setup.
Inbound Events API
Receive alerts from external monitoring systems (Prometheus, Grafana, Zabbix, CloudWatch, custom scripts). See the Inbound Events documentation for full setup instructions.
Public Ingest Endpoint (No Auth)
/api/events/ingest{
"routing_key": "ik_abc123...",
"event_action": "trigger",
"dedup_key": "disk-full-srv01",
"payload": {
"summary": "Disk full on srv01",
"severity": "critical",
"source": "prometheus",
"component": "disk",
"group": "infrastructure",
"custom_details": { "usage_pct": 95 }
}
}{
"status": "success",
"dedup_key": "disk-full-srv01",
"incident_id": 42
}Deduplication
trigger with the same dedup_key updates the existing incident instead of creating a new one. Use event_action: "acknowledge" to stop escalation, and "resolve" to close the incident.Integration Keys (Org-Scoped, ADMIN+)
/api/organizations/{id}/integration-keys/api/organizations/{id}/integration-keys/api/organizations/{id}/integration-keys/{kid}Inbound Incidents (Org-Scoped, MEMBER+)
/api/organizations/{id}/inbound-incidents/api/organizations/{id}/inbound-incidents/{iid}/api/organizations/{id}/inbound-incidents/{iid}/ackHeartbeat (Ping) API
No authentication required. Use your check's UUID to send pings.
Endpoints
/api/ping/{uuid}/api/ping/{uuid}/api/ping/{uuid}/start/api/ping/{uuid}/fail/api/ping/{uuid}/log/api/ping/{uuid}/{exit_code}Query Parameters
| Parameter | Description |
|---|---|
rid | Run ID to correlate /start with success/fail ping |
POST endpoints accept up to 100KB of text in the request body (stdout/stderr from jobs). See Heartbeat Check for full usage examples.
Organizations API
/api/organizations//api/organizations//api/organizations/{id}/api/organizations/{id}/api/organizations/{id}/members/api/organizations/{id}/usage/api/organizations/{id}/settings/api/organizations/{id}/settingsOn-Call & Escalation API
On-Call Schedules
/api/organizations/{id}/oncall-schedules/api/organizations/{id}/oncall-schedules/api/organizations/{id}/oncall-schedules/{sid}/api/organizations/{id}/oncall-schedules/{sid}/api/organizations/{id}/oncall-schedules/{sid}/api/organizations/{id}/oncall-schedules/{sid}/current/api/organizations/{id}/oncall-schedules/{sid}/timeline/api/organizations/{id}/oncall-schedules/{sid}/overridesEscalation Policies
/api/organizations/{id}/escalation-policies/api/organizations/{id}/escalation-policies/api/organizations/{id}/escalation-policies/{pid}/api/organizations/{id}/escalation-policies/{pid}/api/organizations/{id}/escalation-policies/{pid}Teams API
/api/organizations/{id}/teams/api/organizations/{id}/teams/api/organizations/{id}/teams/{tid}/api/organizations/{id}/teams/{tid}/api/organizations/{id}/teams/{tid}/api/organizations/{id}/teams/{tid}/members/api/organizations/{id}/teams/{tid}/members/{uid}/api/organizations/{id}/teams/{tid}/members/{uid}/api/organizations/{id}/teams/{tid}/resourcesWar Rooms API
/api/organizations/{id}/war-rooms/api/organizations/{id}/war-rooms/api/organizations/{id}/war-rooms/{rid}/api/organizations/{id}/war-rooms/{rid}/close/api/organizations/{id}/war-rooms/{rid}/members/api/organizations/{id}/war-rooms/{rid}/members/{mid}Postmortems API
/api/organizations/{id}/postmortems/api/organizations/{id}/postmortems/api/organizations/{id}/postmortems/{pid}/api/organizations/{id}/postmortems/{pid}/api/organizations/{id}/postmortems/{pid}Incidents API
/api/incidents/api/checks/{cid}/incidents/{lid}/ack/api/checks/{cid}/incidents/{lid}/resolve/api/organizations/{id}/incidents/{type}/{ref}/notes/api/organizations/{id}/incidents/{type}/{ref}/timelineSSO API
/api/auth/sso/providers/api/auth/sso/init/{slug}/api/auth/sso/link/{slug}/api/auth/sso/unlink/{slug}/api/auth/sso/me/identitiesFeedback API
/api/feedback/api/feedback/api/feedback/{id}Real-Time Events (SSE)
/api/eventsConnect to this endpoint to receive real-time updates. Events include: status.change, log.append, incident.new, incident.resolve, incident.ack, check.update, agent.status. See Incidents → Real-Time Updates for details.
Users API
/api/users/me/api/users/me/notification-preferences/api/users//api/users/{id}/api/users/{id}Error Responses
| Code | Description |
|---|---|
200 | Success |
201 | Created |
400 | Bad Request — Invalid parameters |
401 | Unauthorized — Missing or invalid token |
403 | Forbidden — Insufficient permissions |
404 | Not Found — Resource doesn't exist |
422 | Validation Error — Invalid data format |
429 | Too Many Requests — Rate limit exceeded |
500 | Server Error |
Rate Limiting
API endpoints are rate-limited to prevent abuse. See Security → Rate Limiting for details. When rate limited, you'll receive a 429 response with a Retry-After header.