List incidents

GET/v1/api/sites/{site_id}/incidents

List a site's monitoring incidents, crawl slowdown included, as the Alerts page shows them.

Active and acknowledged incidents are returned unless status or include_archived says otherwise. first_detected_from and first_detected_to bound the period together.

Scope
alerts:read
Token
API key or OAuth access token
Role
Any workspace member
MCP tool
list_incidents
What scopes, tokens and roles mean →
Request
curl "https://api.crawle.io/v1/api/sites/11111111-1111-1111-1111-111111111111/incidents?limit=10" \
  -H "Authorization: Bearer $CRAWLE_API_KEY"
const response = await fetch("https://api.crawle.io/v1/api/sites/11111111-1111-1111-1111-111111111111/incidents?limit=10", {
  headers: {
    Authorization: `Bearer ${process.env.CRAWLE_API_KEY}`,
  },
});
const data = await response.json();
import os

import requests

response = requests.request(
    "GET",
    "https://api.crawle.io/v1/api/sites/11111111-1111-1111-1111-111111111111/incidents?limit=10",
    headers={
        "Authorization": f"Bearer {os.environ['CRAWLE_API_KEY']}",
    },
)
data = response.json()
$CRAWLE_API_KEY
is an API key from Settings › API keys.
Response 200JSON
{
  "items": [
    {
      "acknowledged_at": "example",
      "acknowledged_by": "example",
      "affected_count": 1,
      "closure_kind": "merged_into_group",
      "created_at": "example",
      "details": {},
      "eligibility_revision": 1,
      "escalation_count": 1,
      "extra_data": {
        "closure_kind": "consumed"
      },
      "first_detected_at": "example",
      "id": 1,
      "last_checked_at": "example",
      "membership_key": "example",
      "membership_revision": "example",
      "membership_state": "confirmed",
      "redirected_count": 1,
      "resolved_at": "example",
      "resolved_count": 1,
      "restored_count": 1,
      "severity": "critical",
      "status": "active",
      "summary": "example",
      "title": "Example",
      "trigger_type": "example",
      "website_id": 1
    }
  ],
  "limit": 1,
  "next_cursor": "example",
  "offset": 1,
  "resolve_selection_count": 1,
  "resolve_selection_filter_summary": {},
  "resolve_selection_skipped_count": 1,
  "resolve_selection_token": "example",
  "selection_count": 1,
  "selection_filter_summary": {},
  "selection_token": "example",
  "sort_by": "example",
  "total": 1,
  "unclassified_count": 1
}

Example generated from the API contract.

Parameters

site_idpath · string (uuid)required
statusquery · string or null
up to 40 characters
severityquery · string or null
up to 40 characters
trigger_typequery · string or null
up to 120 characters
include_archivedquery · boolean
default false
first_detected_fromquery · string or null
up to 64 characters
first_detected_toquery · string or null
up to 64 characters
limitquery · integer
1–500 · default 100
offsetquery · integer
0–100000 · default 0

Pages with limit and offset.

Response 200

itemsarray of PublicIncidentrequired
acknowledged_atstring or null
acknowledged_bystring or null
affected_countintegerrequired
closure_kindenum or null
How a resolved incident was closed when that was not a plain recovery. merged_into_group: a broken-link incident folded into a group. alert_exclusion: closed by an alert exclusion. null: a normal recovery, or an incident that is not resolved. The field is absent when the site's crawler predates it. It does not mirror extra_data.closure_kind, which can say more (consumed, unverified_legacy, partially_superseded).one of "merged_into_group", "alert_exclusion"
created_atstring or null
detailsobject or null
eligibility_revisioninteger or null
escalation_countinteger or null
extra_dataPublicIncidentExtraData or array of any or null
Trigger evidence as the crawler stored it: an object for most triggers, and a list or null for some. For a closed incident it can carry closure_kind.
first_detected_atstring or null
idintegerrequired
last_checked_atstring or null
membership_keystring or null
membership_revisionstring or null
membership_stateenum or null
confirmed: the count and the page come from one stored snapshot. partial: the count is known but the page could not be read. unavailable: no page list exists for this incident (site-level triggers, broken links; the answer is HTTP 200, not an error), and total is null.one of "confirmed", "partial", "unavailable"
redirected_countinteger or null
resolved_atstring or null
resolved_countinteger or null
restored_countinteger or null
severityenumrequired
Incident severity.one of "critical", "warning", "info"
statusenumrequired
Lifecycle status.one of "active", "acknowledged", "resolved"
summarystringrequired
titlestringrequired
trigger_typestringrequired
The kind of incident, for example pages_erroring, title_changed, robots_txt_changed or crawl_slowdown. New kinds appear over time; read it as an open string.
website_idintegerrequired
totalintegerrequired
limitinteger or null
next_cursorstring or null
offsetinteger or null
resolve_selection_countinteger or null
resolve_selection_filter_summaryobject or null
resolve_selection_skipped_countinteger or null
Open incidents a resolve would leave open.
resolve_selection_tokenstring or null
Token for resolving every active or acknowledged incident the filter matches.
selection_countinteger or null
selection_filter_summaryobject or null
selection_tokenstring or null
Token for acknowledging every active incident the filter matches.
sort_bystring or null
unclassified_countinteger or null

Errors

  • 401

    When
    Missing, invalid, or expired token.
  • 403

    When
    The token has none of the accepted scopes (alerts:read).
  • 422

    When
    The request did not match the schema. detail lists each problem.
  • 502

    When
    The site's crawler answered outside the contract (crawler_response_invalid).
  • 429

    When
    Rate limited. Wait for Retry-After seconds.

All errors and what to do →

Generated from the API contract at 7e7039b0b, synced October 30, 2026.