Events reference
All system events emitted by HowlOps: webhook events, WebSocket events, and in-app feed events.
HowlOps events are emitted in three delivery channels:
- Webhook: HTTP POST to your endpoint (Webhooks reference)
- WebSocket:
WSS /api/v1/wsreal-time stream - In-app notification feed:
/api/v1/notifications/feed
Webhook events
Outbound webhook deliveries use the stable monitor.* namespace. See the Webhooks reference for the full payload shape.
| Event | Trigger |
|---|---|
monitor.down | A monitor or heartbeat opens an incident (check failing / heartbeat missed) |
monitor.up | A monitor or heartbeat recovers |
monitor.ssl_expiry | A monitored endpoint's TLS certificate is approaching expiry |
test | Manual test delivery from the UI |
Heartbeat-sourced events reuse the same
monitor.down/monitor.upevent names; the payload carriesheartbeat_id(withmonitor_idempty) to distinguish them.
WebSocket events
Connect to WSS /api/v1/ws?token=<workspace_api_token>. The token must be a workspace API token (howlops_<hex>), not an OAuth or JWT token. Each message is a JSON object with channel, type, and data fields.
The channel field is the routing key clients use to subscribe to specific event streams. Frames without a channel are still delivered but the frontend drops them unless listening for all frames.
incident.created
{
"channel": "monitors.status",
"type": "incident.created",
"data": {
"incident_id": "uuid",
"monitor_id": "uuid",
"status": "open",
"severity": "critical | warning | info"
}
}
incident.acknowledged
{
"channel": "monitors.status",
"type": "incident.acknowledged",
"data": {
"incident_id": "uuid",
"monitor_id": "uuid"
}
}
incident.resolved
{
"channel": "monitors.status",
"type": "incident.resolved",
"data": {
"incident_id": "uuid",
"monitor_id": "uuid"
}
}
incident.assigned
{
"channel": "monitors.status",
"type": "incident.assigned",
"data": {
"incident_id": "uuid",
"monitor_id": "uuid"
}
}
monitor.status_changed
{
"channel": "monitors.status",
"type": "monitor.status_changed",
"data": {
"monitor_id": "uuid",
"status": "up | down | paused",
"response_time_ms": 142,
"checked_at": "ISO 8601"
}
}
heartbeat.ping_received
{
"channel": "heartbeats.status",
"type": "heartbeat.ping_received",
"data": {
"heartbeat_id": "uuid",
"status": "up | missed",
"last_ping_at": "ISO 8601 | null"
}
}
Keep-alive ping
There is no application-level tick JSON event. To keep the connection alive, the server sends a WebSocket protocol PING control frame every 30 seconds to each connected client. Browsers and standard WebSocket libraries answer these PING frames automatically, so no application-level pong or handling is required.
In-app notification feed events
Returned by GET /api/v1/notifications/feed (paginated). Real-time updates are pushed on the notifications.feed WebSocket channel.
The type field identifies the event kind. The documented values correspond to the categories recognized by the feed:
type | Category | Meaning |
|---|---|---|
down | incident | Monitor or heartbeat opened an incident |
up | incident | Monitor or heartbeat recovered |
mass_outage | incident | Multi-region outage opened |
ssl_expiry | incident | Certificate approaching expiry |
incident | incident | Generic incident event |
recovered | incident | Incident resolved |
admin | admin | Platform admin broadcast |
broadcast | admin | System-wide announcement |
announcement | admin | Platform announcement |
billing | billing | Billing or plan change |
limit | billing | Tier limit notice |
usage | billing | Usage quota alert |
plan | billing | Plan change |
Feed item shape:
{
"id": "uuid",
"tenant_id": "uuid",
"user_id": "uuid",
"type": "down",
"title": "Production API is down",
"body": "Monitor detected failure at 10:00 UTC",
"severity": "critical",
"incident_id": "uuid",
"monitor_id": "uuid",
"category": "incident",
"reactions": [],
"read_at": null,
"created_at": "ISO 8601"
}
Note: read_at is null when unread and an ISO 8601 timestamp when read. There is no boolean read field. There is no link field; callers construct the deep link from incident_id or monitor_id.
Severity levels
| Severity | Description |
|---|---|
critical | Service is fully unavailable or data loss is possible |
warning | Service is degraded, slow responses, or partial failures |
info | Informational: recovery, maintenance, or system notices |
See also
Was this page helpful?