SysTeam/Docs/API Reference

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_here

Getting a JWT Token

POST/api/auth/token
Request (form-urlencoded)
username=user@example.com
password=your-password
Response
{
  "access_token": "eyJhbGciOiJIUzI1NiIs...",
  "token_type": "bearer"
}

Checks API

GET/api/checks/
POST/api/checks/
GET/api/checks/{id}
PUT/api/checks/{id}
DELETE/api/checks/{id}
GET/api/checks/{id}/logs
GET/api/checks/{id}/stats
GET/api/checks/{id}/incidents
GET/api/checks/{id}/sla
GET/api/checks/{id}/slo
POST/api/checks/{id}/slo
DELETE/api/checks/{id}/slo

Create Check Example

POST /api/checks/
{
  "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.

FieldTypeDescription
assigned_agent_idsarray of intIDs 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_enabledboolWhen 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_criticaldictMaps 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_statusesdict (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

GET/api/notification-channels/
POST/api/notification-channels/
PUT/api/notification-channels/{id}
DELETE/api/notification-channels/{id}
POST/api/notification-channels/{id}/test

Create Slack Channel Example

{
  "name": "Ops Alerts",
  "channel_type": "slack",
  "config": {
    "webhook_url": "https://hooks.slack.com/services/..."
  }
}

Maintenance Windows API

GET/api/maintenance/
POST/api/maintenance/
GET/api/maintenance/{id}
PUT/api/maintenance/{id}
DELETE/api/maintenance/{id}
GET/api/maintenance/check/{id}/status

Status Pages API

GET/api/status-pages/
POST/api/status-pages/
GET/api/status-pages/{id}
PUT/api/status-pages/{id}
DELETE/api/status-pages/{id}
GET/api/status-pages/public/{slug}
GET/api/status-pages/public/{slug}/uptime
GET/api/status-pages/public/{slug}/feed.atom
POST/api/status-pages/public/{slug}/subscribe

Agents API

GET/api/agents/
POST/api/agents/register
POST/api/agents/heartbeat
GET/api/agents/checks
POST/api/agents/results
GET/api/agents/checks/{id}/geo-summary
GET/api/agents/checks/{id}/geo-timeseries
GET/api/agents/geo-locations

Reports API

POST/api/reports/generate
GET/api/reports/{id}
GET/api/reports/
GET/api/checks/{id}/export/incidents.csv
GET/api/checks/{id}/export/logs.csv

Badges API (Public)

GET/api/badges/{uuid}
GET/api/badges/{uuid}/uptime

Metrics API

GET/api/metrics/{key}
GET/api/metrics/{key}?format=otlp

Metrics 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)

POST/api/events/ingest
Trigger Event
{
  "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 }
  }
}
Response (202 Accepted)
{
  "status": "success",
  "dedup_key": "disk-full-srv01",
  "incident_id": 42
}

Deduplication

Sending another 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+)

GET/api/organizations/{id}/integration-keys
POST/api/organizations/{id}/integration-keys
DELETE/api/organizations/{id}/integration-keys/{kid}

Inbound Incidents (Org-Scoped, MEMBER+)

GET/api/organizations/{id}/inbound-incidents
GET/api/organizations/{id}/inbound-incidents/{iid}
POST/api/organizations/{id}/inbound-incidents/{iid}/ack

Heartbeat (Ping) API

No authentication required. Use your check's UUID to send pings.

Endpoints

GET/api/ping/{uuid}
POST/api/ping/{uuid}
GET/api/ping/{uuid}/start
GET/api/ping/{uuid}/fail
GET/api/ping/{uuid}/log
GET/api/ping/{uuid}/{exit_code}

Query Parameters

ParameterDescription
ridRun 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

GET/api/organizations/
POST/api/organizations/
GET/api/organizations/{id}
PUT/api/organizations/{id}
GET/api/organizations/{id}/members
GET/api/organizations/{id}/usage
GET/api/organizations/{id}/settings
PUT/api/organizations/{id}/settings

On-Call & Escalation API

On-Call Schedules

GET/api/organizations/{id}/oncall-schedules
POST/api/organizations/{id}/oncall-schedules
GET/api/organizations/{id}/oncall-schedules/{sid}
PUT/api/organizations/{id}/oncall-schedules/{sid}
DELETE/api/organizations/{id}/oncall-schedules/{sid}
GET/api/organizations/{id}/oncall-schedules/{sid}/current
GET/api/organizations/{id}/oncall-schedules/{sid}/timeline
POST/api/organizations/{id}/oncall-schedules/{sid}/overrides

Escalation Policies

GET/api/organizations/{id}/escalation-policies
POST/api/organizations/{id}/escalation-policies
GET/api/organizations/{id}/escalation-policies/{pid}
PUT/api/organizations/{id}/escalation-policies/{pid}
DELETE/api/organizations/{id}/escalation-policies/{pid}

Teams API

GET/api/organizations/{id}/teams
POST/api/organizations/{id}/teams
GET/api/organizations/{id}/teams/{tid}
PUT/api/organizations/{id}/teams/{tid}
DELETE/api/organizations/{id}/teams/{tid}
POST/api/organizations/{id}/teams/{tid}/members
PUT/api/organizations/{id}/teams/{tid}/members/{uid}
DELETE/api/organizations/{id}/teams/{tid}/members/{uid}
PUT/api/organizations/{id}/teams/{tid}/resources

War Rooms API

GET/api/organizations/{id}/war-rooms
POST/api/organizations/{id}/war-rooms
GET/api/organizations/{id}/war-rooms/{rid}
POST/api/organizations/{id}/war-rooms/{rid}/close
POST/api/organizations/{id}/war-rooms/{rid}/members
DELETE/api/organizations/{id}/war-rooms/{rid}/members/{mid}

Postmortems API

GET/api/organizations/{id}/postmortems
POST/api/organizations/{id}/postmortems
GET/api/organizations/{id}/postmortems/{pid}
PUT/api/organizations/{id}/postmortems/{pid}
DELETE/api/organizations/{id}/postmortems/{pid}

Incidents API

GET/api/incidents
POST/api/checks/{cid}/incidents/{lid}/ack
POST/api/checks/{cid}/incidents/{lid}/resolve
POST/api/organizations/{id}/incidents/{type}/{ref}/notes
GET/api/organizations/{id}/incidents/{type}/{ref}/timeline

SSO API

GET/api/auth/sso/providers
GET/api/auth/sso/init/{slug}
POST/api/auth/sso/link/{slug}
DELETE/api/auth/sso/unlink/{slug}
GET/api/auth/sso/me/identities

Feedback API

POST/api/feedback
GET/api/feedback
GET/api/feedback/{id}

Real-Time Events (SSE)

GET/api/events

Connect 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

GET/api/users/me
PUT/api/users/me/notification-preferences
GET/api/users/
PUT/api/users/{id}
DELETE/api/users/{id}

Error Responses

CodeDescription
200Success
201Created
400Bad Request — Invalid parameters
401Unauthorized — Missing or invalid token
403Forbidden — Insufficient permissions
404Not Found — Resource doesn't exist
422Validation Error — Invalid data format
429Too Many Requests — Rate limit exceeded
500Server 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.