Skip to content

Services reference

FieldTypeDefaultNotes
idUUIDRead-only.
namestringRequired.
descriptionstringnonenull on update clears it.
escalation_policy_idUUIDnoneWho the service’s incidents page. Without one, nobody is paged. Must be a policy in your account (404 otherwise). null on update clears it.
incident_creation_modemanual, automanualauto_with_confirmation is still accepted on input and treated as auto, but is never returned.
reopen_window_minutesinteger30 for new services0 to 1440. A monitor that fails again within this many minutes of the last alert of a resolved auto-created incident reopens it instead of opening a new one. 0 never reopens. See reopen window.
auto_resolvealways, unless_acknowledged, neverunless_acknowledgedWhether an auto-created incident resolves itself when all its monitors recover. unless_acknowledged leaves an acknowledged incident for a person to resolve. See auto-resolve.
incident_merge_window_minutesintegernoneDeprecated and ignored. While an auto-created incident is open, every failing monitor of the service joins it.
default_incident_severityminor, major, criticalminorSeverity of incidents the service opens automatically.
auto_publish_to_status_page_idUUIDnonePuts automatic incidents on this status page and emails its subscribers. null on update clears it.
public_incident_templateobjectnone{ "title", "message", "resolved_message" }, each optional: the public title, first public update and resolved update for this service’s incidents on a status page. Values are trimmed and blank ones dropped. The title is at most 512 characters and each message 5,000 (400 otherwise). Leaving it out keeps it; null clears it. Omitted from responses when empty.
monitor_countintegerRead-only. Linked HTTP monitors and heartbeats; browser checks are not counted.
created_atRFC 3339Read-only.
MethodPathWhat it does
GET/serviceList services.
POST/serviceCreate a service.
GET/service/{id}Fetch one service.
PUT/service/{id}Update the fields you send.
DELETE/service/{id}Delete the service and its broadcast targets. Linked monitors are not unlinked. Needs an admin, or an API key with write:services: other roles get 403.
GET/service/{id}/monitorsList linked monitors as { id, name, monitor_type }, where monitor_type is http or cron.
PUT/service/{id}/monitorsReplace the linked set with { "http_job_ids": [...], "cron_job_ids": [...] }. A list you leave out is treated as empty.
GET/service/{id}/notification_targetList broadcast targets.
POST/service/{id}/notification_targetAdd a broadcast target.
DELETE/service/{id}/notification_target/{target_id}Remove a broadcast target.

PUT /service/{id}/monitors unlinks every HTTP monitor and heartbeat currently on the service, then links the IDs you send. To add one monitor, send the full list including the ones already linked. An ID that is not a monitor in your account returns 404, and nothing changes.

Browser checks link through their own service_id field on POST /browser_check and PUT /browser_check/{id}. New HTTP monitors accept an optional service_id on POST /http/job; an unknown or foreign service ID returns 404 before a monitor is created. Change an existing HTTP monitor’s assignment through the service form or PUT /service/{id}/monitors.

Create one with type and details:

typedetailsNotes
email{ "email": "oncall@example.com" }Any address.
slack_channel{ "slack_token": "xoxb-...", "channel": "#incidents" }A Slack bot token you supply, not the Slack integration. The token is write-only: it reads back as "has_token": true.
webhook{ "url": "https://hooks.example.com/incidents" }Must be a public URL. It reads back as its scheme and host only, such as https://hooks.example.com/****. Uses the webhook envelope and retry schedule, unsigned, and does not appear in the integration’s delivery log.
Terminal window
curl -X POST https://api.siteqwality.com/service/$SERVICE_ID/notification_target \
-H "Authorization: Bearer $SITEQWALITY_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "type": "webhook", "details": { "url": "https://hooks.example.com/incidents" } }'

Every lifecycle event below is sent to the service’s broadcast targets. The last column is what the Slack, email and webhook targets deliver today:

EventHappens whenDelivered today
OpenedAn incident opens on the service, automatically or by hand.Yes
ResolvedAn incident on the service resolves.Yes
AcknowledgedA responder acknowledges it.Recorded
UpdatedAn update is posted, or the severity or title changes.Recorded
ReopenedA resolved incident reopens.Recorded
MergedAn incident is merged into another.Recorded
Service changedAn incident moves to another service.Recorded

A recorded event starts delivering as each channel’s message for it ships. A monitor recovering while the incident stays open sends nothing, and an incident merged into another sends no resolved message. An update posted as an internal note is marked internal on its event. Status page subscribers only ever get public updates.

BehaviourValue
SourcesLinked HTTP monitors and heartbeats; browser checks with this service_id.
Title<monitor name> is down
Severitydefault_incident_severity
Skipped whenA maintenance window matching the monitor’s tags is active, or the service is manual.
One open incidentThe service has at most one open auto-created incident. Every failing monitor joins it, recorded as a monitor_joined timeline event.
Reopened whenA monitor fails again within reopen_window_minutes of the last alert of the resolved incident.
Resolved whenEvery monitor on the incident (HTTP, heartbeat and browser checks) is healthy again, and auto_resolve allows it.
PagedRight after the incident is recorded. If that is interrupted, a sweep pages it within about a minute.