{"openapi":"3.1.1","info":{"title":"Moonitor Public API","version":"1.0.0","summary":"Uptime monitors, incidents, status pages and signed webhooks for one Moonitor organization.","description":"Manage monitors, incidents, status pages, maintenance windows, and signed webhook deliveries for one Moonitor organization.\n\n## Authentication\n\nEvery request needs an organization API key, sent as `X-API-Key: <key>` or `Authorization: Bearer <key>`. Keys are created in the dashboard, are scoped to a single organization, and carry either read-only or full permissions. There is no unauthenticated surface.\n\n## Errors\n\nEvery failure returns the same `Error` shape with a stable, machine-readable `error.code` — branch on that, never on `error.message`. `error.requestId` is echoed in the `X-Request-Id` header; quote it in support requests. Validation failures add `error.details[]` with a dotted `path` per offending field.\n\n## Rate limits\n\nKeys are limited to 120 requests per 60 seconds. Every response carries `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`, plus the structured `RateLimit` and `RateLimit-Policy` fields, so a client can pace itself without probing. Exceeding the quota returns `429` with `Retry-After`.\n\n## Retries and idempotency\n\nSend an `Idempotency-Key` header with any non-GET request. The first successful response is stored and replayed for 24 hours, so a network-level retry cannot create a duplicate monitor or double-publish an incident.\n\n## Versioning and deprecation\n\nThe version is in the path (`/api/v1`). Breaking changes ship as a new version; the previous one keeps working. When a surface is scheduled for removal its responses carry `Deprecation` and `Sunset` headers (RFC 9745 and RFC 8594) with a `Link; rel=\"deprecation\"` pointing at the notes, and we allow at least 180 days between that first `Deprecation` header and the shutdown date. Additive changes — new endpoints, new optional fields — happen within a version, so clients must ignore unknown response fields.","contact":{"name":"Moonitor Support","email":"hello@moonitor.dev","url":"https://www.moonitor.dev/contact"},"license":{"name":"Moonitor API Terms","url":"https://www.moonitor.dev/terms"},"termsOfService":"https://www.moonitor.dev/terms"},"externalDocs":{"description":"API guide","url":"https://www.moonitor.dev/docs/api"},"servers":[{"url":"https://www.moonitor.dev","description":"Production"}],"tags":[{"name":"Monitors","description":"Create and manage the checks that watch your services."},{"name":"Incidents","description":"Outages Moonitor detected and verified, and their acknowledgements."},{"name":"Status pages","description":"Public status pages and the incidents you publish on them."},{"name":"Maintenance","description":"Planned windows that suppress alerts and show as scheduled on status pages."},{"name":"Webhooks","description":"Signed event subscriptions and their delivery history."}],"paths":{"/api/v1/monitors":{"get":{"operationId":"listMonitors","summary":"List monitors","description":"Every monitor in the organization with its current state, interval and last check. Page with `limit` and `offset`; `pagination.total` is the unpaged count, so keep requesting until `offset + limit` reaches it.","tags":["Monitors"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":100000}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"type":{"type":"string","enum":["HTTP","KEYWORD","PING","PORT","CRON","DNS","SSL","DOMAIN"]},"state":{"type":"string","enum":["PENDING","UP","DEGRADED","DOWN","PAUSED"]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"host":{"anyOf":[{"type":"string"},{"type":"null"}]},"port":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"method":{"type":"string","enum":["GET","HEAD","POST","PUT","PATCH","DELETE"]},"expectedStatus":{"type":"array","items":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"requestHeaders":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"requestBody":{"anyOf":[{"type":"string"},{"type":"null"}]},"followRedirects":{"type":"boolean"},"verifySsl":{"type":"boolean"},"keyword":{"anyOf":[{"type":"string"},{"type":"null"}]},"keywordMatch":{"type":"string","enum":["EXISTS","NOT_EXISTS"]},"dnsRecordType":{"anyOf":[{"type":"string"},{"type":"null"}]},"dnsExpected":{"anyOf":[{"type":"string"},{"type":"null"}]},"dnsAlertOnChange":{"type":"boolean"},"sslExpiryThresholdDays":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"intervalSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"timeoutSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"expectedPeriodSec":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"graceSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"degradedThresholdMs":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"degradedThresholdMode":{"type":"string","enum":["LAST","P95"]},"degradedSamples":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"heartbeatUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"lastCheckedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastStatusChangedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastResponseMs":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"certExpiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","name","type","state","url","host","port","method","expectedStatus","requestHeaders","requestBody","followRedirects","verifySsl","keyword","keywordMatch","dnsRecordType","dnsExpected","dnsAlertOnChange","sslExpiryThresholdDays","intervalSeconds","timeoutSeconds","expectedPeriodSec","graceSeconds","degradedThresholdMs","degradedThresholdMode","degradedSamples","heartbeatUrl","lastCheckedAt","lastStatusChangedAt","lastResponseMs","certExpiresAt","createdAt","updatedAt"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"offset":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["limit","offset","total"],"additionalProperties":false}},"required":["data","pagination"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"operationId":"createMonitor","summary":"Create a monitor","description":"Creates a monitor and queues its first check immediately, so it starts in PENDING rather than UP. The `type` decides which fields apply: HTTP and KEYWORD take a `url`, PING and PORT take a `host` (PORT also a `port`), SSL, DOMAIN and DNS take a `url`, and CRON takes none — it waits to be pinged. Every existing alert contact in the organization is attached automatically. Returns `plan_limit` when the plan's monitor allowance is already used, or when the requested `intervalSeconds` is faster than the plan permits.","tags":["Monitors"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"type":{"type":"string","enum":["HTTP","KEYWORD","PING","PORT","CRON","DNS","SSL","DOMAIN"]},"url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}]},"host":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}]},"port":{"anyOf":[{"type":"integer","minimum":1,"maximum":65535},{"type":"null"}]},"method":{"default":"GET","type":"string","enum":["GET","HEAD","POST","PUT","PATCH","DELETE"]},"expectedStatus":{"default":[200,201,202,203,204,205,206,301,302,307,308],"minItems":1,"maxItems":100,"type":"array","items":{"type":"integer","minimum":100,"maximum":599}},"requestHeaders":{"default":null,"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},{"type":"null"}]},"requestBody":{"default":null,"anyOf":[{"type":"string","maxLength":100000},{"type":"null"}]},"followRedirects":{"default":true,"type":"boolean"},"verifySsl":{"default":true,"type":"boolean"},"keyword":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"keywordMatch":{"default":"EXISTS","type":"string","enum":["EXISTS","NOT_EXISTS"]},"dnsRecordType":{"default":"A","type":"string","enum":["A","AAAA","CNAME","MX","TXT","NS"]},"dnsExpected":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"dnsAlertOnChange":{"default":true,"type":"boolean"},"sslExpiryThresholdDays":{"default":2,"type":"integer","minimum":1,"maximum":365},"intervalSeconds":{"default":300,"type":"integer","minimum":30,"maximum":86400},"timeoutSeconds":{"default":30,"type":"integer","minimum":1,"maximum":60},"expectedPeriodSec":{"anyOf":[{"type":"integer","minimum":60,"maximum":2592000},{"type":"null"}]},"graceSeconds":{"default":60,"type":"integer","minimum":0,"maximum":86400},"degradedThresholdMs":{"anyOf":[{"type":"integer","minimum":1,"maximum":60000},{"type":"null"}]},"degradedThresholdMode":{"default":"LAST","type":"string","enum":["LAST","P95"]},"degradedSamples":{"default":3,"type":"integer","minimum":1,"maximum":100}},"required":["name","type"]}}}},"responses":{"201":{"description":"Created. The monitor exists and is queued for its first check.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"type":{"type":"string","enum":["HTTP","KEYWORD","PING","PORT","CRON","DNS","SSL","DOMAIN"]},"state":{"type":"string","enum":["PENDING","UP","DEGRADED","DOWN","PAUSED"]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"host":{"anyOf":[{"type":"string"},{"type":"null"}]},"port":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"method":{"type":"string","enum":["GET","HEAD","POST","PUT","PATCH","DELETE"]},"expectedStatus":{"type":"array","items":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"requestHeaders":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"requestBody":{"anyOf":[{"type":"string"},{"type":"null"}]},"followRedirects":{"type":"boolean"},"verifySsl":{"type":"boolean"},"keyword":{"anyOf":[{"type":"string"},{"type":"null"}]},"keywordMatch":{"type":"string","enum":["EXISTS","NOT_EXISTS"]},"dnsRecordType":{"anyOf":[{"type":"string"},{"type":"null"}]},"dnsExpected":{"anyOf":[{"type":"string"},{"type":"null"}]},"dnsAlertOnChange":{"type":"boolean"},"sslExpiryThresholdDays":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"intervalSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"timeoutSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"expectedPeriodSec":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"graceSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"degradedThresholdMs":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"degradedThresholdMode":{"type":"string","enum":["LAST","P95"]},"degradedSamples":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"heartbeatUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"lastCheckedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastStatusChangedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastResponseMs":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"certExpiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","name","type","state","url","host","port","method","expectedStatus","requestHeaders","requestBody","followRedirects","verifySsl","keyword","keywordMatch","dnsRecordType","dnsExpected","dnsAlertOnChange","sslExpiryThresholdDays","intervalSeconds","timeoutSeconds","expectedPeriodSec","graceSeconds","degradedThresholdMs","degradedThresholdMode","degradedSamples","heartbeatUrl","lastCheckedAt","lastStatusChangedAt","lastResponseMs","certExpiresAt","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/monitors/{monitorId}":{"get":{"operationId":"getMonitor","summary":"Get a monitor","description":"One monitor with its full configuration, current state and most recent check result.","tags":["Monitors"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"type":{"type":"string","enum":["HTTP","KEYWORD","PING","PORT","CRON","DNS","SSL","DOMAIN"]},"state":{"type":"string","enum":["PENDING","UP","DEGRADED","DOWN","PAUSED"]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"host":{"anyOf":[{"type":"string"},{"type":"null"}]},"port":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"method":{"type":"string","enum":["GET","HEAD","POST","PUT","PATCH","DELETE"]},"expectedStatus":{"type":"array","items":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"requestHeaders":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"requestBody":{"anyOf":[{"type":"string"},{"type":"null"}]},"followRedirects":{"type":"boolean"},"verifySsl":{"type":"boolean"},"keyword":{"anyOf":[{"type":"string"},{"type":"null"}]},"keywordMatch":{"type":"string","enum":["EXISTS","NOT_EXISTS"]},"dnsRecordType":{"anyOf":[{"type":"string"},{"type":"null"}]},"dnsExpected":{"anyOf":[{"type":"string"},{"type":"null"}]},"dnsAlertOnChange":{"type":"boolean"},"sslExpiryThresholdDays":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"intervalSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"timeoutSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"expectedPeriodSec":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"graceSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"degradedThresholdMs":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"degradedThresholdMode":{"type":"string","enum":["LAST","P95"]},"degradedSamples":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"heartbeatUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"lastCheckedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastStatusChangedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastResponseMs":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"certExpiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","name","type","state","url","host","port","method","expectedStatus","requestHeaders","requestBody","followRedirects","verifySsl","keyword","keywordMatch","dnsRecordType","dnsExpected","dnsAlertOnChange","sslExpiryThresholdDays","intervalSeconds","timeoutSeconds","expectedPeriodSec","graceSeconds","degradedThresholdMs","degradedThresholdMode","degradedSamples","heartbeatUrl","lastCheckedAt","lastStatusChangedAt","lastResponseMs","certExpiresAt","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"operationId":"updateMonitor","summary":"Update a monitor","description":"A partial update: fields you omit keep their current values. The result is validated as a whole, so a patch that leaves the monitor internally inconsistent — a PORT monitor with no `port`, say — is rejected rather than half-applied. Emits `monitor.updated` to your webhooks.","tags":["Monitors"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"type":{"type":"string","enum":["HTTP","KEYWORD","PING","PORT","CRON","DNS","SSL","DOMAIN"]},"url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}]},"host":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}]},"port":{"anyOf":[{"type":"integer","minimum":1,"maximum":65535},{"type":"null"}]},"method":{"type":"string","enum":["GET","HEAD","POST","PUT","PATCH","DELETE"]},"expectedStatus":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"integer","minimum":100,"maximum":599}},"requestHeaders":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},{"type":"null"}]},"requestBody":{"anyOf":[{"type":"string","maxLength":100000},{"type":"null"}]},"followRedirects":{"type":"boolean"},"verifySsl":{"type":"boolean"},"keyword":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"keywordMatch":{"type":"string","enum":["EXISTS","NOT_EXISTS"]},"dnsRecordType":{"type":"string","enum":["A","AAAA","CNAME","MX","TXT","NS"]},"dnsExpected":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"dnsAlertOnChange":{"type":"boolean"},"sslExpiryThresholdDays":{"type":"integer","minimum":1,"maximum":365},"intervalSeconds":{"type":"integer","minimum":30,"maximum":86400},"timeoutSeconds":{"type":"integer","minimum":1,"maximum":60},"expectedPeriodSec":{"anyOf":[{"type":"integer","minimum":60,"maximum":2592000},{"type":"null"}]},"graceSeconds":{"type":"integer","minimum":0,"maximum":86400},"degradedThresholdMs":{"anyOf":[{"type":"integer","minimum":1,"maximum":60000},{"type":"null"}]},"degradedThresholdMode":{"type":"string","enum":["LAST","P95"]},"degradedSamples":{"type":"integer","minimum":1,"maximum":100}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"type":{"type":"string","enum":["HTTP","KEYWORD","PING","PORT","CRON","DNS","SSL","DOMAIN"]},"state":{"type":"string","enum":["PENDING","UP","DEGRADED","DOWN","PAUSED"]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"host":{"anyOf":[{"type":"string"},{"type":"null"}]},"port":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"method":{"type":"string","enum":["GET","HEAD","POST","PUT","PATCH","DELETE"]},"expectedStatus":{"type":"array","items":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"requestHeaders":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"requestBody":{"anyOf":[{"type":"string"},{"type":"null"}]},"followRedirects":{"type":"boolean"},"verifySsl":{"type":"boolean"},"keyword":{"anyOf":[{"type":"string"},{"type":"null"}]},"keywordMatch":{"type":"string","enum":["EXISTS","NOT_EXISTS"]},"dnsRecordType":{"anyOf":[{"type":"string"},{"type":"null"}]},"dnsExpected":{"anyOf":[{"type":"string"},{"type":"null"}]},"dnsAlertOnChange":{"type":"boolean"},"sslExpiryThresholdDays":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"intervalSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"timeoutSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"expectedPeriodSec":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"graceSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"degradedThresholdMs":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"degradedThresholdMode":{"type":"string","enum":["LAST","P95"]},"degradedSamples":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"heartbeatUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"lastCheckedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastStatusChangedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastResponseMs":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"certExpiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","name","type","state","url","host","port","method","expectedStatus","requestHeaders","requestBody","followRedirects","verifySsl","keyword","keywordMatch","dnsRecordType","dnsExpected","dnsAlertOnChange","sslExpiryThresholdDays","intervalSeconds","timeoutSeconds","expectedPeriodSec","graceSeconds","degradedThresholdMs","degradedThresholdMode","degradedSamples","heartbeatUrl","lastCheckedAt","lastStatusChangedAt","lastResponseMs","certExpiresAt","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"delete":{"operationId":"deleteMonitor","summary":"Delete a monitor","description":"Permanently removes the monitor along with its check history and incidents. This cannot be undone — pause the monitor instead if you only want to stop the checks.","tags":["Monitors"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"responses":{"200":{"description":"Deleted. The body carries the id that was removed.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","minLength":1}},"required":["id"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/monitors/{monitorId}/pause":{"post":{"operationId":"pauseMonitor","summary":"Pause a monitor","description":"Stops checking and suppresses alerts, keeping the monitor and its history. Idempotent: pausing an already-paused monitor returns it unchanged. Paused time is excluded from uptime rather than counted as downtime.","tags":["Monitors"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"type":{"type":"string","enum":["HTTP","KEYWORD","PING","PORT","CRON","DNS","SSL","DOMAIN"]},"state":{"type":"string","enum":["PENDING","UP","DEGRADED","DOWN","PAUSED"]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"host":{"anyOf":[{"type":"string"},{"type":"null"}]},"port":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"method":{"type":"string","enum":["GET","HEAD","POST","PUT","PATCH","DELETE"]},"expectedStatus":{"type":"array","items":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"requestHeaders":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"requestBody":{"anyOf":[{"type":"string"},{"type":"null"}]},"followRedirects":{"type":"boolean"},"verifySsl":{"type":"boolean"},"keyword":{"anyOf":[{"type":"string"},{"type":"null"}]},"keywordMatch":{"type":"string","enum":["EXISTS","NOT_EXISTS"]},"dnsRecordType":{"anyOf":[{"type":"string"},{"type":"null"}]},"dnsExpected":{"anyOf":[{"type":"string"},{"type":"null"}]},"dnsAlertOnChange":{"type":"boolean"},"sslExpiryThresholdDays":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"intervalSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"timeoutSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"expectedPeriodSec":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"graceSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"degradedThresholdMs":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"degradedThresholdMode":{"type":"string","enum":["LAST","P95"]},"degradedSamples":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"heartbeatUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"lastCheckedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastStatusChangedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastResponseMs":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"certExpiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","name","type","state","url","host","port","method","expectedStatus","requestHeaders","requestBody","followRedirects","verifySsl","keyword","keywordMatch","dnsRecordType","dnsExpected","dnsAlertOnChange","sslExpiryThresholdDays","intervalSeconds","timeoutSeconds","expectedPeriodSec","graceSeconds","degradedThresholdMs","degradedThresholdMode","degradedSamples","heartbeatUrl","lastCheckedAt","lastStatusChangedAt","lastResponseMs","certExpiresAt","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/monitors/{monitorId}/resume":{"post":{"operationId":"resumeMonitor","summary":"Resume a monitor","description":"Puts a paused monitor back into rotation and checks it straight away. It returns as PENDING until that check lands, so a resume never re-fires a stale DOWN alert. Idempotent.","tags":["Monitors"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"type":{"type":"string","enum":["HTTP","KEYWORD","PING","PORT","CRON","DNS","SSL","DOMAIN"]},"state":{"type":"string","enum":["PENDING","UP","DEGRADED","DOWN","PAUSED"]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"host":{"anyOf":[{"type":"string"},{"type":"null"}]},"port":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"method":{"type":"string","enum":["GET","HEAD","POST","PUT","PATCH","DELETE"]},"expectedStatus":{"type":"array","items":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"requestHeaders":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"requestBody":{"anyOf":[{"type":"string"},{"type":"null"}]},"followRedirects":{"type":"boolean"},"verifySsl":{"type":"boolean"},"keyword":{"anyOf":[{"type":"string"},{"type":"null"}]},"keywordMatch":{"type":"string","enum":["EXISTS","NOT_EXISTS"]},"dnsRecordType":{"anyOf":[{"type":"string"},{"type":"null"}]},"dnsExpected":{"anyOf":[{"type":"string"},{"type":"null"}]},"dnsAlertOnChange":{"type":"boolean"},"sslExpiryThresholdDays":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"intervalSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"timeoutSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"expectedPeriodSec":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"graceSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"degradedThresholdMs":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"degradedThresholdMode":{"type":"string","enum":["LAST","P95"]},"degradedSamples":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"heartbeatUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"lastCheckedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastStatusChangedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastResponseMs":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"certExpiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","name","type","state","url","host","port","method","expectedStatus","requestHeaders","requestBody","followRedirects","verifySsl","keyword","keywordMatch","dnsRecordType","dnsExpected","dnsAlertOnChange","sslExpiryThresholdDays","intervalSeconds","timeoutSeconds","expectedPeriodSec","graceSeconds","degradedThresholdMs","degradedThresholdMode","degradedSamples","heartbeatUrl","lastCheckedAt","lastStatusChangedAt","lastResponseMs","certExpiresAt","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/monitors/{monitorId}/check":{"post":{"operationId":"checkMonitor","summary":"Run a monitor now","description":"Runs the check synchronously and returns the monitor with the result applied, so the response reflects the check you just triggered. An on-demand check counts toward uptime and can open or close an incident exactly like a scheduled one. Returns `conflict` if the monitor is paused.","tags":["Monitors"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"type":{"type":"string","enum":["HTTP","KEYWORD","PING","PORT","CRON","DNS","SSL","DOMAIN"]},"state":{"type":"string","enum":["PENDING","UP","DEGRADED","DOWN","PAUSED"]},"url":{"anyOf":[{"type":"string"},{"type":"null"}]},"host":{"anyOf":[{"type":"string"},{"type":"null"}]},"port":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"method":{"type":"string","enum":["GET","HEAD","POST","PUT","PATCH","DELETE"]},"expectedStatus":{"type":"array","items":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"requestHeaders":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"requestBody":{"anyOf":[{"type":"string"},{"type":"null"}]},"followRedirects":{"type":"boolean"},"verifySsl":{"type":"boolean"},"keyword":{"anyOf":[{"type":"string"},{"type":"null"}]},"keywordMatch":{"type":"string","enum":["EXISTS","NOT_EXISTS"]},"dnsRecordType":{"anyOf":[{"type":"string"},{"type":"null"}]},"dnsExpected":{"anyOf":[{"type":"string"},{"type":"null"}]},"dnsAlertOnChange":{"type":"boolean"},"sslExpiryThresholdDays":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"intervalSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"timeoutSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"expectedPeriodSec":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"graceSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"degradedThresholdMs":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"degradedThresholdMode":{"type":"string","enum":["LAST","P95"]},"degradedSamples":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"heartbeatUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"lastCheckedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastStatusChangedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastResponseMs":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"certExpiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","name","type","state","url","host","port","method","expectedStatus","requestHeaders","requestBody","followRedirects","verifySsl","keyword","keywordMatch","dnsRecordType","dnsExpected","dnsAlertOnChange","sslExpiryThresholdDays","intervalSeconds","timeoutSeconds","expectedPeriodSec","graceSeconds","degradedThresholdMs","degradedThresholdMode","degradedSamples","heartbeatUrl","lastCheckedAt","lastStatusChangedAt","lastResponseMs","certExpiresAt","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/incidents":{"get":{"operationId":"listIncidents","summary":"List incidents","description":"Outages Moonitor detected, newest first, both ongoing (`resolvedAt` is null) and resolved. These are generated from failed checks — for incidents you write and publish yourself, see the status-incident endpoints.","tags":["Incidents"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":100000}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"monitor":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"type":{"type":"string","enum":["HTTP","KEYWORD","PING","PORT","CRON","DNS","SSL","DOMAIN"]}},"required":["id","name","type"],"additionalProperties":false},"startedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"resolvedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"durationSec":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"cause":{"anyOf":[{"type":"string"},{"type":"null"}]},"acknowledged":{"type":"boolean"}},"required":["id","monitor","startedAt","resolvedAt","durationSec","cause","acknowledged"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"offset":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["limit","offset","total"],"additionalProperties":false}},"required":["data","pagination"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/incidents/{incidentId}":{"get":{"operationId":"getIncident","summary":"Get an incident","description":"One detected incident: what failed, when it started, when it resolved, and whether it has been acknowledged.","tags":["Incidents"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"incidentId","in":"path","required":true,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"monitor":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"type":{"type":"string","enum":["HTTP","KEYWORD","PING","PORT","CRON","DNS","SSL","DOMAIN"]}},"required":["id","name","type"],"additionalProperties":false},"startedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"resolvedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"durationSec":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"cause":{"anyOf":[{"type":"string"},{"type":"null"}]},"acknowledged":{"type":"boolean"}},"required":["id","monitor","startedAt","resolvedAt","durationSec","cause","acknowledged"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/incidents/{incidentId}/acknowledge":{"post":{"operationId":"acknowledgeIncident","summary":"Acknowledge an incident","description":"Marks the incident as being handled and emits `incident.acknowledged`. Acknowledging does not resolve it — an incident resolves on its own when the monitor recovers. Idempotent: acknowledging twice returns the incident unchanged and emits nothing the second time.","tags":["Incidents"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"incidentId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"monitor":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"type":{"type":"string","enum":["HTTP","KEYWORD","PING","PORT","CRON","DNS","SSL","DOMAIN"]}},"required":["id","name","type"],"additionalProperties":false},"startedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"resolvedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"durationSec":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"cause":{"anyOf":[{"type":"string"},{"type":"null"}]},"acknowledged":{"type":"boolean"}},"required":["id","monitor","startedAt","resolvedAt","durationSec","cause","acknowledged"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/status-pages":{"get":{"operationId":"listStatusPages","summary":"List status pages","description":"Every status page in the organization, with its slug, monitors and branding.","tags":["Status pages"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":100000}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"slug":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean"},"headerColor":{"type":"string"},"bgColor":{"type":"string"},"textColor":{"type":"string"},"fontFamily":{"anyOf":[{"type":"string"},{"type":"null"}]},"hideBranding":{"type":"boolean"},"historyDays":{"type":"number"},"uptimeWindowDays":{"type":"number"},"incidentDays":{"type":"number"},"passwordProtected":{"type":"boolean"},"customDomain":{"anyOf":[{"type":"string"},{"type":"null"}]},"customDomainVerifiedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"monitorIds":{"type":"array","items":{"type":"string","minLength":1}},"groups":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"monitorIds":{"type":"array","items":{"type":"string","minLength":1}}},"required":["id","name","monitorIds"],"additionalProperties":false}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","slug","name","description","isPublic","headerColor","bgColor","textColor","fontFamily","hideBranding","historyDays","uptimeWindowDays","incidentDays","passwordProtected","customDomain","customDomainVerifiedAt","monitorIds","groups","createdAt","updatedAt"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"offset":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["limit","offset","total"],"additionalProperties":false}},"required":["data","pagination"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"operationId":"createStatusPage","summary":"Create a status page","description":"Publishes a status page at `/status/{slug}`. The slug must be unique across all Moonitor status pages, not just yours — a taken slug returns `conflict`. A page can be public, or private behind a password.","tags":["Status pages"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"isPublic":{"default":true,"type":"boolean"},"headerColor":{"default":"#0E1422","type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"bgColor":{"default":"#0B1120","type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"textColor":{"default":"#F8FAFC","type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"fontFamily":{"anyOf":[{"type":"string","enum":["Inter","Roboto","Open Sans","Lato","Montserrat","Poppins","Source Sans 3","Nunito","Work Sans","DM Sans","Manrope","Space Grotesk","IBM Plex Sans","Figtree","Plus Jakarta Sans"]},{"type":"null"}]},"hideBranding":{"default":false,"type":"boolean"},"historyDays":{"default":90,"anyOf":[{"type":"number","const":7},{"type":"number","const":30},{"type":"number","const":60},{"type":"number","const":90},{"type":"number","const":180},{"type":"number","const":365}]},"uptimeWindowDays":{"default":90,"anyOf":[{"type":"number","const":7},{"type":"number","const":30},{"type":"number","const":60},{"type":"number","const":90},{"type":"number","const":180},{"type":"number","const":365}]},"incidentDays":{"default":14,"type":"integer","minimum":1,"maximum":365},"monitorIds":{"default":[],"maxItems":500,"type":"array","items":{"type":"string","minLength":1}},"groups":{"default":[],"maxItems":50,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1,"maxLength":80},"monitorIds":{"maxItems":500,"type":"array","items":{"type":"string","minLength":1}}},"required":["name","monitorIds"]}},"slug":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,48}[a-z0-9])?$"},"password":{"anyOf":[{"type":"string","minLength":4,"maxLength":100},{"type":"null"}]}},"required":["name","slug"]}}}},"responses":{"201":{"description":"Created. The page is live at its slug immediately.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"slug":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean"},"headerColor":{"type":"string"},"bgColor":{"type":"string"},"textColor":{"type":"string"},"fontFamily":{"anyOf":[{"type":"string"},{"type":"null"}]},"hideBranding":{"type":"boolean"},"historyDays":{"type":"number"},"uptimeWindowDays":{"type":"number"},"incidentDays":{"type":"number"},"passwordProtected":{"type":"boolean"},"customDomain":{"anyOf":[{"type":"string"},{"type":"null"}]},"customDomainVerifiedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"monitorIds":{"type":"array","items":{"type":"string","minLength":1}},"groups":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"monitorIds":{"type":"array","items":{"type":"string","minLength":1}}},"required":["id","name","monitorIds"],"additionalProperties":false}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","slug","name","description","isPublic","headerColor","bgColor","textColor","fontFamily","hideBranding","historyDays","uptimeWindowDays","incidentDays","passwordProtected","customDomain","customDomainVerifiedAt","monitorIds","groups","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/status-pages/{statusPageId}":{"get":{"operationId":"getStatusPage","summary":"Get a status page","description":"One status page with its monitors, categories, branding and visibility.","tags":["Status pages"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"statusPageId","in":"path","required":true,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"slug":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean"},"headerColor":{"type":"string"},"bgColor":{"type":"string"},"textColor":{"type":"string"},"fontFamily":{"anyOf":[{"type":"string"},{"type":"null"}]},"hideBranding":{"type":"boolean"},"historyDays":{"type":"number"},"uptimeWindowDays":{"type":"number"},"incidentDays":{"type":"number"},"passwordProtected":{"type":"boolean"},"customDomain":{"anyOf":[{"type":"string"},{"type":"null"}]},"customDomainVerifiedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"monitorIds":{"type":"array","items":{"type":"string","minLength":1}},"groups":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"monitorIds":{"type":"array","items":{"type":"string","minLength":1}}},"required":["id","name","monitorIds"],"additionalProperties":false}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","slug","name","description","isPublic","headerColor","bgColor","textColor","fontFamily","hideBranding","historyDays","uptimeWindowDays","incidentDays","passwordProtected","customDomain","customDomainVerifiedAt","monitorIds","groups","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"operationId":"updateStatusPage","summary":"Update a status page","description":"A partial update: omitted fields keep their current values, so sending only `{ \"name\": ... }` will not clear the page's monitors or reset its colours. Sending `monitorIds` or `groups` replaces that list wholesale.","tags":["Status pages"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"statusPageId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"isPublic":{"type":"boolean"},"headerColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"bgColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"fontFamily":{"anyOf":[{"type":"string","enum":["Inter","Roboto","Open Sans","Lato","Montserrat","Poppins","Source Sans 3","Nunito","Work Sans","DM Sans","Manrope","Space Grotesk","IBM Plex Sans","Figtree","Plus Jakarta Sans"]},{"type":"null"}]},"hideBranding":{"type":"boolean"},"historyDays":{"anyOf":[{"type":"number","const":7},{"type":"number","const":30},{"type":"number","const":60},{"type":"number","const":90},{"type":"number","const":180},{"type":"number","const":365}]},"uptimeWindowDays":{"anyOf":[{"type":"number","const":7},{"type":"number","const":30},{"type":"number","const":60},{"type":"number","const":90},{"type":"number","const":180},{"type":"number","const":365}]},"incidentDays":{"type":"integer","minimum":1,"maximum":365},"monitorIds":{"maxItems":500,"type":"array","items":{"type":"string","minLength":1}},"groups":{"maxItems":50,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1,"maxLength":80},"monitorIds":{"maxItems":500,"type":"array","items":{"type":"string","minLength":1}}},"required":["name","monitorIds"]}},"password":{"anyOf":[{"type":"string","minLength":4,"maxLength":100},{"type":"null"}]}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"slug":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean"},"headerColor":{"type":"string"},"bgColor":{"type":"string"},"textColor":{"type":"string"},"fontFamily":{"anyOf":[{"type":"string"},{"type":"null"}]},"hideBranding":{"type":"boolean"},"historyDays":{"type":"number"},"uptimeWindowDays":{"type":"number"},"incidentDays":{"type":"number"},"passwordProtected":{"type":"boolean"},"customDomain":{"anyOf":[{"type":"string"},{"type":"null"}]},"customDomainVerifiedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"monitorIds":{"type":"array","items":{"type":"string","minLength":1}},"groups":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"monitorIds":{"type":"array","items":{"type":"string","minLength":1}}},"required":["id","name","monitorIds"],"additionalProperties":false}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","slug","name","description","isPublic","headerColor","bgColor","textColor","fontFamily","hideBranding","historyDays","uptimeWindowDays","incidentDays","passwordProtected","customDomain","customDomainVerifiedAt","monitorIds","groups","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"delete":{"operationId":"deleteStatusPage","summary":"Delete a status page","description":"Takes the page offline and deletes its published incidents and subscriber list. Any custom domain pointed at it stops resolving. The monitors themselves are untouched.","tags":["Status pages"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"statusPageId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"responses":{"200":{"description":"Deleted. The body carries the id that was removed.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","minLength":1}},"required":["id"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/maintenance-windows":{"get":{"operationId":"listMaintenance","summary":"List maintenance windows","description":"Scheduled maintenance windows, past and future, with the monitors each one covers.","tags":["Maintenance"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":100000}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"title":{"type":"string"},"body":{"anyOf":[{"type":"string"},{"type":"null"}]},"startsAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"endsAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"notifySubscribers":{"type":"boolean"},"notifiedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"monitorIds":{"type":"array","items":{"type":"string","minLength":1}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","title","body","startsAt","endsAt","notifySubscribers","notifiedAt","monitorIds","createdAt","updatedAt"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"offset":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["limit","offset","total"],"additionalProperties":false}},"required":["data","pagination"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"operationId":"createMaintenance","summary":"Create a maintenance window","description":"Suppresses alerts for the chosen monitors between `startsAt` and `endsAt`, and shows the window as scheduled on any status page they appear on. Checks keep running; failures inside the window do not open incidents or page anyone. Intended to be called from a deploy pipeline just before a release.","tags":["Maintenance"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":120},"body":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"startsAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"endsAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"monitorIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","minLength":1}},"notifySubscribers":{"default":true,"type":"boolean"}},"required":["title","startsAt","endsAt","monitorIds"]}}}},"responses":{"201":{"description":"Created. Alert suppression applies from `startsAt`.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"title":{"type":"string"},"body":{"anyOf":[{"type":"string"},{"type":"null"}]},"startsAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"endsAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"notifySubscribers":{"type":"boolean"},"notifiedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"monitorIds":{"type":"array","items":{"type":"string","minLength":1}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","title","body","startsAt","endsAt","notifySubscribers","notifiedAt","monitorIds","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/maintenance-windows/{maintenanceId}":{"get":{"operationId":"getMaintenance","summary":"Get a maintenance window","description":"One maintenance window with its schedule and the monitors it covers.","tags":["Maintenance"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"maintenanceId","in":"path","required":true,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"title":{"type":"string"},"body":{"anyOf":[{"type":"string"},{"type":"null"}]},"startsAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"endsAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"notifySubscribers":{"type":"boolean"},"notifiedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"monitorIds":{"type":"array","items":{"type":"string","minLength":1}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","title","body","startsAt","endsAt","notifySubscribers","notifiedAt","monitorIds","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"operationId":"updateMaintenance","summary":"Update a maintenance window","description":"A partial update — typically extending `endsAt` when a release runs long. Omitted fields keep their current values.","tags":["Maintenance"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"maintenanceId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":120},"body":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"startsAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"endsAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"monitorIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","minLength":1}},"notifySubscribers":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"title":{"type":"string"},"body":{"anyOf":[{"type":"string"},{"type":"null"}]},"startsAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"endsAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"notifySubscribers":{"type":"boolean"},"notifiedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"monitorIds":{"type":"array","items":{"type":"string","minLength":1}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","title","body","startsAt","endsAt","notifySubscribers","notifiedAt","monitorIds","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"delete":{"operationId":"deleteMaintenance","summary":"Delete a maintenance window","description":"Cancels the window. Deleting one that is currently active restores normal alerting immediately, so use it to end maintenance early.","tags":["Maintenance"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"maintenanceId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"responses":{"200":{"description":"Deleted. The body carries the id that was removed.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","minLength":1}},"required":["id"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/status-incidents":{"get":{"operationId":"listStatusIncidents","summary":"List published incidents","description":"Hand-written incidents published on a status page, newest first. Filter to one page with statusPageId.","tags":["Status pages"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":100000}},{"name":"statusPageId","in":"query","required":false,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"statusPageId":{"type":"string","minLength":1},"title":{"type":"string"},"severity":{"type":"string","enum":["MINOR","MAJOR","CRITICAL","MAINTENANCE"]},"state":{"type":"string","enum":["INVESTIGATING","IDENTIFIED","MONITORING","RESOLVED"]},"startedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"resolvedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"monitorIds":{"type":"array","items":{"type":"string","minLength":1}},"detectedIncidentIds":{"type":"array","items":{"type":"string","minLength":1}},"updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"body":{"type":"string"},"state":{"type":"string","enum":["INVESTIGATING","IDENTIFIED","MONITORING","RESOLVED"]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"notifiedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]}},"required":["id","body","state","createdAt","notifiedAt"],"additionalProperties":false}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","statusPageId","title","severity","state","startedAt","resolvedAt","monitorIds","detectedIncidentIds","updates","createdAt","updatedAt"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"offset":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["limit","offset","total"],"additionalProperties":false}},"required":["data","pagination"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"operationId":"createStatusIncident","summary":"Publish an incident","description":"Opens an incident with its first update. Intended to be callable from CI or an alerting webhook.","tags":["Status pages"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":160},"severity":{"default":"MINOR","type":"string","enum":["MINOR","MAJOR","CRITICAL","MAINTENANCE"]},"state":{"default":"INVESTIGATING","type":"string","enum":["INVESTIGATING","IDENTIFIED","MONITORING","RESOLVED"]},"startedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"monitorIds":{"default":[],"maxItems":200,"type":"array","items":{"type":"string","minLength":1}},"statusPageId":{"type":"string","minLength":1},"body":{"type":"string","minLength":1,"maxLength":5000},"adoptIncidentIds":{"default":[],"maxItems":200,"type":"array","items":{"type":"string","minLength":1}},"notifySubscribers":{"default":true,"type":"boolean"}},"required":["title","statusPageId","body"]}}}},"responses":{"201":{"description":"Created. The incident is visible on the status page and subscribers have been notified.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"statusPageId":{"type":"string","minLength":1},"title":{"type":"string"},"severity":{"type":"string","enum":["MINOR","MAJOR","CRITICAL","MAINTENANCE"]},"state":{"type":"string","enum":["INVESTIGATING","IDENTIFIED","MONITORING","RESOLVED"]},"startedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"resolvedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"monitorIds":{"type":"array","items":{"type":"string","minLength":1}},"detectedIncidentIds":{"type":"array","items":{"type":"string","minLength":1}},"updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"body":{"type":"string"},"state":{"type":"string","enum":["INVESTIGATING","IDENTIFIED","MONITORING","RESOLVED"]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"notifiedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]}},"required":["id","body","state","createdAt","notifiedAt"],"additionalProperties":false}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","statusPageId","title","severity","state","startedAt","resolvedAt","monitorIds","detectedIncidentIds","updates","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/status-incidents/{statusIncidentId}":{"get":{"operationId":"getStatusIncident","summary":"Get a published incident","description":"One published incident with its full update thread in order.","tags":["Status pages"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"statusIncidentId","in":"path","required":true,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"statusPageId":{"type":"string","minLength":1},"title":{"type":"string"},"severity":{"type":"string","enum":["MINOR","MAJOR","CRITICAL","MAINTENANCE"]},"state":{"type":"string","enum":["INVESTIGATING","IDENTIFIED","MONITORING","RESOLVED"]},"startedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"resolvedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"monitorIds":{"type":"array","items":{"type":"string","minLength":1}},"detectedIncidentIds":{"type":"array","items":{"type":"string","minLength":1}},"updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"body":{"type":"string"},"state":{"type":"string","enum":["INVESTIGATING","IDENTIFIED","MONITORING","RESOLVED"]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"notifiedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]}},"required":["id","body","state","createdAt","notifiedAt"],"additionalProperties":false}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","statusPageId","title","severity","state","startedAt","resolvedAt","monitorIds","detectedIncidentIds","updates","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"operationId":"updateStatusIncident","summary":"Edit a published incident","description":"Corrects an incident's title or impact in place, without adding to its public thread. To tell readers something new — including that it is resolved — post an update instead, which notifies subscribers.","tags":["Status pages"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"statusIncidentId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":160},"severity":{"type":"string","enum":["MINOR","MAJOR","CRITICAL","MAINTENANCE"]},"startedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"monitorIds":{"maxItems":200,"type":"array","items":{"type":"string","minLength":1}}},"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"statusPageId":{"type":"string","minLength":1},"title":{"type":"string"},"severity":{"type":"string","enum":["MINOR","MAJOR","CRITICAL","MAINTENANCE"]},"state":{"type":"string","enum":["INVESTIGATING","IDENTIFIED","MONITORING","RESOLVED"]},"startedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"resolvedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"monitorIds":{"type":"array","items":{"type":"string","minLength":1}},"detectedIncidentIds":{"type":"array","items":{"type":"string","minLength":1}},"updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"body":{"type":"string"},"state":{"type":"string","enum":["INVESTIGATING","IDENTIFIED","MONITORING","RESOLVED"]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"notifiedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]}},"required":["id","body","state","createdAt","notifiedAt"],"additionalProperties":false}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","statusPageId","title","severity","state","startedAt","resolvedAt","monitorIds","detectedIncidentIds","updates","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"delete":{"operationId":"deleteStatusIncident","summary":"Delete a published incident","description":"Removes the incident and its whole update thread from the status page. Use this for something posted in error; a real incident should be resolved with a final update so the history stays honest.","tags":["Status pages"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"statusIncidentId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"responses":{"200":{"description":"Deleted. The body carries the id that was removed.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","minLength":1}},"required":["id"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/status-incidents/{statusIncidentId}/updates":{"post":{"operationId":"addStatusIncidentUpdate","summary":"Post an incident update","description":"Appends to the thread and moves the incident's state. Subscribers are emailed unless notifySubscribers is false.","tags":["Status pages"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"statusIncidentId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string","minLength":1,"maxLength":5000},"state":{"type":"string","enum":["INVESTIGATING","IDENTIFIED","MONITORING","RESOLVED"]},"notifySubscribers":{"default":true,"type":"boolean"}},"required":["body"]}}}},"responses":{"201":{"description":"Created. The update is live on the status page.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"statusPageId":{"type":"string","minLength":1},"title":{"type":"string"},"severity":{"type":"string","enum":["MINOR","MAJOR","CRITICAL","MAINTENANCE"]},"state":{"type":"string","enum":["INVESTIGATING","IDENTIFIED","MONITORING","RESOLVED"]},"startedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"resolvedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"monitorIds":{"type":"array","items":{"type":"string","minLength":1}},"detectedIncidentIds":{"type":"array","items":{"type":"string","minLength":1}},"updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"body":{"type":"string"},"state":{"type":"string","enum":["INVESTIGATING","IDENTIFIED","MONITORING","RESOLVED"]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"notifiedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]}},"required":["id","body","state","createdAt","notifiedAt"],"additionalProperties":false}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","statusPageId","title","severity","state","startedAt","resolvedAt","monitorIds","detectedIncidentIds","updates","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/webhook-endpoints":{"get":{"operationId":"listWebhookEndpoints","summary":"List webhook endpoints","description":"Every webhook subscription in the organization, with its target URL and the events it receives. Signing secrets are never included.","tags":["Webhooks"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":100000}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"url":{"type":"string"},"eventTypes":{"type":"array","items":{"anyOf":[{"type":"string","enum":["monitor.created","monitor.updated","monitor.deleted","monitor.paused","monitor.resumed","monitor.down","monitor.recovered","monitor.degraded","monitor.degraded_recovered","incident.created","incident.acknowledged","incident.resolved","status_incident.created","status_incident.updated","status_incident.deleted","status_page.created","status_page.updated","status_page.deleted","maintenance.created","maintenance.updated","maintenance.deleted","webhook.test"]},{"type":"string","const":"*"}]}},"enabled":{"type":"boolean"},"secretStart":{"type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","name","url","eventTypes","enabled","secretStart","createdAt","updatedAt"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"offset":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["limit","offset","total"],"additionalProperties":false}},"required":["data","pagination"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"operationId":"createWebhookEndpoint","summary":"Create a webhook endpoint","description":"Returns the signing secret once. Store it securely; Moonitor cannot reveal it again.","tags":["Webhooks"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"url":{"type":"string","minLength":1,"maxLength":2048},"eventTypes":{"minItems":1,"maxItems":23,"type":"array","items":{"anyOf":[{"type":"string","enum":["monitor.created","monitor.updated","monitor.deleted","monitor.paused","monitor.resumed","monitor.down","monitor.recovered","monitor.degraded","monitor.degraded_recovered","incident.created","incident.acknowledged","incident.resolved","status_incident.created","status_incident.updated","status_incident.deleted","status_page.created","status_page.updated","status_page.deleted","maintenance.created","maintenance.updated","maintenance.deleted","webhook.test"]},{"type":"string","const":"*"}]}},"enabled":{"default":true,"type":"boolean"}},"required":["name","url","eventTypes"]}}}},"responses":{"201":{"description":"Created. This is the only response that contains the signing secret.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"url":{"type":"string"},"eventTypes":{"type":"array","items":{"anyOf":[{"type":"string","enum":["monitor.created","monitor.updated","monitor.deleted","monitor.paused","monitor.resumed","monitor.down","monitor.recovered","monitor.degraded","monitor.degraded_recovered","incident.created","incident.acknowledged","incident.resolved","status_incident.created","status_incident.updated","status_incident.deleted","status_page.created","status_page.updated","status_page.deleted","maintenance.created","maintenance.updated","maintenance.deleted","webhook.test"]},{"type":"string","const":"*"}]}},"enabled":{"type":"boolean"},"secretStart":{"type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","name","url","eventTypes","enabled","secretStart","createdAt","updatedAt"],"additionalProperties":false},"secret":{"type":"string","pattern":"^whsec_.*"}},"required":["data","secret"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/webhook-endpoints/{endpointId}":{"get":{"operationId":"getWebhookEndpoint","summary":"Get a webhook endpoint","description":"One webhook subscription: target URL, subscribed events and whether it is enabled. The signing secret is not returned — rotate it if you have lost it.","tags":["Webhooks"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"endpointId","in":"path","required":true,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"url":{"type":"string"},"eventTypes":{"type":"array","items":{"anyOf":[{"type":"string","enum":["monitor.created","monitor.updated","monitor.deleted","monitor.paused","monitor.resumed","monitor.down","monitor.recovered","monitor.degraded","monitor.degraded_recovered","incident.created","incident.acknowledged","incident.resolved","status_incident.created","status_incident.updated","status_incident.deleted","status_page.created","status_page.updated","status_page.deleted","maintenance.created","maintenance.updated","maintenance.deleted","webhook.test"]},{"type":"string","const":"*"}]}},"enabled":{"type":"boolean"},"secretStart":{"type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","name","url","eventTypes","enabled","secretStart","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"operationId":"updateWebhookEndpoint","summary":"Update a webhook endpoint","description":"A partial update of the target URL, subscribed events or enabled flag. Sending `events` replaces the subscription list wholesale. Disabling an endpoint stops deliveries without losing its secret or history.","tags":["Webhooks"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"endpointId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"url":{"type":"string","minLength":1,"maxLength":2048},"eventTypes":{"minItems":1,"maxItems":23,"type":"array","items":{"anyOf":[{"type":"string","enum":["monitor.created","monitor.updated","monitor.deleted","monitor.paused","monitor.resumed","monitor.down","monitor.recovered","monitor.degraded","monitor.degraded_recovered","incident.created","incident.acknowledged","incident.resolved","status_incident.created","status_incident.updated","status_incident.deleted","status_page.created","status_page.updated","status_page.deleted","maintenance.created","maintenance.updated","maintenance.deleted","webhook.test"]},{"type":"string","const":"*"}]}},"enabled":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"url":{"type":"string"},"eventTypes":{"type":"array","items":{"anyOf":[{"type":"string","enum":["monitor.created","monitor.updated","monitor.deleted","monitor.paused","monitor.resumed","monitor.down","monitor.recovered","monitor.degraded","monitor.degraded_recovered","incident.created","incident.acknowledged","incident.resolved","status_incident.created","status_incident.updated","status_incident.deleted","status_page.created","status_page.updated","status_page.deleted","maintenance.created","maintenance.updated","maintenance.deleted","webhook.test"]},{"type":"string","const":"*"}]}},"enabled":{"type":"boolean"},"secretStart":{"type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","name","url","eventTypes","enabled","secretStart","createdAt","updatedAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"delete":{"operationId":"deleteWebhookEndpoint","summary":"Delete a webhook endpoint","description":"Removes the subscription and its delivery history. Queued deliveries are dropped. Disable the endpoint instead if you only want to pause it.","tags":["Webhooks"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"endpointId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"responses":{"200":{"description":"Deleted. The body carries the id that was removed.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","minLength":1}},"required":["id"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/webhook-endpoints/{endpointId}/rotate-secret":{"post":{"operationId":"rotateWebhookSecret","summary":"Rotate a signing secret","description":"Returns the new secret once. For 24 hours, deliveries carry signatures from both the new and previous secrets.","tags":["Webhooks"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"endpointId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Rotated. This is the only response that contains the new secret.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"url":{"type":"string"},"eventTypes":{"type":"array","items":{"anyOf":[{"type":"string","enum":["monitor.created","monitor.updated","monitor.deleted","monitor.paused","monitor.resumed","monitor.down","monitor.recovered","monitor.degraded","monitor.degraded_recovered","incident.created","incident.acknowledged","incident.resolved","status_incident.created","status_incident.updated","status_incident.deleted","status_page.created","status_page.updated","status_page.deleted","maintenance.created","maintenance.updated","maintenance.deleted","webhook.test"]},{"type":"string","const":"*"}]}},"enabled":{"type":"boolean"},"secretStart":{"type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","name","url","eventTypes","enabled","secretStart","createdAt","updatedAt"],"additionalProperties":false},"secret":{"type":"string","pattern":"^whsec_.*"}},"required":["data","secret"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/webhook-endpoints/{endpointId}/test":{"post":{"operationId":"testWebhookEndpoint","summary":"Send a test event","description":"Queues a signed `webhook.test` delivery so you can verify your receiver and signature check end to end. Use the returned `deliveryId` with the delivery endpoints to see the response your server gave.","tags":["Webhooks"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"endpointId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"202":{"description":"Accepted. The delivery is queued, not yet sent — poll it with getWebhookDelivery.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deliveryId":{"type":"string","minLength":1},"status":{"type":"string","const":"PENDING"}},"required":["deliveryId","status"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/webhook-deliveries":{"get":{"operationId":"listWebhookDeliveries","summary":"List webhook deliveries","description":"Recent deliveries across every endpoint, newest first, with their current status. Use this to spot an endpoint that has started failing.","tags":["Webhooks"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":100000}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"endpoint":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"url":{"type":"string"}},"required":["id","name","url"],"additionalProperties":false},"eventType":{"type":"string"},"payload":{},"status":{"type":"string","enum":["PENDING","PROCESSING","DELIVERED","FAILED"]},"attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"nextAttemptAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"lastAttemptAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"deliveredAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"attemptLogs":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"attemptNumber":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"responseStatus":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"responseBody":{"anyOf":[{"type":"string"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}]},"durationMs":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","attemptNumber","responseStatus","responseBody","error","durationMs","createdAt"],"additionalProperties":false}}},"required":["id","endpoint","eventType","payload","status","attempts","nextAttemptAt","lastAttemptAt","deliveredAt","createdAt"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"offset":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["limit","offset","total"],"additionalProperties":false}},"required":["data","pagination"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/webhook-deliveries/{deliveryId}":{"get":{"operationId":"getWebhookDelivery","summary":"Get a delivery and its attempts","description":"One delivery with every attempt Moonitor made: the response status, body excerpt and timing of each, so a failure can be diagnosed without adding logging on your side.","tags":["Webhooks"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"deliveryId","in":"path","required":true,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1},"endpoint":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"url":{"type":"string"}},"required":["id","name","url"],"additionalProperties":false},"eventType":{"type":"string"},"payload":{},"status":{"type":"string","enum":["PENDING","PROCESSING","DELIVERED","FAILED"]},"attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"nextAttemptAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"lastAttemptAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"deliveredAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"attemptLogs":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"attemptNumber":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"responseStatus":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"responseBody":{"anyOf":[{"type":"string"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}]},"durationMs":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","attemptNumber","responseStatus","responseBody","error","durationMs","createdAt"],"additionalProperties":false}}},"required":["id","endpoint","eventType","payload","status","attempts","nextAttemptAt","lastAttemptAt","deliveredAt","createdAt"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/webhook-deliveries/{deliveryId}/retry":{"post":{"operationId":"retryWebhookDelivery","summary":"Retry a delivery","description":"Re-queues a delivery with its original payload and a fresh signature, for replaying events your receiver missed while it was down. This is on top of the automatic retries every failed delivery already gets.","tags":["Webhooks"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"deliveryId","in":"path","required":true,"schema":{"type":"string","minLength":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional 1-200 character key. Successful responses are replayed for 24 hours.","schema":{"type":"string","maxLength":200,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"202":{"description":"Accepted. The delivery is queued for another attempt.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deliveryId":{"type":"string","minLength":1},"status":{"type":"string","const":"PENDING"}},"required":["deliveryId","status"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}}},"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Organization API key. Authorization: Bearer <key> is also accepted."},"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"Moonitor API key","description":"The same organization API key sent as Authorization: Bearer <key>."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["validation_error","invalid_idempotency_key","unauthorized","forbidden","not_found","method_not_allowed","conflict","idempotency_conflict","idempotency_in_progress","plan_limit","subscription_required","rate_limited","internal_error"],"description":"Stable, machine-readable reason. Branch on this, not the message."},"message":{"type":"string","description":"Human-readable explanation. Wording may change; never parse it."},"requestId":{"type":"string","description":"Echoed in the X-Request-Id response header. Quote it in support requests."},"details":{"description":"Per-field failures, present on validation_error. `path` is dotted, relative to the request body.","type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}},"required":["path","message"],"additionalProperties":false}}},"required":["code","message","requestId"],"additionalProperties":false}},"required":["error"],"additionalProperties":false,"title":"Error","description":"The shape of every failure response. `error.code` is stable and machine-readable; `error.message` is for humans and may be reworded without notice."}},"responses":{"BadRequest":{"description":"The request could not be parsed or failed validation — `validation_error` (see `error.details`) or `invalid_idempotency_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"Unauthorized":{"description":"Missing, malformed, expired or revoked API key — `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"Forbidden":{"description":"The key is valid but read-only, or lacks permission for this resource — `forbidden`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"NotFound":{"description":"No such resource in this organization — `not_found`. Also returned for a resource owned by a different organization, so a key cannot probe for ids.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"Conflict":{"description":"The request conflicts with current state — `conflict`, or `idempotency_conflict` / `idempotency_in_progress` when an Idempotency-Key is reused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"Unprocessable":{"description":"Understood, but a plan or subscription rule forbids it — `plan_limit` (e.g. the monitor allowance is used up) or `subscription_required`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}},"RateLimited":{"description":"More than 120 requests in 60 seconds — `rate_limited`. Wait for `Retry-After` seconds; the request had no effect.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"InternalError":{"description":"Unexpected server failure — `internal_error`. Safe to retry with the same Idempotency-Key; quote `error.requestId` if it persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds to reset, e.g. `\"public-api\";r=118;t=42`.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The advertised quota, e.g. `\"public-api\";q=120;w=60`. Sent on every response, including 401s.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier for this request, echoed in any error body. Quote it in support requests.","schema":{"type":"string"}}}}}}}