> For the complete documentation index, see [llms.txt](https://docs.visualsentinel.com/llms.txt)

# IncidentContext data model

Everything the incident detail view shows, in one read.

## Fields

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `generatedAt` | string (date-time) | No |   |
| `incident` | object | No |   |
| `incident.id` | string (uuid) | No |   |
| `incident.title` | string | No |   |
| `incident.description` | string or null | No |   |
| `incident.state` | string | No | One of: `ongoing`, `acknowledged`, `resolved`. |
| `incident.rawStatus` | string | No | Stored status, for example INVESTIGATING or RESOLVED. |
| `incident.startedAt` | string (date-time) | No |   |
| `incident.detectedAt` | string (date-time) | No |   |
| `incident.acknowledgedAt` | string (date-time) or null (date-time) | No |   |
| `incident.acknowledgedBy` | object or null | No |   |
| `incident.acknowledgedBy.id` | string | No |   |
| `incident.acknowledgedBy.name` | string | No |   |
| `incident.resolvedAt` | string (date-time) or null (date-time) | No |   |
| `incident.durationMs` | integer | No |   |
| `incident.autoResolve` | boolean | No |   |
| `incident.rootCause` | string or null | No |   |
| `incident.resolution` | string or null | No |   |
| `incident.monitorId` | string (uuid) or null (uuid) | No |   |
| `incident.serverId` | string (uuid) or null (uuid) | No |   |
| `incident.visualTargetId` | string (uuid) or null (uuid) | No |   |
| `incident.metadata` | any | No | Stored incident metadata (any JSON). |
| `incident.severity` | string | No | critical, high, medium, low or info. |
| `incident.incidentKind` | string or null | No |   |
| `incident.reported` | boolean | No | A person reported the incident. |
| `incident.reportedBy` | object or null | No |   |
| `incident.reportedBy.id` | string | No |   |
| `incident.reportedBy.name` | string | No |   |
| `owner` | string | No | One of: `uptime`, `ssl`, `performance`, `domain`, `content`, `visual`, `security`, `server`, `other`. |
| `checkType` | string | No | One of: `other_address`, `uptime`, `ssl`, `domain`, `performance`, `content`, `visual`, `security`, `server`, `manual`. |
| `cause` | string | No | One of: `other_address`, `http_error`, `checker_blocked`, `checker_rate_limited`, `timeout`, `dns`, `refused`, `down`, `certificate_expired`, `certificate_self_signed`, `certificate_mismatch`, `certificate_problem`, `ssl_expiring`, `ssl_expired`, `slow`, `performance`, `domain_expired`, `visual_change`, `content_failed`, `security`, `server`, `manual`. |
| `headline` | string | No |   |
| `shortCause` | string or null | No |   |
| `summary` | object | No |   |
| `summary.what` | string | No |   |
| `summary.where` | string or null | No |   |
| `summary.next` | string or null | No |   |
| `steps` | array of string | No |   |
| `fixActions` | array of object | No | Suggested fixes. Empty unless your role is Owner, Admin or Developer. |
| `fixActions[].kind` | string | Yes | One of: `ssl_check`, `settings_link`, `bot_page`, `server_link`, `mute`. |
| `fixActions[].enabled` | boolean | No | `ssl_check` only. |
| `fixActions[].section` | string | No | `settings_link` only: monitor settings section id. |
| `fixActions[].serverId` | string | No | `server_link` only. |
| `fixActions[].label` | string | No |   |
| `whatWeChecked` | array of object | No |   |
| `whatWeChecked[].label` | string | No |   |
| `whatWeChecked[].value` | string | No |   |
| `whatWeChecked[].at` | string (date-time) | No | Optional time to show after `value`. |
| `settingsSection` | string or null | No | One of: `general`, `uptime`, `ssl`, `domain`, `visual`, `content`, `performance`, `dns`, `alerts`, `reports`, `server`, `danger`, `null`. |
| `monitor` | object or null | No | Null for server incidents and when the monitor was deleted. |
| `monitor.id` | string (uuid) | No |   |
| `monitor.name` | string | No |   |
| `monitor.url` | string | No |   |
| `monitor.enabled` | boolean | No |   |
| `monitor.checkInterval` | integer | No |   |
| `monitor.timeout` | integer | No |   |
| `monitor.alertThreshold` | integer | No |   |
| `monitor.maxResponseTime` | integer | No |   |
| `monitor.locations` | array of string | No |   |
| `monitor.sslCheck` | boolean | No |   |
| `monitor.sslAlertDays` | array of integer | No |   |
| `monitor.domainExpiryEnabled` | boolean | No |   |
| `monitor.domainAlertDays` | array of integer | No |   |
| `monitor.notificationRepeatInterval` | integer | No | Minutes until a reminder, then one a day; 0 sends no reminders. |
| `monitor.alertsMutedUntil` | string (date-time) or null (date-time) | No | End of an active mute; null when alerts are live. |
| `monitor.alertsMuteExempt` | boolean | No | True when a mute never holds back this incident's alerts (possible malware). |
| `monitor.linkedChannels` | array of object | No |   |
| `monitor.linkedChannels[].id` | string (uuid) | No |   |
| `monitor.linkedChannels[].name` | string | No |   |
| `monitor.linkedChannels[].type` | string | No |   |
| `monitor.linkedChannels[].enabled` | boolean | No |   |
| `server` | object or null | No |   |
| `server.id` | string (uuid) | No |   |
| `server.name` | string | No |   |
| `server.status` | string | No |   |
| `server.cpuUsage` | number or null | No |   |
| `server.memoryUsage` | number or null | No |   |
| `server.diskUsage` | number or null | No |   |
| `server.cpuCores` | integer or null | No |   |
| `server.loadAverage` | array of number or null | No |   |
| `server.loadWarnRatio` | number or null | No |   |
| `server.loadCritRatio` | number or null | No |   |
| `server.agentLastSeen` | string (date-time) or null (date-time) | No |   |
| `regions` | array of object | No |   |
| `regions[].region` | string | No |   |
| `regions[].label` | string | No |   |
| `regions[].failing` | boolean | No |   |
| `regions[].latest` | object or null | No |   |
| `regions[].latest.at` | string (date-time) | No |   |
| `regions[].latest.ok` | boolean | No |   |
| `regions[].latest.regionalOnly` | boolean | No |   |
| `regions[].latest.result` | string | No |   |
| `regions[].latest.statusCode` | integer or null | No |   |
| `checkLog` | object | No | Checks from 15 minutes before the start to the resolution (or now). When the window holds more than 50 checks, the newest 50 and oldest 10 are returned and `omitted` counts the rest. |
| `checkLog.windowStart` | string (date-time) | No |   |
| `checkLog.windowEnd` | string (date-time) | No |   |
| `checkLog.rows` | array of object | No |   |
| `checkLog.rows[].id` | string | No |   |
| `checkLog.rows[].at` | string (date-time) | No |   |
| `checkLog.rows[].region` | string | No |   |
| `checkLog.rows[].regionLabel` | string | No |   |
| `checkLog.rows[].ok` | boolean | No |   |
| `checkLog.rows[].regionalOnly` | boolean | No |   |
| `checkLog.rows[].statusCode` | integer or null | No |   |
| `checkLog.rows[].result` | string | No |   |
| `checkLog.rows[].error` | string or null | No |   |
| `checkLog.rows[].errorCode` | string or null | No |   |
| `checkLog.rows[].responseTimeMs` | number or null | No |   |
| `checkLog.omitted` | integer | No |   |
| `certificate` | object or null | No |   |
| `certificate.validFrom` | string (date-time) | No |   |
| `certificate.validTo` | string (date-time) | No |   |
| `certificate.daysRemaining` | integer | No |   |
| `certificate.issuer` | string | No |   |
| `certificate.subject` | string | No |   |
| `certificate.algorithm` | string | No |   |
| `certificate.keySize` | integer | No |   |
| `certificate.altNames` | array of string | No |   |
| `visualDiff` | object or null | No | Before and after screenshots recorded with a visual incident. |
| `visualDiff.a` | string | No | Baseline image path. |
| `visualDiff.b` | string | No | Capture image path. |
| `visualDiff.diff` | string or null | No |   |
| `visualDiff.percent` | number | No |   |
| `visualDiff.threshold` | number or null | No |   |
| `visualDiff.screenshotId` | string | No |   |
| `visualDiff.visualTargetId` | string or null | No |   |
| `visualDiff.viewport` | string or null | No | One of: `DESKTOP`, `MOBILE`, `null`. |
| `visualDiff.targetLabel` | string or null | No |   |
| `visualDiff.exact` | boolean | No | One of: `true`. |
| `checksInRow` | object | No |   |
| `checksInRow.count` | integer | No |   |
| `checksInRow.atLeast` | boolean | No | True when the stored log is cut short, so the real count may be higher. |
| `uptimeToday` | object or null | No | The monitor's day so far in the `tz` time zone (UTC when not given or not valid). |
| `uptimeToday.percent` | number or null | No |   |
| `uptimeToday.downSeconds` | integer | No |   |
| `uptimeToday.since` | string (date-time) | No |   |
| `uptimeToday.slots` | array of string | No | Items are one of: `ok`, `bad`, `none`. |
| `sentEvents` | array of object | No | Alerts that went out, one per event. |
| `sentEvents[].event` | string | No | One of: `opened`, `reminder`, `recovered`. |
| `sentEvents[].at` | string (date-time) | No |   |
| `sentEvents[].sent` | integer | No |   |
| `sentEvents[].failed` | integer | No |   |
| `sentEvents[].pending` | integer | No |   |
| `sentEvents[].total` | integer | No |   |
| `earlierOnMonitor` | array of object | No | Up to three earlier resolved incidents of the same monitor. |
| `earlierOnMonitor[].id` | string (uuid) | No |   |
| `earlierOnMonitor[].title` | string | No |   |
| `earlierOnMonitor[].source` | string | No |   |
| `earlierOnMonitor[].startedAt` | string (date-time) | No |   |
| `earlierOnMonitor[].durationMs` | integer | No |   |
| `earlierOnMonitor[].checkType` | string | No |   |
| `publicPreview` | object or null | No | What the first public status page showing this monitor says right now. |
| `publicPreview.statusPage` | object | No |   |
| `publicPreview.statusPage.id` | string (uuid) | No |   |
| `publicPreview.statusPage.name` | string | No |   |
| `publicPreview.statusPage.slug` | string | No |   |
| `publicPreview.statusPage.host` | string or null | No |   |
| `publicPreview.services` | array of object | No |   |
| `publicPreview.services[].name` | string | No |   |
| `publicPreview.services[].state` | string | No | One of: `ok`, `degraded`, `problem`, `maintenance`. |
| `publicPreview.incident` | object or null | No |   |
| `publicPreview.incident.title` | string | No |   |
| `publicPreview.incident.status` | string | No |   |
| `publicPreview.incident.message` | string or null | No |   |
| `publicPreview.incident.at` | string (date-time) | No |   |
| `statusPages` | array of object | No |   |
| `statusPages[].id` | string (uuid) | No |   |
| `statusPages[].name` | string | No |   |
| `deliveries` | array of object or null | No | Who was told, per channel, oldest first. Empty for incidents from before delivery records existed; null when the record could not be read. |
| `deliveries[].event` | string | No | `update` is what a person's manual close, update or reopen sent. One of: `opened`, `reminder`, `recovered`, `update`, `other`. |
| `deliveries[].channelId` | string (uuid) or null (uuid) | No |   |
| `deliveries[].channelName` | string | No |   |
| `deliveries[].channelType` | string | No | Channel type such as EMAIL or SLACK, or ALL for an outcome that applied to every channel. |
| `deliveries[].status` | string | No | One of: `sent`, `not_sent`, `pending`. |
| `deliveries[].reason` | string or null | No | Plain-language reason when not sent or still pending. |
| `deliveries[].at` | string (date-time) | No |   |
| `updates` | array of object | No |   |
| `updates[].id` | string (uuid) | No |   |
| `updates[].status` | string | No |   |
| `updates[].message` | string | No |   |
| `updates[].authorName` | string or null | No |   |
| `updates[].system` | boolean | No |   |
| `updates[].createdAt` | string (date-time) | No |   |
| `muteEvents` | array of object | No | Alert mutes and unmutes of the monitor while the incident was open, oldest first. |
| `muteEvents[].at` | string (date-time) | No |   |
| `muteEvents[].kind` | string | No | One of: `muted`, `unmuted`. |
| `muteEvents[].byName` | string or null | No |   |
| `muteEvents[].until` | string (date-time) or null (date-time) | No | End of the mute, for `muted`. |
| `related` | array of object | No |   |
| `related[].id` | string (uuid) | No |   |
| `related[].title` | string | No |   |
| `related[].state` | string | No | One of: `ongoing`, `acknowledged`, `resolved`. |
| `related[].startedAt` | string (date-time) | No |   |
| `related[].resolvedAt` | string (date-time) or null (date-time) | No |   |
| `cluster` | object or null | No | Present only for incidents tied to a server: the monitors on that server it affects and its child incidents. Null otherwise. |
| `cluster.affectedMonitors` | array of object | No |   |
| `cluster.clusterRollup` | object or null | No |   |
| `cluster.separateOpenIssues` | array of object | No |   |
| `cluster.childIncidents` | array of object | No |   |
| `cluster.childIncidents[].id` | string (uuid) | No |   |
| `cluster.childIncidents[].title` | string | No |   |
| `cluster.childIncidents[].status` | string | No |   |
| `cluster.childIncidents[].severity` | string | No |   |
| `cluster.childIncidents[].monitorId` | string (uuid) or null (uuid) | No |   |
| `cluster.childIncidents[].monitor` | object or null | No |   |
| `cluster.childIncidents[].monitor.name` | string | No |   |
| `cluster.childIncidents[].monitor.url` | string | No |   |
| `cluster.childIncidents[].monitor.status` | string | No |   |
| `cluster.parentIncident` | object or null | No |   |
| `cluster.parentIncident.id` | string (uuid) | No |   |
| `cluster.parentIncident.title` | string | No |   |
| `cluster.parentIncident.status` | string | No |   |
| `viewer` | object | No |   |
| `viewer.canEdit` | boolean | No | Owner, Admin or Developer. |
| `viewer.canPostStatusUpdate` | boolean | No | Owner or Admin. |

## Used by

- [Get incident detail context](https://docs.visualsentinel.com/reference/incidents.md#get-incident-context): `GET /api/incidents/{id}/context`

Generated from the OpenAPI 3.1 specification at [https://docs.visualsentinel.com/openapi.json](https://docs.visualsentinel.com/openapi.json).
