{
  "openapi": "3.1.0",
  "info": {
    "title": "monit.rs Public API",
    "summary": "Read the same OpenAPI drift + stability data monit.rs publishes on its public /changelog surface.",
    "description": "The curated public API surface for monit.rs. Two audiences share this document:\n\n1. **Anonymous / unauthenticated consumers** \u2014 the changelog, badges, per-vendor Atom feeds, subscribe endpoints, and lead-magnet tools. IP rate-limited; subscribe endpoints require email confirmation.\n\n2. **API-key holders** \u2014 customer-facing endpoints (endpoints, probes, incidents, regressions, alert channels, status pages, webhooks, AI analyses, security findings) that require a bearer API key created under Settings \u2192 API Keys. Keys use the format `mrs_live_...` and carry per-endpoint scopes (e.g. `read:endpoints`, `ingest:probes`, `write:alerts`). Rate limits are applied per-key AND per-account with tier-aware capacities; see `https://monit.rs/docs`.\n\nEndpoints marked with `security: ApiKeyBearer` require an API key. Endpoints without security are anonymous.\n\nFor an interactive explorer see `https://monit.rs/api-docs`. For a machine-readable YAML mirror see `https://monit.rs/openapi.yaml`. Not all backend routes are documented here \u2014 this file is hand-curated to the subset customers should build against; internal admin and SPA-serving routes are intentionally omitted.",
    "termsOfService": "https://monit.rs/terms",
    "contact": {
      "name": "monit.rs support",
      "url": "https://monit.rs/contact",
      "email": "support@monit.rs"
    },
    "license": {
      "name": "Data licensed for direct reuse; see terms",
      "url": "https://monit.rs/terms"
    },
    "version": "2026.08.30",
    "x-logo": {
      "url": "https://monit.rs/logo.png",
      "backgroundColor": "#0f172a",
      "altText": "monit.rs"
    },
    "x-providerName": "monit.rs",
    "x-origin": [
      {
        "url": "https://monit.rs/openapi.yaml",
        "format": "openapi",
        "version": "3.1"
      }
    ]
  },
  "externalDocs": {
    "description": "Full public site + browsable changelog",
    "url": "https://monit.rs/changelog"
  },
  "servers": [
    {
      "url": "https://monit.rs",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "Changelog",
      "description": "Read tracked-API drift data (per-vendor entries, stability metrics, recent changes)."
    },
    {
      "name": "Stats",
      "description": "Aggregated cross-vendor statistics."
    },
    {
      "name": "Feeds",
      "description": "Atom/RSS feeds for machine consumption."
    },
    {
      "name": "Badges",
      "description": "Shields.io-compatible SVG badges for embedding in READMEs."
    },
    {
      "name": "Subscriptions",
      "description": "Opt-in email digest + Slack/Discord webhook subscriptions. Every subscription requires double-opt-in confirmation."
    },
    {
      "name": "api-keys",
      "description": "Manage your API keys for authenticated access."
    },
    {
      "name": "public-api",
      "description": "Authenticated API endpoints."
    },
    {
      "name": "endpoints",
      "description": "Manage and query endpoint monitors."
    },
    {
      "name": "incidents",
      "description": "Create and retrieve incidents."
    },
    {
      "name": "regressions",
      "description": "Query API regressions and schema diffs."
    },
    {
      "name": "status-pages",
      "description": "Manage public status pages."
    },
    {
      "name": "alerts",
      "description": "Manage alert channels."
    },
    {
      "name": "ingestion",
      "description": "Push probe results and retrieve probe details."
    },
    {
      "name": "webhooks",
      "description": "Manage webhook subscriptions and delivery attempts."
    }
  ],
  "paths": {
    "/api/v1/public/stats": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Aggregated cross-vendor statistics",
        "description": "Returns global counters used by the /changelog landing page \u2014 total tracked APIs, snapshots taken, breaking changes detected in the last 90 days, and the timestamp of the most recent detection.",
        "operationId": "getPublicStats",
        "responses": {
          "200": {
            "description": "Aggregated statistics",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicStats"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/public/changes/{slug}": {
      "get": {
        "tags": [
          "Changelog"
        ],
        "summary": "Recent changes for one tracked API",
        "description": "Returns the last N changelog entries for a vendor slug. Each entry represents a spec-diff detection with breaking/non-breaking/info counts and a list of individual change events.",
        "operationId": "getChangesForSlug",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Vendor slug (e.g. `stripe`, `openai`, `cloudflare`). See `GET /api/v1/public/stats` or `/sitemap.xml` for the full list of active slugs.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]{0,63}$"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum entries to return (1-100).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Changelog entries for the vendor",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "slug": {
                      "type": "string"
                    },
                    "entries": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ChangelogEntry"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Slug is not tracked or has no entries."
          }
        }
      }
    },
    "/badge/stability/{slug}.svg": {
      "get": {
        "tags": [
          "Badges"
        ],
        "summary": "Stability badge (shields.io-compatible SVG)",
        "description": "Returns an SVG stability badge for a tracked API, colored by the number of breaking changes detected in the last 90 days. Long Cache-Control header \u2014 safe to hotlink from a README.",
        "operationId": "getStabilityBadge",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]{0,63}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "SVG badge",
            "content": {
              "image/svg+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Unknown slug."
          }
        }
      }
    },
    "/changelog/{slug}.rss": {
      "get": {
        "tags": [
          "Feeds"
        ],
        "summary": "Per-vendor Atom feed",
        "description": "Returns an Atom 1.0 feed of changelog entries for a single tracked vendor. Suitable for RSS readers and machine-consumed change monitors.",
        "operationId": "getVendorFeed",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]{0,63}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Atom 1.0 feed",
            "content": {
              "application/atom+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Unknown slug."
          }
        }
      }
    },
    "/changes.rss": {
      "get": {
        "tags": [
          "Feeds"
        ],
        "summary": "Global cross-vendor Atom feed",
        "description": "Returns the most recent changelog entries across every tracked vendor, newest first.",
        "operationId": "getGlobalFeed",
        "responses": {
          "200": {
            "description": "Atom 1.0 feed",
            "content": {
              "application/atom+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/blog.rss": {
      "get": {
        "tags": [
          "Feeds"
        ],
        "summary": "monit.rs blog Atom feed",
        "description": "Returns an Atom 1.0 feed of the monit.rs blog. Data-driven analysis posts about API stability, published every 7-10 days.",
        "operationId": "getBlogFeed",
        "responses": {
          "200": {
            "description": "Atom 1.0 feed",
            "content": {
              "application/atom+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/sitemap.xml": {
      "get": {
        "tags": [
          "Feeds"
        ],
        "summary": "sitemap.xml",
        "description": "Standard XML sitemap enumerating every public page on monit.rs \u2014 the tracked vendor list, per-category leaderboards, blog posts, docs, and public tools.",
        "operationId": "getSitemap",
        "responses": {
          "200": {
            "description": "sitemap.xml",
            "content": {
              "application/xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/public/digest/subscribe": {
      "post": {
        "tags": [
          "Subscriptions"
        ],
        "summary": "Subscribe an email to the weekly changelog digest",
        "description": "Records an opt-in for the weekly email digest. A confirmation email is sent immediately; no digest content ships until the recipient clicks the confirmation link in that email.",
        "operationId": "subscribeToDigest",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigestSubscribeRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Subscription recorded; confirmation email sent."
          },
          "400": {
            "description": "Malformed email."
          },
          "429": {
            "description": "Rate limit exceeded for this IP."
          }
        }
      }
    },
    "/api/v1/public/changelog-subscribe": {
      "post": {
        "tags": [
          "Subscriptions"
        ],
        "summary": "Subscribe a Slack or Discord webhook to changelog notifications",
        "description": "Registers a webhook URL to receive JSON POSTs whenever a new changelog entry is published. Either a Slack `hooks.slack.com/services/...` URL or a Discord `discord.com/api/webhooks/...` URL is accepted; the webhook host must match the declared `channel_type`.",
        "operationId": "subscribeChangelogWebhook",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangelogSubscribeRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Subscription registered."
          },
          "400": {
            "description": "Invalid webhook URL, mismatched host + channel_type, or unknown api_slug."
          },
          "429": {
            "description": "Rate limit exceeded for this IP."
          }
        }
      }
    },
    "/api/v1/api-keys": {
      "post": {
        "tags": [
          "api-keys"
        ],
        "summary": "Create an API key",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name",
                  "scopes"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "scopes": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "expires_at": {
                    "type": "string",
                    "format": "date-time",
                    "nullable": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Key created; `key` shown once."
          },
          "401": {
            "description": "Not authenticated."
          },
          "403": {
            "description": "Active-key cap (10) reached."
          }
        }
      },
      "get": {
        "tags": [
          "api-keys"
        ],
        "summary": "List your API keys",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "responses": {
          "200": {
            "description": "List of keys (no full-key values)."
          }
        }
      }
    },
    "/api/v1/api-keys/{key_id}": {
      "delete": {
        "tags": [
          "api-keys"
        ],
        "summary": "Revoke an API key",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "key_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Revoked."
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/me": {
      "get": {
        "tags": [
          "public-api"
        ],
        "summary": "Whoami: caller's email, tier, scopes, rate limits",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "responses": {
          "200": {
            "description": "Caller identity + capabilities."
          }
        }
      }
    },
    "/api/v1/probes": {
      "post": {
        "tags": [
          "ingestion"
        ],
        "summary": "Push a probe result",
        "description": "Push a self-reported probe. Minimal body (endpoint_id + is_success) = pass/fail check. Full body (status_code + response_body + ...) enables schema-diff regression detection.",
        "security": [
          {
            "ApiKeyBearer": []
          }
        ],
        "x-scopes": [
          "ingest:probes"
        ],
        "parameters": [
          {
            "name": "X-Backfill",
            "in": "header",
            "schema": {
              "type": "string",
              "enum": [
                "true"
              ]
            },
            "description": "Set to `true` to allow checked_at in [-24h, -1h]. Backfilled probes bypass alerting."
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "schema": {
              "type": "string",
              "maxLength": 255
            },
            "description": "Optional. Same key + same body replays cached response for 24h; same key + different body returns 409."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProbeIngestRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted. Poll GET /probes/{id} for derived fields."
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Missing `ingest:probes` scope."
          },
          "404": {
            "description": "Endpoint not owned by caller."
          },
          "422": {
            "description": "Validation error (e.g. checked_at out of range)."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        }
      }
    },
    "/api/v1/probes/{probe_id}": {
      "get": {
        "tags": [
          "ingestion"
        ],
        "summary": "Retrieve a pushed probe result + derived fields",
        "security": [
          {
            "ApiKeyBearer": []
          }
        ],
        "x-scopes": [
          "read:endpoints"
        ],
        "parameters": [
          {
            "name": "probe_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Probe detail incl. regression_id if detected."
          },
          "404": {
            "description": "Not found or not owned."
          }
        }
      }
    },
    "/api/v1/heartbeats/{token}": {
      "post": {
        "tags": [
          "ingestion"
        ],
        "summary": "Heartbeat push",
        "description": "Cron-liveness ping. Token-in-URL (no Bearer auth needed). If no heartbeat received within `interval_seconds * 1.2`, monit.rs opens an incident. Accepts POST, GET, HEAD. Body up to 100kB stored as diagnostic.",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "state",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "ok",
                "fail"
              ]
            },
            "description": "Alternative to /fail subpath \u2014 some cron ecosystems can't set path parts."
          }
        ],
        "responses": {
          "204": {
            "description": "Heartbeat recorded."
          },
          "404": {
            "description": "Token not recognized."
          },
          "413": {
            "description": "Body exceeds 100kB."
          }
        }
      },
      "get": {
        "tags": [
          "ingestion"
        ],
        "summary": "Heartbeat push (GET variant for cron/wget)",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "state",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "ok",
                "fail"
              ]
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Heartbeat recorded."
          },
          "404": {
            "description": "Token not recognized."
          }
        }
      },
      "head": {
        "tags": [
          "ingestion"
        ],
        "summary": "Heartbeat push (HEAD variant for curl -I)",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Heartbeat recorded."
          }
        }
      }
    },
    "/api/v1/heartbeats/{token}/fail": {
      "post": {
        "tags": [
          "ingestion"
        ],
        "summary": "Heartbeat fail (subpath variant)",
        "description": "Semantically identical to POST /heartbeats/{token}?state=fail. Ships alongside the query-param form because different cron ecosystems ship different conventions.",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Fail heartbeat recorded."
          },
          "404": {
            "description": "Token not recognized."
          }
        }
      },
      "get": {
        "tags": [
          "ingestion"
        ],
        "summary": "Report a failed run for a heartbeat monitor",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Token"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Successful Response"
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/incidents": {
      "get": {
        "tags": [
          "incidents"
        ],
        "summary": "List incidents",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:incidents"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/CursorParam"
          },
          {
            "$ref": "#/components/parameters/LimitParam"
          }
        ],
        "responses": {
          "200": {
            "description": "List of incidents."
          }
        }
      },
      "post": {
        "tags": [
          "ingestion"
        ],
        "summary": "Push a custom incident (PagerDuty Events v2 envelope)",
        "description": "Agent-detected incident. Action-based state machine: trigger opens or updates, acknowledge marks, resolve closes. Deduplicated on (user_id, dedup_key) \u2014 same key merges into one incident.",
        "security": [
          {
            "ApiKeyBearer": []
          }
        ],
        "x-scopes": [
          "ingest:incidents"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "schema": {
              "type": "string",
              "maxLength": 255
            },
            "description": "Optional. Same key + same body replays cached response for 24h; same key + different body returns 409."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IncidentIngestRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Incident created or updated.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IncidentIngestResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing/invalid credentials.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorEnvelope"
                }
              }
            }
          },
          "403": {
            "description": "Missing ingest:incidents scope."
          },
          "404": {
            "description": "endpoint_id not owned by caller (on trigger), OR no open incident with dedup_key (on ack/resolve)."
          },
          "409": {
            "description": "Idempotency-Key reused with different body."
          },
          "422": {
            "description": "Validation error."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        }
      }
    },
    "/api/v1/incidents/{incident_id}": {
      "get": {
        "tags": [
          "incidents"
        ],
        "summary": "Incident detail",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:incidents"
        ],
        "parameters": [
          {
            "name": "incident_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Incident with timeline."
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/probes": {
      "get": {
        "tags": [
          "ingestion"
        ],
        "summary": "List probe results (test_results) for an endpoint",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:endpoints"
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          },
          {
            "name": "since",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "until",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "only_failures",
            "in": "query",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "$ref": "#/components/parameters/CursorParam"
          },
          {
            "$ref": "#/components/parameters/LimitParam"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated probe results."
          },
          "403": {
            "description": "Missing read:endpoints scope."
          },
          "404": {
            "description": "Endpoint not owned by caller."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/uptime": {
      "get": {
        "tags": [
          "ingestion"
        ],
        "summary": "Aggregated uptime for an endpoint",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:uptime"
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "window",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "24h",
                "7d",
                "30d",
                "90d"
              ],
              "default": "7d"
            }
          },
          {
            "name": "granularity",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "1h",
                "1d"
              ],
              "default": "1d"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Uptime overall_pct + per-bucket series."
          },
          "404": {
            "description": "Endpoint not found."
          }
        }
      }
    },
    "/api/v1/regressions": {
      "get": {
        "tags": [
          "regressions"
        ],
        "summary": "List regressions",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:regressions"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/CursorParam"
          },
          {
            "$ref": "#/components/parameters/LimitParam"
          }
        ],
        "responses": {
          "200": {
            "description": "List of regressions."
          }
        }
      }
    },
    "/api/v1/regressions/{regression_id}": {
      "get": {
        "tags": [
          "regressions"
        ],
        "summary": "Regression detail",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:regressions"
        ],
        "parameters": [
          {
            "name": "regression_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Regression detail with diff."
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/status-pages": {
      "get": {
        "tags": [
          "status-pages"
        ],
        "summary": "List status pages",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:status-pages"
        ],
        "responses": {
          "200": {
            "description": "List of status pages."
          }
        }
      },
      "post": {
        "tags": [
          "status-pages"
        ],
        "summary": "Create a status page",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:status-pages"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKeyHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "slug",
                  "title"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "Not authenticated."
          },
          "403": {
            "description": "Missing write:status-pages scope."
          },
          "409": {
            "description": "Idempotency-Key reused with different body."
          },
          "422": {
            "description": "Validation error."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        }
      }
    },
    "/api/v1/status-pages/{page_id}": {
      "get": {
        "tags": [
          "status-pages"
        ],
        "summary": "Status page detail (by internal id, not slug)",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:status-pages"
        ],
        "parameters": [
          {
            "name": "page_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Status page with attached endpoints."
          },
          "404": {
            "description": "Not found."
          }
        }
      },
      "patch": {
        "tags": [
          "status-pages"
        ],
        "summary": "Update a status page",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:status-pages"
        ],
        "parameters": [
          {
            "name": "page_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated."
          },
          "401": {
            "description": "Not authenticated."
          },
          "403": {
            "description": "Missing write:status-pages scope."
          },
          "404": {
            "description": "Not found."
          },
          "409": {
            "description": "Idempotency-Key reused with different body."
          },
          "422": {
            "description": "Validation error."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        }
      },
      "delete": {
        "tags": [
          "status-pages"
        ],
        "summary": "Delete a status page",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:status-pages"
        ],
        "parameters": [
          {
            "name": "page_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted."
          },
          "401": {
            "description": "Not authenticated."
          },
          "403": {
            "description": "Missing write:status-pages scope."
          },
          "404": {
            "description": "Not found."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        }
      }
    },
    "/api/v1/alerts/channels": {
      "get": {
        "tags": [
          "alerts"
        ],
        "summary": "List alert channels",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:alerts"
        ],
        "responses": {
          "200": {
            "description": "List of channels (Slack/Discord/PagerDuty/etc.)."
          }
        }
      },
      "post": {
        "tags": [
          "alerts"
        ],
        "summary": "Create an alert channel",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:alerts"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKeyHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "channel_type",
                  "config"
                ],
                "properties": {
                  "channel_type": {
                    "type": "string",
                    "enum": [
                      "email",
                      "slack",
                      "discord",
                      "teams",
                      "pagerduty",
                      "webhook"
                    ]
                  },
                  "config": {
                    "type": "object"
                  },
                  "min_severity": {
                    "type": "string",
                    "enum": [
                      "critical",
                      "high",
                      "medium",
                      "low",
                      "info"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "Not authenticated."
          },
          "403": {
            "description": "Missing write:alerts scope."
          },
          "409": {
            "description": "Idempotency-Key reused with different body."
          },
          "422": {
            "description": "Validation error."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        }
      }
    },
    "/api/v1/alerts/channels/{channel_id}": {
      "delete": {
        "tags": [
          "alerts"
        ],
        "summary": "Delete an alert channel",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:alerts"
        ],
        "parameters": [
          {
            "name": "channel_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted."
          },
          "404": {
            "description": "Not found."
          }
        }
      },
      "patch": {
        "tags": [
          "alerts"
        ],
        "summary": "Partially update an alert channel",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:alerts"
        ],
        "parameters": [
          {
            "name": "channel_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "config": {
                    "type": "object"
                  },
                  "is_active": {
                    "type": "boolean"
                  },
                  "min_severity": {
                    "type": "string",
                    "enum": [
                      "critical",
                      "high",
                      "medium",
                      "low",
                      "info"
                    ]
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated channel."
          },
          "400": {
            "description": "Deactivating a channel still used by an active escalation policy."
          },
          "404": {
            "description": "Alert channel not found."
          }
        }
      }
    },
    "/api/v1/endpoints": {
      "post": {
        "tags": [
          "endpoints"
        ],
        "summary": "Create an endpoint monitor",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:endpoints"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKeyHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name",
                  "url"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "maxLength": 255
                  },
                  "url": {
                    "type": "string",
                    "format": "uri"
                  },
                  "method": {
                    "type": "string",
                    "enum": [
                      "GET",
                      "POST",
                      "PUT",
                      "PATCH",
                      "DELETE",
                      "HEAD",
                      "OPTIONS"
                    ],
                    "default": "GET"
                  },
                  "headers": {
                    "type": "object"
                  },
                  "body_template": {
                    "type": "string",
                    "nullable": true
                  },
                  "interval_seconds": {
                    "type": "integer",
                    "minimum": 15,
                    "default": 900
                  },
                  "openapi_spec_url": {
                    "type": "string",
                    "format": "uri",
                    "nullable": true
                  },
                  "body_assertions": {
                    "type": "array",
                    "maxItems": 20,
                    "items": {
                      "type": "object",
                      "required": [
                        "path",
                        "op"
                      ],
                      "properties": {
                        "path": {
                          "type": "string",
                          "maxLength": 256
                        },
                        "op": {
                          "type": "string",
                          "enum": [
                            "contains",
                            "empty",
                            "equals",
                            "exists",
                            "gt",
                            "gte",
                            "lt",
                            "lte",
                            "not_contains",
                            "not_empty",
                            "not_equals",
                            "not_exists"
                          ]
                        },
                        "value": {
                          "description": "Required unless op is one of: empty, exists, not_empty, not_exists."
                        }
                      }
                    },
                    "description": "Assertions checked against the JSON response body on each probe. A failing assertion marks the endpoint DOWN."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "Not authenticated."
          },
          "403": {
            "description": "Missing write:endpoints scope OR tier endpoint-limit reached."
          },
          "409": {
            "description": "Idempotency-Key reused with different body."
          },
          "422": {
            "description": "Validation error."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        }
      },
      "get": {
        "tags": [
          "endpoints"
        ],
        "summary": "List the monitors on this account",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:endpoints"
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/EndpointResponse"
                  },
                  "type": "array",
                  "title": "Response List User Endpoints Api V1 Endpoints Get"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}": {
      "patch": {
        "tags": [
          "endpoints"
        ],
        "summary": "Update an endpoint",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:endpoints"
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated."
          },
          "401": {
            "description": "Not authenticated."
          },
          "403": {
            "description": "Missing write:endpoints scope."
          },
          "404": {
            "description": "Not found."
          },
          "409": {
            "description": "Idempotency-Key reused with different body."
          },
          "422": {
            "description": "Validation error."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        }
      },
      "delete": {
        "tags": [
          "endpoints"
        ],
        "summary": "Delete an endpoint (cascade)",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:endpoints"
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted."
          },
          "401": {
            "description": "Not authenticated."
          },
          "403": {
            "description": "Missing write:endpoints scope."
          },
          "404": {
            "description": "Not found."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        }
      },
      "get": {
        "tags": [
          "endpoints"
        ],
        "summary": "Get a single monitor",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:endpoints"
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Endpoint Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EndpointDetail"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/escalation/policies": {
      "get": {
        "tags": [
          "alerts"
        ],
        "summary": "List escalation policies",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:alerts"
        ],
        "responses": {
          "200": {
            "description": "List of policies."
          }
        }
      },
      "post": {
        "tags": [
          "alerts"
        ],
        "summary": "Create an escalation policy",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:escalation"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKeyHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "Not authenticated."
          },
          "403": {
            "description": "Missing write:escalation scope."
          },
          "409": {
            "description": "Idempotency-Key reused with different body."
          },
          "422": {
            "description": "Validation error."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        }
      }
    },
    "/api/v1/escalation/policies/{policy_id}": {
      "delete": {
        "tags": [
          "alerts"
        ],
        "summary": "Delete an escalation policy",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:escalation"
        ],
        "parameters": [
          {
            "name": "policy_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted."
          },
          "401": {
            "description": "Not authenticated."
          },
          "403": {
            "description": "Missing write:escalation scope."
          },
          "404": {
            "description": "Not found."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        }
      }
    },
    "/api/v1/escalation/status": {
      "get": {
        "tags": [
          "alerts"
        ],
        "summary": "Escalation status",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:alerts"
        ],
        "responses": {
          "200": {
            "description": "Current escalation state."
          }
        }
      }
    },
    "/api/v1/status-pages/{page_id}/endpoints": {
      "post": {
        "tags": [
          "status-pages"
        ],
        "summary": "Attach an endpoint to a status page",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:status-pages"
        ],
        "parameters": [
          {
            "name": "page_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "endpoint_id",
                  "display_name"
                ],
                "properties": {
                  "endpoint_id": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "display_name": {
                    "type": "string"
                  },
                  "display_order": {
                    "type": "integer"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Attached."
          },
          "401": {
            "description": "Not authenticated."
          },
          "403": {
            "description": "Missing write:status-pages scope."
          },
          "409": {
            "description": "Idempotency-Key reused with different body."
          },
          "422": {
            "description": "Validation error."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        }
      }
    },
    "/api/v1/status-pages/{page_id}/endpoints/{spe_id}": {
      "delete": {
        "tags": [
          "status-pages"
        ],
        "summary": "Detach an endpoint from a status page",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:status-pages"
        ],
        "parameters": [
          {
            "name": "page_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "spe_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Detached."
          },
          "401": {
            "description": "Not authenticated."
          },
          "403": {
            "description": "Missing write:status-pages scope."
          },
          "404": {
            "description": "Not found."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        }
      }
    },
    "/api/v1/webhooks": {
      "get": {
        "tags": [
          "webhooks"
        ],
        "summary": "List webhook subscriptions",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:webhooks"
        ],
        "responses": {
          "200": {
            "description": "List of subscriptions (no secret values)."
          }
        }
      },
      "post": {
        "tags": [
          "webhooks"
        ],
        "summary": "Create a webhook subscription",
        "description": "Creates a subscription and returns the signing secret ONCE. Store it \u2014 subsequent responses only show a prefix.",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:webhooks"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name",
                  "url",
                  "events"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  },
                  "url": {
                    "type": "string",
                    "format": "uri"
                  },
                  "events": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "incident.opened",
                        "incident.acknowledged",
                        "incident.resolved",
                        "regression.detected",
                        "endpoint.down",
                        "endpoint.recovered"
                      ]
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created. Response includes plaintext `secret` shown once."
          },
          "422": {
            "description": "Unknown event type or invalid URL."
          }
        }
      }
    },
    "/api/v1/webhooks/{sub_id}": {
      "patch": {
        "tags": [
          "webhooks"
        ],
        "summary": "Update a webhook (url, name, events, enabled)",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:webhooks"
        ],
        "parameters": [
          {
            "name": "sub_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Updated."
          },
          "404": {
            "description": "Not found."
          }
        }
      },
      "delete": {
        "tags": [
          "webhooks"
        ],
        "summary": "Delete a webhook",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:webhooks"
        ],
        "parameters": [
          {
            "name": "sub_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Deleted."
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/webhooks/{sub_id}/deliveries": {
      "get": {
        "tags": [
          "webhooks"
        ],
        "summary": "List delivery attempts for a webhook (debugging)",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:webhooks"
        ],
        "parameters": [
          {
            "name": "sub_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/LimitParam"
          }
        ],
        "responses": {
          "200": {
            "description": "Recent deliveries incl. status_code, attempts, next_attempt_at."
          }
        }
      }
    },
    "/api/v1/webhooks/{sub_id}/deliveries/{delivery_id}/retry": {
      "post": {
        "tags": [
          "webhooks"
        ],
        "summary": "Manually retry a failed delivery",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:webhooks"
        ],
        "parameters": [
          {
            "name": "sub_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "delivery_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Delivery re-queued; will fire on next worker tick."
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/webhooks/{sub_id}/test": {
      "post": {
        "tags": [
          "webhooks"
        ],
        "summary": "Send a test event to the subscription's URL",
        "description": "Enqueues a synthetic `incident.opened` delivery. Fires within ~10s. Useful for smoke-testing a new subscription.",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:webhooks"
        ],
        "parameters": [
          {
            "name": "sub_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Enqueued; returns the delivery_id you can poll."
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/ai-analyses": {
      "get": {
        "tags": [
          "ai-analyses"
        ],
        "summary": "List AI regression analyses",
        "description": "Read-only. All tiers. AI analyses are auto-generated by the regression pipeline; this endpoint just exposes them via API. Filter by endpoint_id or regression_id.",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:ai-analyses"
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "regression_id",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/LimitParam"
          }
        ],
        "responses": {
          "200": {
            "description": "List of AI analyses."
          },
          "401": {
            "description": "Missing or invalid credentials."
          },
          "403": {
            "description": "Missing read:ai-analyses scope."
          }
        }
      }
    },
    "/api/v1/ai-analyses/{analysis_id}": {
      "get": {
        "tags": [
          "ai-analyses"
        ],
        "summary": "Get a single AI analysis",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:ai-analyses"
        ],
        "parameters": [
          {
            "name": "analysis_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The analysis."
          },
          "404": {
            "description": "Not found or not owned."
          }
        }
      }
    },
    "/api/v1/ai-analyses/regressions/{regression_id}/regenerate": {
      "post": {
        "tags": [
          "ai-analyses"
        ],
        "summary": "Regenerate AI analysis for a regression (paying tiers only)",
        "description": "Triggers a fresh AI analysis for the given regression. **Costs money** \u2014 spends AI provider tokens per call. Passes through 5 guardrails: scope, tier (Free rejected), monthly quota (`max_ai_analyses`), provider circuit breaker, and a per-day cap (50/day paid, 500/day enterprise). Distinct error `code` per layer so clients can differentiate.",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "write:ai-analyses"
        ],
        "parameters": [
          {
            "name": "regression_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Regenerated. Response includes tokens_used + quota_remaining_month + quota_remaining_day."
          },
          "401": {
            "description": "Missing or invalid credentials."
          },
          "403": {
            "description": "Missing write:ai-analyses scope OR tier_not_eligible (Free tier)."
          },
          "404": {
            "description": "Regression not owned by caller."
          },
          "429": {
            "description": "Monthly quota (ai_quota_exceeded) OR daily cap (regenerate_daily_cap) hit."
          },
          "502": {
            "description": "AI provider returned empty (regeneration_failed)."
          },
          "503": {
            "description": "Provider circuit breaker open (provider_unavailable) \u2014 retry in ~15min."
          }
        }
      }
    },
    "/api/v1/security-findings": {
      "get": {
        "tags": [
          "security-findings"
        ],
        "summary": "List security findings for the authenticated account",
        "description": "Read-only. All tiers. Findings scoped by ownership (user_id). The `evidence` field may contain exploit payloads, HTTP request/response snippets, and other sensitive data \u2014 same content the customer sees in their own dashboard. Filter by endpoint_id / severity / status / category / since.",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:security-findings"
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "severity",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "critical",
                "high",
                "medium",
                "low",
                "info"
              ]
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "open",
                "closed",
                "ignored"
              ]
            }
          },
          {
            "name": "category",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "since",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "$ref": "#/components/parameters/LimitParam"
          }
        ],
        "responses": {
          "200": {
            "description": "List of security findings."
          },
          "401": {
            "description": "Missing or invalid credentials."
          },
          "403": {
            "description": "Missing read:security-findings scope."
          }
        }
      }
    },
    "/api/v1/security-findings/{finding_id}": {
      "get": {
        "tags": [
          "security-findings"
        ],
        "summary": "Get a single security finding",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:security-findings"
        ],
        "parameters": [
          {
            "name": "finding_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The finding."
          },
          "401": {
            "description": "Missing or invalid credentials."
          },
          "404": {
            "description": "Not found or not owned."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/security-findings": {
      "get": {
        "tags": [
          "security-findings",
          "endpoints"
        ],
        "summary": "List security findings for a specific endpoint",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:security-findings"
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Findings for the endpoint."
          },
          "401": {
            "description": "Missing or invalid credentials."
          },
          "404": {
            "description": "Endpoint not owned."
          }
        }
      }
    },
    "/api/v1/dashboard/dependency-graph": {
      "get": {
        "tags": [
          "dependencies"
        ],
        "summary": "Failure-correlation graph across monitored endpoints",
        "description": "Nodes are endpoints owned by the caller. Edges represent correlation strength between failure timelines over the requested window. Useful for detecting shared upstream dependencies (e.g. two endpoints that fail together are likely behind the same DB or gateway).",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:dependencies"
        ],
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 7,
              "maximum": 90,
              "default": 30
            },
            "description": "Correlation window in days."
          }
        ],
        "responses": {
          "200": {
            "description": "Graph shape: {nodes: [...], edges: [...]}. Node fields: id, name, url. Edge fields: source, target, weight (0.0-1.0)."
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "description": "Missing read:dependencies scope."
          }
        }
      }
    },
    "/api/v1/alerts/readiness": {
      "get": {
        "summary": "Alert Readiness",
        "operationId": "alert_readiness_api_v1_alerts_readiness_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertReadinessResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer credentials."
          },
          "403": {
            "description": "Missing required alert scope."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        },
        "security": [
          {
            "ApiKeyBearer": []
          }
        ],
        "tags": [
          "alerts"
        ],
        "x-scopes": [
          "read:alerts"
        ],
        "description": "Reports missing_destination, alerts_disabled, untested, or ready. Ready means instant alerts are enabled and at least one active channel passed a test since its last change. Other channels may remain untested. Severity filters and notification rules still apply. Test acceptance does not confirm inbox delivery."
      }
    },
    "/api/v1/alerts/deliveries": {
      "get": {
        "summary": "List Alert Deliveries",
        "operationId": "list_alert_deliveries_api_v1_alerts_deliveries_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AlertDeliveryJobResponse"
                  },
                  "type": "array",
                  "title": "Response List Alert Deliveries Api V1 Alerts Deliveries Get"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer credentials."
          },
          "403": {
            "description": "Missing required alert scope."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        },
        "security": [
          {
            "ApiKeyBearer": []
          }
        ],
        "tags": [
          "alerts"
        ],
        "x-scopes": [
          "read:alerts"
        ]
      }
    },
    "/api/v1/alerts/deliveries/{regression_id}/retry": {
      "post": {
        "summary": "Retry Alert Delivery",
        "operationId": "retry_alert_delivery_api_v1_alerts_deliveries__regression_id__retry_post",
        "security": [
          {
            "ApiKeyBearer": []
          }
        ],
        "parameters": [
          {
            "name": "regression_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Regression Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertDeliveryJobResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer credentials."
          },
          "403": {
            "description": "Missing required alert scope."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        },
        "tags": [
          "alerts"
        ],
        "x-scopes": [
          "write:alerts"
        ]
      }
    },
    "/api/v1/alerts/notifications": {
      "get": {
        "summary": "List Notification Deliveries",
        "operationId": "list_notification_deliveries_api_v1_alerts_notifications_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/NotificationDeliveryJobResponse"
                  },
                  "type": "array",
                  "title": "Response List Notification Deliveries Api V1 Alerts Notifications Get"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer credentials."
          },
          "403": {
            "description": "Missing required alert scope."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        },
        "security": [
          {
            "ApiKeyBearer": []
          }
        ],
        "tags": [
          "alerts"
        ],
        "x-scopes": [
          "read:alerts"
        ]
      }
    },
    "/api/v1/alerts/notifications/{job_id}/retry": {
      "post": {
        "summary": "Retry Notification Delivery",
        "operationId": "retry_notification_delivery_api_v1_alerts_notifications__job_id__retry_post",
        "security": [
          {
            "ApiKeyBearer": []
          }
        ],
        "parameters": [
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Job Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationDeliveryJobResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer credentials."
          },
          "403": {
            "description": "Missing required alert scope."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        },
        "tags": [
          "alerts"
        ],
        "x-scopes": [
          "write:alerts"
        ]
      }
    },
    "/api/v1/alerts/channels/{channel_id}/test": {
      "post": {
        "summary": "Test Alert Channel",
        "operationId": "test_alert_channel_api_v1_alerts_channels__channel_id__test_post",
        "security": [
          {
            "ApiKeyBearer": []
          }
        ],
        "parameters": [
          {
            "name": "channel_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Channel Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertChannelTestResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer credentials."
          },
          "403": {
            "description": "Missing required alert scope."
          },
          "429": {
            "description": "Rate limit exceeded."
          },
          "404": {
            "description": "Channel not found for this account."
          },
          "409": {
            "description": "Channel is inactive."
          },
          "502": {
            "description": "Provider did not accept the test alert."
          }
        },
        "tags": [
          "alerts"
        ],
        "x-scopes": [
          "write:alerts"
        ],
        "description": "Requires write:alerts. Sends a test to an active channel owned by the account. Success means provider acceptance, not confirmed inbox receipt. Successful tests update /alerts/readiness; they do not create incident history."
      }
    },
    "/api/v1/alerts/history": {
      "get": {
        "summary": "List Alert History",
        "operationId": "list_alert_history_api_v1_alerts_history_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AlertHistoryResponse"
                  },
                  "type": "array",
                  "title": "Response List Alert History Api V1 Alerts History Get"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer credentials."
          },
          "403": {
            "description": "Missing required alert scope."
          },
          "429": {
            "description": "Rate limit exceeded."
          }
        },
        "security": [
          {
            "ApiKeyBearer": []
          }
        ],
        "tags": [
          "alerts"
        ],
        "x-scopes": [
          "read:alerts"
        ]
      }
    },
    "/api/v1/users/me": {
      "get": {
        "tags": [
          "users"
        ],
        "summary": "Get the authenticated user",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "responses": {
          "200": {
            "description": "The current user.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "email": {
                      "type": "string"
                    },
                    "full_name": {
                      "type": "string"
                    },
                    "avatar_url": {
                      "type": "string",
                      "nullable": true
                    },
                    "auth_provider": {
                      "type": "string"
                    },
                    "is_active": {
                      "type": "boolean"
                    },
                    "current_tier": {
                      "type": "string"
                    },
                    "digest_enabled": {
                      "type": "boolean"
                    },
                    "ai_enabled": {
                      "type": "boolean"
                    },
                    "instant_alerts_enabled": {
                      "type": "boolean"
                    },
                    "alert_grouping_enabled": {
                      "type": "boolean"
                    },
                    "recovery_alerts_enabled": {
                      "type": "boolean"
                    },
                    "mobile_push_incident_opened": {
                      "type": "boolean"
                    },
                    "mobile_push_escalations": {
                      "type": "boolean"
                    },
                    "mobile_push_assignments": {
                      "type": "boolean"
                    },
                    "mobile_push_resolved": {
                      "type": "boolean"
                    },
                    "is_admin": {
                      "type": "boolean"
                    },
                    "last_login_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid access token."
          }
        }
      },
      "patch": {
        "tags": [
          "users"
        ],
        "summary": "Partially update the authenticated user",
        "description": "Partial update: send only the fields you want to change. Omitted fields are left untouched.",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "full_name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 255
                  },
                  "digest_enabled": {
                    "type": "boolean"
                  },
                  "ai_enabled": {
                    "type": "boolean"
                  },
                  "instant_alerts_enabled": {
                    "type": "boolean"
                  },
                  "alert_grouping_enabled": {
                    "type": "boolean"
                  },
                  "recovery_alerts_enabled": {
                    "type": "boolean"
                  },
                  "mobile_push_incident_opened": {
                    "type": "boolean"
                  },
                  "mobile_push_escalations": {
                    "type": "boolean"
                  },
                  "mobile_push_assignments": {
                    "type": "boolean"
                  },
                  "mobile_push_resolved": {
                    "type": "boolean"
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated user.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "email": {
                      "type": "string"
                    },
                    "full_name": {
                      "type": "string"
                    },
                    "avatar_url": {
                      "type": "string",
                      "nullable": true
                    },
                    "auth_provider": {
                      "type": "string"
                    },
                    "is_active": {
                      "type": "boolean"
                    },
                    "current_tier": {
                      "type": "string"
                    },
                    "digest_enabled": {
                      "type": "boolean"
                    },
                    "ai_enabled": {
                      "type": "boolean"
                    },
                    "instant_alerts_enabled": {
                      "type": "boolean"
                    },
                    "alert_grouping_enabled": {
                      "type": "boolean"
                    },
                    "recovery_alerts_enabled": {
                      "type": "boolean"
                    },
                    "mobile_push_incident_opened": {
                      "type": "boolean"
                    },
                    "mobile_push_escalations": {
                      "type": "boolean"
                    },
                    "mobile_push_assignments": {
                      "type": "boolean"
                    },
                    "mobile_push_resolved": {
                      "type": "boolean"
                    },
                    "is_admin": {
                      "type": "boolean"
                    },
                    "last_login_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid access token."
          },
          "422": {
            "description": "Validation error."
          }
        }
      },
      "delete": {
        "tags": [
          "users"
        ],
        "summary": "Soft-delete the authenticated user",
        "description": "Soft delete with a 30-day grace window before the row is hard-purged. The account is deactivated immediately.",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "responses": {
          "204": {
            "description": "Deletion scheduled; no content."
          },
          "401": {
            "description": "Missing or invalid access token."
          }
        }
      }
    },
    "/api/v1/users/me/export": {
      "get": {
        "tags": [
          "users"
        ],
        "summary": "Export all data held for the authenticated user",
        "description": "Machine-readable export covering GDPR Art. 20 portability.",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "responses": {
          "200": {
            "description": "Export document.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid access token."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/openapi-spec": {
      "patch": {
        "tags": [
          "endpoints"
        ],
        "summary": "Set or clear the OpenAPI spec URL used for contract testing",
        "description": "`spec_url` is a query parameter, not a request body. Send an empty value to clear it. The URL is fetched immediately and rejected if it resolves to a private or internal address.",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "spec_url",
            "in": "query",
            "required": true,
            "description": "URL of the OpenAPI spec; empty clears it.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Spec URL updated."
          },
          "400": {
            "description": "Spec URL resolves to a private or internal IP address."
          },
          "404": {
            "description": "Endpoint not found."
          },
          "502": {
            "description": "Failed to fetch the OpenAPI spec."
          }
        }
      }
    },
    "/api/v1/changelog/apis": {
      "get": {
        "tags": [
          "Changelog"
        ],
        "summary": "List every tracked public API with its latest stability score",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/changelog/apis/{slug}": {
      "get": {
        "tags": [
          "Changelog"
        ],
        "summary": "Get one tracked API with its recent changelog entries",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Slug"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/changelog/apis/{slug}/entries/{entry_id}": {
      "get": {
        "tags": [
          "Changelog"
        ],
        "summary": "Get a single changelog entry and all of its detected changes",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Slug"
            }
          },
          {
            "name": "entry_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Entry Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/dashboard": {
      "get": {
        "tags": [
          "dashboard"
        ],
        "summary": "Dashboard summary: endpoint counts, open incidents, recent activity",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DashboardResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dashboard/heatmaps": {
      "get": {
        "tags": [
          "dashboard"
        ],
        "summary": "Per-endpoint uptime heatmap data across the account",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 30,
              "minimum": 1,
              "default": 7,
              "title": "Days"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dashboard/response-times": {
      "get": {
        "tags": [
          "dashboard"
        ],
        "summary": "Response-time history across the account",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 168,
              "minimum": 1,
              "default": 24,
              "title": "Hours"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/dashboard/uptime-history": {
      "get": {
        "tags": [
          "dashboard"
        ],
        "summary": "Uptime history across the account",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 90,
              "minimum": 1,
              "default": 30,
              "title": "Days"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/endpoints/import-openapi": {
      "post": {
        "tags": [
          "endpoints"
        ],
        "summary": "Create monitors in bulk from an OpenAPI spec",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OpenAPIImportRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpenAPIImportResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request."
          },
          "403": {
            "description": "Not permitted for this account or scope."
          },
          "502": {
            "description": "Upstream fetch failed."
          }
        }
      }
    },
    "/api/v1/endpoints/import-openapi/preview": {
      "post": {
        "tags": [
          "endpoints"
        ],
        "summary": "Preview which monitors an OpenAPI spec would create, without creating them",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OpenAPIImportRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpenAPIImportPreviewResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request."
          },
          "502": {
            "description": "Upstream fetch failed."
          }
        }
      }
    },
    "/api/v1/endpoints/recently-deleted": {
      "get": {
        "tags": [
          "endpoints"
        ],
        "summary": "List monitors deleted within the restore window",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/endpoints/recently-deleted/{snapshot_id}/restore": {
      "post": {
        "tags": [
          "endpoints"
        ],
        "summary": "Restore a deleted monitor from its snapshot",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "snapshot_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Snapshot Id"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          },
          "409": {
            "description": "Conflicts with existing state."
          },
          "410": {
            "description": "No longer available."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/baselines": {
      "get": {
        "tags": [
          "endpoints"
        ],
        "summary": "List the response baselines recorded for a monitor",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Endpoint Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/codegen": {
      "get": {
        "tags": [
          "endpoints"
        ],
        "summary": "Generate a client code snippet for a monitored endpoint",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Endpoint Id"
            }
          },
          {
            "name": "language",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "typescript",
              "title": "Language"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request."
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/configurations": {
      "get": {
        "tags": [
          "endpoints"
        ],
        "summary": "List configuration versions of a monitor, oldest first",
        "security": [
          {
            "ApiKeyBearer": []
          },
          {
            "BearerJwt": []
          }
        ],
        "x-scopes": [
          "read:endpoints"
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Endpoint Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/contract-test": {
      "post": {
        "tags": [
          "endpoints"
        ],
        "summary": "Run a contract test against the monitor's OpenAPI spec",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Endpoint Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request."
          },
          "404": {
            "description": "Not found."
          },
          "502": {
            "description": "Upstream fetch failed."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/cost-analysis": {
      "get": {
        "tags": [
          "endpoints"
        ],
        "summary": "Estimated cost of the probe traffic for a monitor",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Endpoint Id"
            }
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 90,
              "minimum": 1,
              "default": 30,
              "title": "Days"
            }
          },
          {
            "name": "cost_per_gb",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "maximum": 1000,
              "minimum": 0,
              "description": "Cost per GB in USD (default: AWS egress)",
              "default": 0.09,
              "title": "Cost Per Gb"
            },
            "description": "Cost per GB in USD (default: AWS egress)"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/fuzz-results": {
      "get": {
        "tags": [
          "endpoints"
        ],
        "summary": "Results of previous fuzz runs against a monitor",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Endpoint Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/fuzz-test": {
      "post": {
        "tags": [
          "endpoints"
        ],
        "summary": "Fuzz a monitored endpoint and record what it returns",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Endpoint Id"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "403": {
            "description": "Not permitted for this account or scope."
          },
          "404": {
            "description": "Not found."
          },
          "503": {
            "description": "Temporarily unavailable."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/generate-tests": {
      "post": {
        "tags": [
          "endpoints"
        ],
        "summary": "Generate a test suite for a monitored endpoint",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Endpoint Id"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "403": {
            "description": "Not permitted for this account or scope."
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/generated-tests": {
      "get": {
        "tags": [
          "endpoints"
        ],
        "summary": "Retrieve previously generated tests for a monitor",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Endpoint Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/heatmap": {
      "get": {
        "tags": [
          "endpoints"
        ],
        "summary": "Uptime heatmap for one monitor",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Endpoint Id"
            }
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 365,
              "minimum": 1,
              "default": 90,
              "title": "Days"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/promote-baseline-now": {
      "post": {
        "tags": [
          "endpoints"
        ],
        "summary": "Promote the current response to be the active baseline",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Endpoint Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request."
          },
          "404": {
            "description": "Not found."
          },
          "409": {
            "description": "Conflicts with existing state."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/results": {
      "get": {
        "tags": [
          "endpoints"
        ],
        "summary": "Paginated probe results for a monitor",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Endpoint Id"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 200,
              "minimum": 1,
              "default": 50,
              "title": "Limit"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Cursor"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/snapshot": {
      "get": {
        "tags": [
          "endpoints"
        ],
        "summary": "Current state of a monitor: latest result, baseline, open incident",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Endpoint Id"
            }
          },
          {
            "name": "at",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "ISO timestamp to snapshot at",
              "title": "At"
            },
            "description": "ISO timestamp to snapshot at"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request."
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/endpoints/{endpoint_id}/timeline": {
      "get": {
        "tags": [
          "endpoints"
        ],
        "summary": "Chronological timeline of events for a monitor",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "endpoint_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Endpoint Id"
            }
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 90,
              "minimum": 1,
              "default": 30,
              "title": "Days"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/incidents/{incident_id}/ack": {
      "post": {
        "tags": [
          "incidents"
        ],
        "summary": "Acknowledge an open incident",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "incident_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Incident Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IncidentAcknowledge"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IncidentDetailResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          },
          "409": {
            "description": "Conflicts with existing state."
          }
        }
      }
    },
    "/api/v1/incidents/{incident_id}/assign": {
      "post": {
        "tags": [
          "incidents"
        ],
        "summary": "Assign an incident to a user",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "incident_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Incident Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IncidentAssign"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IncidentDetailResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request."
          },
          "404": {
            "description": "Not found."
          },
          "409": {
            "description": "Conflicts with existing state."
          }
        }
      }
    },
    "/api/v1/incidents/{incident_id}/resolve": {
      "post": {
        "tags": [
          "incidents"
        ],
        "summary": "Resolve an incident",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "incident_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Incident Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IncidentResolve"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IncidentDetailResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/public/changelog-subscribe/unsubscribe": {
      "get": {
        "tags": [
          "public-api"
        ],
        "summary": "Unsubscribe from changelog notifications via an emailed link",
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Token"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/public/digest/confirm": {
      "get": {
        "tags": [
          "public-api"
        ],
        "summary": "Confirm a digest subscription via an emailed link",
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Token"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/public/digest/unsubscribe": {
      "get": {
        "tags": [
          "public-api"
        ],
        "summary": "Unsubscribe from the digest via an emailed link",
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Token"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "public-api"
        ],
        "summary": "Unsubscribe from the digest",
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Token"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/public/geo": {
      "get": {
        "tags": [
          "public-api"
        ],
        "summary": "Country of the calling client, used to pick a probe region",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/public/hero-feed": {
      "get": {
        "tags": [
          "public-api"
        ],
        "summary": "Recent breaking changes shown on the marketing homepage",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/public/marketplace-action-usage": {
      "get": {
        "tags": [
          "public-api"
        ],
        "summary": "Usage counters for the GitHub Action",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/v1/public/report/{share_token}": {
      "get": {
        "tags": [
          "public-api"
        ],
        "summary": "Read a regression report shared by token, no account required",
        "parameters": [
          {
            "name": "share_token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Share Token"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/public/status/{slug}": {
      "get": {
        "tags": [
          "public-api"
        ],
        "summary": "Public status page data for a published slug",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Slug"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/public/status/{slug}/badge.svg": {
      "get": {
        "tags": [
          "public-api"
        ],
        "summary": "SVG status badge for a published status page",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Slug"
            }
          },
          {
            "name": "label",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "status",
              "title": "Label"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/public/unsubscribe": {
      "get": {
        "tags": [
          "public-api"
        ],
        "summary": "Unsubscribe from alert email via an emailed link",
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Token"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "public-api"
        ],
        "summary": "Unsubscribe from alert email",
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Token"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/regressions/{regression_id}/acknowledge": {
      "post": {
        "tags": [
          "regressions"
        ],
        "summary": "Acknowledge a detected regression",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "regression_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Regression Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RegressionAcknowledge"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegressionResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/regressions/{regression_id}/analyses": {
      "get": {
        "tags": [
          "regressions"
        ],
        "summary": "AI analyses attached to a regression",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "regression_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Regression Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/regressions/{regression_id}/archive": {
      "delete": {
        "tags": [
          "regressions"
        ],
        "summary": "Remove a regression's public archive page",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "regression_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Regression Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "403": {
            "description": "Not permitted for this account or scope."
          },
          "404": {
            "description": "Not found."
          }
        }
      },
      "post": {
        "tags": [
          "regressions"
        ],
        "summary": "Archive a regression to a permanent public URL",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "regression_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Regression Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "403": {
            "description": "Not permitted for this account or scope."
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/regressions/{regression_id}/diff-context": {
      "get": {
        "tags": [
          "regressions"
        ],
        "summary": "Baseline and current response side by side for a regression",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "regression_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Regression Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/regressions/{regression_id}/markdown": {
      "get": {
        "tags": [
          "regressions"
        ],
        "summary": "Regression rendered as Markdown, for pasting into an issue",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "regression_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Regression Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/regressions/{regression_id}/promote-baseline": {
      "post": {
        "tags": [
          "regressions"
        ],
        "summary": "Accept a regression's response as the new baseline",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "regression_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Regression Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegressionResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/regressions/{regression_id}/resolve": {
      "post": {
        "tags": [
          "regressions"
        ],
        "summary": "Resolve a regression",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "regression_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Regression Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RegressionResolve"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegressionResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/regressions/{regression_id}/share": {
      "delete": {
        "tags": [
          "regressions"
        ],
        "summary": "Revoke a regression report's share token",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "regression_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Regression Id"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Successful Response"
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      },
      "get": {
        "tags": [
          "regressions"
        ],
        "summary": "Get the share token for a regression report, if one exists",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "regression_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Regression Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      },
      "post": {
        "tags": [
          "regressions"
        ],
        "summary": "Create a share token for a regression report",
        "security": [
          {
            "BearerJwt": []
          }
        ],
        "parameters": [
          {
            "name": "regression_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Regression Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/tools/openapi-diff": {
      "post": {
        "tags": [
          "tools"
        ],
        "summary": "Diff two OpenAPI specs and classify every change",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OpenAPIDiffRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": true,
                  "type": "object",
                  "title": "Response Openapi Diff Api V1 Tools Openapi Diff Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "400": {
            "description": "Neither inline spec nor URL supplied for a side, or a fetched spec was unusable."
          },
          "502": {
            "description": "A spec URL could not be fetched."
          }
        },
        "description": "Supply each side as inline text (`old_spec`/`new_spec`, JSON or YAML) or as an HTTPS URL (`old_url`/`new_url`). Inline wins if both are given. No account required."
      }
    },
    "/api/v1/tools/openapi-diff/share": {
      "post": {
        "tags": [
          "tools"
        ],
        "summary": "Publish a diff result to a shareable URL",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/_ShareDiffIn"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": true,
                  "type": "object",
                  "title": "Response Share Openapi Diff Api V1 Tools Openapi Diff Share Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request."
          },
          "413": {
            "description": "Payload too large."
          }
        }
      }
    },
    "/api/v1/tools/openapi-diff/share/{slug}": {
      "get": {
        "tags": [
          "tools"
        ],
        "summary": "Retrieve a previously shared diff result",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Slug"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true,
                  "title": "Response Get Shared Openapi Diff Api V1 Tools Openapi Diff Share  Slug  Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/webhooks/resend": {
      "post": {
        "tags": [
          "webhooks"
        ],
        "summary": "Resend a webhook delivery that previously failed",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "400": {
            "description": "Invalid request."
          },
          "401": {
            "description": "Missing or invalid credentials."
          },
          "503": {
            "description": "Temporarily unavailable."
          }
        }
      }
    },
    "/changelog.rss": {
      "get": {
        "tags": [
          "Feeds"
        ],
        "summary": "Atom feed of breaking changes across every tracked API",
        "description": "Atom 1.0. One entry per changelog entry across all tracked vendors. Per-vendor feeds live at /changelog/<slug>.rss.",
        "responses": {
          "200": {
            "description": "Atom feed.",
            "content": {
              "application/atom+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/badge/{slug}.svg": {
      "get": {
        "tags": [
          "Badges"
        ],
        "summary": "Status badge for a published status page (apex shortcut)",
        "description": "Shorthand for /api/v1/public/status/{slug}/badge.svg, which is the canonical route. The slug is a published STATUS PAGE slug, not a tracked-API slug: for a tracked vendor's stability badge use /badge/stability/{slug}.svg instead. Exists purely so the URL is short enough to paste into a README.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Published status-page slug.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "SVG image.",
            "content": {
              "image/svg+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No published status page with that slug."
          }
        }
      }
    }
  },
  "components": {
    "parameters": {
      "CursorParam": {
        "name": "cursor",
        "in": "query",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "Opaque cursor from a previous response's `next_cursor` field or `Link: rel=next` header. Omit for first page."
      },
      "LimitParam": {
        "name": "limit",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 200,
          "default": 50
        },
        "description": "Max items per page."
      },
      "IdempotencyKeyHeader": {
        "name": "Idempotency-Key",
        "in": "header",
        "required": false,
        "schema": {
          "type": "string",
          "maxLength": 255
        },
        "description": "Optional. Same key + same body replays cached response for 24h; same key + different body returns 409."
      }
    },
    "headers": {
      "XRateLimitLimit": {
        "description": "Max tokens in the current bucket.",
        "schema": {
          "type": "integer"
        }
      },
      "XRateLimitRemaining": {
        "description": "Tokens available right now.",
        "schema": {
          "type": "integer"
        }
      },
      "XRateLimitReset": {
        "description": "Unix timestamp when the bucket refills to full.",
        "schema": {
          "type": "integer"
        }
      },
      "RateLimit": {
        "description": "IETF draft-ietf-httpapi-ratelimit-headers-11 form. E.g. `\"read\";r=287;t=14`",
        "schema": {
          "type": "string"
        }
      },
      "RateLimitPolicy": {
        "description": "IETF quota policy. E.g. `\"read\";q=300;w=60`",
        "schema": {
          "type": "string"
        }
      },
      "RequestId": {
        "description": "req_ + 26-char Crockford base32 ULID. Echoed if incoming.",
        "schema": {
          "type": "string"
        }
      }
    },
    "securitySchemes": {
      "ApiKeyBearer": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "mrs_live_*",
        "description": "monit.rs API key (mrs_live_ prefix). Get one at https://monit.rs/settings?tab=api-keys after signing in."
      },
      "BearerJwt": {
        "type": "http",
        "scheme": "bearer",
        "description": "Bearer JWT token for authenticated user sessions."
      }
    },
    "schemas": {
      "PublicStats": {
        "type": "object",
        "properties": {
          "tracked_apis": {
            "type": "integer",
            "description": "Count of active vendors currently being monitored."
          },
          "snapshots_total": {
            "type": "integer",
            "description": "Cumulative snapshots taken across all vendors."
          },
          "breaking_changes_90d": {
            "type": "integer",
            "description": "Breaking-change events detected in the trailing 90 days."
          },
          "last_detection_at": {
            "type": "string",
            "format": "date-time",
            "description": "Timestamp of the most recent detection."
          }
        },
        "required": [
          "tracked_apis"
        ]
      },
      "ChangelogEntry": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "published_at": {
            "type": "string",
            "format": "date-time"
          },
          "breaking_count": {
            "type": "integer"
          },
          "non_breaking_count": {
            "type": "integer"
          },
          "info_count": {
            "type": "integer"
          },
          "summary": {
            "type": "string",
            "description": "Human-readable one-line summary of the entry."
          },
          "changes": {
            "type": "array",
            "description": "Individual change events comprising this entry.",
            "items": {
              "$ref": "#/components/schemas/ChangeEvent"
            }
          }
        }
      },
      "ChangeEvent": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "description": "Category of change. See https://monit.rs/blog for the taxonomy.",
            "examples": [
              "field_removed",
              "path_added",
              "response_added",
              "parameter_type",
              "field_added"
            ]
          },
          "severity": {
            "type": "string",
            "enum": [
              "breaking",
              "non_breaking",
              "info"
            ]
          },
          "path": {
            "type": "string",
            "description": "OpenAPI path the change targets, when applicable."
          },
          "method": {
            "type": "string",
            "description": "HTTP method the change targets, when applicable."
          },
          "detail": {
            "type": "string",
            "description": "Short human-readable description of the specific change."
          }
        },
        "required": [
          "kind",
          "severity"
        ]
      },
      "DigestSubscribeRequest": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "source": {
            "type": "string",
            "description": "Free-form attribution string; recorded for analytics.",
            "maxLength": 64
          }
        },
        "required": [
          "email"
        ]
      },
      "ChangelogSubscribeRequest": {
        "type": "object",
        "properties": {
          "webhook_url": {
            "type": "string",
            "format": "uri",
            "description": "Slack or Discord webhook URL."
          },
          "channel_type": {
            "type": "string",
            "enum": [
              "slack",
              "discord"
            ],
            "description": "Which webhook host to expect. Must match the URL host."
          },
          "api_slug": {
            "type": "string",
            "description": "Restrict to a single vendor slug. Omit to subscribe to all vendors.",
            "pattern": "^[a-z0-9][a-z0-9-]{0,63}$"
          }
        },
        "required": [
          "webhook_url",
          "channel_type"
        ]
      },
      "ApiError": {
        "type": "object",
        "required": [
          "code",
          "message",
          "docs_url",
          "request_id"
        ],
        "properties": {
          "code": {
            "type": "string",
            "example": "endpoint_not_found"
          },
          "message": {
            "type": "string"
          },
          "docs_url": {
            "type": "string",
            "format": "uri"
          },
          "request_id": {
            "type": "string",
            "example": "req_01HXY..."
          },
          "param": {
            "type": "string",
            "description": "Only present on 422 validation errors."
          }
        }
      },
      "ApiErrorEnvelope": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "$ref": "#/components/schemas/ApiError"
          }
        }
      },
      "ProbeIngestRequest": {
        "type": "object",
        "required": [
          "endpoint_id",
          "is_success"
        ],
        "properties": {
          "endpoint_id": {
            "type": "string",
            "format": "uuid"
          },
          "is_success": {
            "type": "boolean"
          },
          "status_code": {
            "type": "integer",
            "minimum": 0,
            "maximum": 599,
            "nullable": true
          },
          "response_time_ms": {
            "type": "number",
            "minimum": 0,
            "nullable": true
          },
          "response_body": {
            "description": "Any JSON value: object, array, string, number, boolean, or null."
          },
          "response_headers": {
            "type": "object",
            "nullable": true
          },
          "error_message": {
            "type": "string",
            "nullable": true
          },
          "checked_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "IncidentPayload": {
        "type": "object",
        "required": [
          "title",
          "severity"
        ],
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "severity": {
            "type": "string",
            "enum": [
              "critical",
              "error",
              "warning",
              "info"
            ]
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "source": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "IncidentIngestRequest": {
        "type": "object",
        "required": [
          "action",
          "dedup_key",
          "payload"
        ],
        "properties": {
          "action": {
            "type": "string",
            "enum": [
              "trigger",
              "acknowledge",
              "resolve"
            ]
          },
          "dedup_key": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "description": "Merges trigger/ack/resolve events into one incident (PagerDuty pattern)."
          },
          "endpoint_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Required on trigger; optional on ack/resolve."
          },
          "external_ref": {
            "type": "string",
            "maxLength": 255,
            "nullable": true,
            "description": "Free-form caller-side reference (e.g. ticket number)."
          },
          "payload": {
            "$ref": "#/components/schemas/IncidentPayload"
          }
        }
      },
      "IncidentIngestResponse": {
        "type": "object",
        "required": [
          "incident_id",
          "dedup_key",
          "status"
        ],
        "properties": {
          "incident_id": {
            "type": "string",
            "format": "uuid"
          },
          "dedup_key": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "open",
              "acknowledged",
              "resolved"
            ]
          }
        }
      },
      "AlertChannelCreate": {
        "properties": {
          "channel_type": {
            "type": "string",
            "pattern": "^(email|webhook|slack|discord|pagerduty|teams)$",
            "title": "Channel Type"
          },
          "config": {
            "additionalProperties": true,
            "type": "object",
            "title": "Config"
          },
          "min_severity": {
            "type": "string",
            "pattern": "^(critical|high|medium|low|info)$",
            "title": "Min Severity",
            "default": "medium"
          }
        },
        "type": "object",
        "required": [
          "channel_type",
          "config"
        ],
        "title": "AlertChannelCreate"
      },
      "AlertChannelResponse": {
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
          },
          "channel_type": {
            "type": "string",
            "title": "Channel Type"
          },
          "is_active": {
            "type": "boolean",
            "title": "Is Active"
          },
          "min_severity": {
            "type": "string",
            "title": "Min Severity"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "channel_type",
          "is_active",
          "min_severity",
          "created_at"
        ],
        "title": "AlertChannelResponse"
      },
      "AlertChannelTestResponse": {
        "properties": {
          "status": {
            "type": "string",
            "title": "Status"
          },
          "message": {
            "type": "string",
            "title": "Message"
          }
        },
        "type": "object",
        "required": [
          "status",
          "message"
        ],
        "title": "AlertChannelTestResponse"
      },
      "AlertDeliveryJobResponse": {
        "properties": {
          "regression_id": {
            "type": "string",
            "format": "uuid",
            "title": "Regression Id"
          },
          "status": {
            "type": "string",
            "title": "Status"
          },
          "attempts": {
            "type": "integer",
            "title": "Attempts"
          },
          "next_attempt_at": {
            "type": "string",
            "format": "date-time",
            "title": "Next Attempt At"
          },
          "last_error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Error"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          },
          "completed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Completed At"
          }
        },
        "type": "object",
        "required": [
          "regression_id",
          "status",
          "attempts",
          "next_attempt_at",
          "last_error",
          "created_at",
          "completed_at"
        ],
        "title": "AlertDeliveryJobResponse"
      },
      "AlertHistoryResponse": {
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
          },
          "alert_channel_id": {
            "type": "string",
            "format": "uuid",
            "title": "Alert Channel Id"
          },
          "regression_id": {
            "type": "string",
            "format": "uuid",
            "title": "Regression Id"
          },
          "incident_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid"
              },
              {
                "type": "null"
              }
            ],
            "title": "Incident Id"
          },
          "alert_type": {
            "type": "string",
            "title": "Alert Type",
            "default": "regression_detected"
          },
          "status": {
            "type": "string",
            "title": "Status"
          },
          "attempts": {
            "type": "integer",
            "title": "Attempts"
          },
          "sent_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sent At"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "alert_channel_id",
          "regression_id",
          "status",
          "attempts",
          "sent_at",
          "created_at"
        ],
        "title": "AlertHistoryResponse"
      },
      "AlertReadinessResponse": {
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "missing_destination",
              "alerts_disabled",
              "untested",
              "ready"
            ],
            "title": "Status"
          },
          "active_channel_count": {
            "type": "integer",
            "title": "Active Channel Count"
          },
          "instant_alerts_enabled": {
            "type": "boolean",
            "title": "Instant Alerts Enabled"
          },
          "recovery_alerts_enabled": {
            "type": "boolean",
            "title": "Recovery Alerts Enabled"
          },
          "last_test_accepted_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Test Accepted At"
          }
        },
        "type": "object",
        "required": [
          "status",
          "active_channel_count",
          "instant_alerts_enabled",
          "recovery_alerts_enabled",
          "last_test_accepted_at"
        ],
        "title": "AlertReadinessResponse"
      },
      "HTTPValidationError": {
        "properties": {
          "detail": {
            "items": {
              "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
          }
        },
        "type": "object",
        "title": "HTTPValidationError"
      },
      "NotificationDeliveryJobResponse": {
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
          },
          "kind": {
            "type": "string",
            "title": "Kind"
          },
          "incident_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid"
              },
              {
                "type": "null"
              }
            ],
            "title": "Incident Id"
          },
          "status": {
            "type": "string",
            "title": "Status"
          },
          "attempts": {
            "type": "integer",
            "title": "Attempts"
          },
          "next_attempt_at": {
            "type": "string",
            "format": "date-time",
            "title": "Next Attempt At"
          },
          "last_error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Error"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          },
          "completed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Completed At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "kind",
          "incident_id",
          "status",
          "attempts",
          "next_attempt_at",
          "last_error",
          "created_at",
          "completed_at"
        ],
        "title": "NotificationDeliveryJobResponse"
      },
      "ValidationError": {
        "properties": {
          "loc": {
            "items": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "integer"
                }
              ]
            },
            "type": "array",
            "title": "Location"
          },
          "msg": {
            "type": "string",
            "title": "Message"
          },
          "type": {
            "type": "string",
            "title": "Error Type"
          },
          "input": {
            "title": "Input"
          },
          "ctx": {
            "type": "object",
            "title": "Context"
          }
        },
        "type": "object",
        "required": [
          "loc",
          "msg",
          "type"
        ],
        "title": "ValidationError"
      },
      "_ShareDiffIn": {
        "properties": {
          "result": {
            "additionalProperties": true,
            "type": "object",
            "title": "Result",
            "description": "Output of /openapi-diff verbatim."
          }
        },
        "type": "object",
        "required": [
          "result"
        ],
        "title": "_ShareDiffIn",
        "description": "Save a previously-computed diff result for shareable permalink.\n\nInputs (old_spec/new_spec) are NOT in this payload \u2014 only the\ndiff RESULT. The visitor's specs often contain business-sensitive\nfield names that they wouldn't want indexed. The diff output is\nwhat would be shown to anyone visiting the share URL anyway."
      },
      "IncidentAcknowledge": {
        "properties": {
          "acknowledged": {
            "type": "boolean",
            "title": "Acknowledged",
            "default": true
          }
        },
        "type": "object",
        "title": "IncidentAcknowledge"
      },
      "OpenAPIImportRequest": {
        "properties": {
          "spec_url": {
            "type": "string",
            "minLength": 5,
            "title": "Spec Url"
          },
          "base_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Base Url"
          },
          "interval_seconds": {
            "type": "integer",
            "maximum": 86400.0,
            "minimum": 30.0,
            "title": "Interval Seconds",
            "default": 900
          },
          "include_write_methods": {
            "type": "boolean",
            "title": "Include Write Methods",
            "default": false
          },
          "include_path_params": {
            "type": "boolean",
            "title": "Include Path Params",
            "default": false
          },
          "headers": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Headers"
          },
          "auth_config": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Auth Config"
          },
          "query_params": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Query Params"
          },
          "selected": {
            "anyOf": [
              {
                "items": {
                  "additionalProperties": true,
                  "type": "object"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Selected"
          }
        },
        "type": "object",
        "required": [
          "spec_url"
        ],
        "title": "OpenAPIImportRequest"
      },
      "EndpointDetail": {
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "url": {
            "type": "string",
            "title": "Url"
          },
          "method": {
            "type": "string",
            "title": "Method"
          },
          "interval_seconds": {
            "type": "integer",
            "title": "Interval Seconds"
          },
          "is_active": {
            "type": "boolean",
            "title": "Is Active"
          },
          "config_version": {
            "type": "integer",
            "title": "Config Version",
            "default": 1
          },
          "monitoring_mode": {
            "type": "string",
            "title": "Monitoring Mode",
            "default": "http"
          },
          "heartbeat_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Heartbeat Url"
          },
          "response_capture": {
            "type": "string",
            "title": "Response Capture",
            "default": "redacted"
          },
          "last_status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Status"
          },
          "last_checked_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Checked At"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          },
          "headers": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Headers"
          },
          "body_template": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Body Template"
          },
          "has_auth": {
            "type": "boolean",
            "title": "Has Auth",
            "default": false
          },
          "openapi_spec_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Openapi Spec Url"
          },
          "body_assertions": {
            "type": "array",
            "maxItems": 20,
            "items": {
              "type": "object",
              "required": [
                "path",
                "op"
              ],
              "properties": {
                "path": {
                  "type": "string",
                  "maxLength": 256
                },
                "op": {
                  "type": "string",
                  "enum": [
                    "contains",
                    "empty",
                    "equals",
                    "exists",
                    "gt",
                    "gte",
                    "lt",
                    "lte",
                    "not_contains",
                    "not_empty",
                    "not_equals",
                    "not_exists"
                  ]
                },
                "value": {
                  "description": "Required unless op is one of: empty, exists, not_empty, not_exists."
                }
              }
            },
            "description": "Assertions checked against the JSON response body on each probe. A failing assertion marks the endpoint DOWN."
          }
        },
        "type": "object",
        "required": [
          "id",
          "name",
          "url",
          "method",
          "interval_seconds",
          "is_active",
          "last_status",
          "last_checked_at",
          "created_at"
        ],
        "title": "EndpointDetail"
      },
      "OpenAPIImportPreviewResponse": {
        "properties": {
          "spec_url": {
            "type": "string",
            "title": "Spec Url"
          },
          "base_url": {
            "type": "string",
            "title": "Base Url"
          },
          "total_paths": {
            "type": "integer",
            "title": "Total Paths"
          },
          "available_tags": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Available Tags"
          },
          "limit_max": {
            "type": "integer",
            "title": "Limit Max"
          },
          "limit_remaining": {
            "type": "integer",
            "title": "Limit Remaining"
          },
          "over_limit_count": {
            "type": "integer",
            "title": "Over Limit Count"
          },
          "candidates": {
            "items": {
              "$ref": "#/components/schemas/OpenAPIImportCandidate"
            },
            "type": "array",
            "title": "Candidates"
          },
          "skipped": {
            "items": {
              "$ref": "#/components/schemas/OpenAPIImportSkipped"
            },
            "type": "array",
            "title": "Skipped"
          }
        },
        "type": "object",
        "required": [
          "spec_url",
          "base_url",
          "total_paths",
          "available_tags",
          "limit_max",
          "limit_remaining",
          "over_limit_count",
          "candidates",
          "skipped"
        ],
        "title": "OpenAPIImportPreviewResponse"
      },
      "DashboardResponse": {
        "properties": {
          "stats": {
            "$ref": "#/components/schemas/DashboardStats"
          },
          "recent_regressions": {
            "items": {
              "$ref": "#/components/schemas/RegressionResponse"
            },
            "type": "array",
            "title": "Recent Regressions"
          },
          "endpoints_status": {
            "items": {
              "$ref": "#/components/schemas/EndpointResponse"
            },
            "type": "array",
            "title": "Endpoints Status"
          }
        },
        "type": "object",
        "required": [
          "stats",
          "recent_regressions",
          "endpoints_status"
        ],
        "title": "DashboardResponse"
      },
      "RegressionAcknowledge": {
        "properties": {
          "is_acknowledged": {
            "type": "boolean",
            "title": "Is Acknowledged",
            "default": true
          }
        },
        "type": "object",
        "title": "RegressionAcknowledge"
      },
      "IncidentResolve": {
        "properties": {
          "resolved": {
            "type": "boolean",
            "title": "Resolved",
            "default": true
          }
        },
        "type": "object",
        "title": "IncidentResolve"
      },
      "EndpointResponse": {
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "url": {
            "type": "string",
            "title": "Url"
          },
          "method": {
            "type": "string",
            "title": "Method"
          },
          "interval_seconds": {
            "type": "integer",
            "title": "Interval Seconds"
          },
          "is_active": {
            "type": "boolean",
            "title": "Is Active"
          },
          "config_version": {
            "type": "integer",
            "title": "Config Version",
            "default": 1
          },
          "monitoring_mode": {
            "type": "string",
            "title": "Monitoring Mode",
            "default": "http"
          },
          "heartbeat_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Heartbeat Url"
          },
          "response_capture": {
            "type": "string",
            "title": "Response Capture",
            "default": "redacted"
          },
          "last_status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Status"
          },
          "last_checked_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Checked At"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          },
          "body_assertions": {
            "type": "array",
            "maxItems": 20,
            "items": {
              "type": "object",
              "required": [
                "path",
                "op"
              ],
              "properties": {
                "path": {
                  "type": "string",
                  "maxLength": 256
                },
                "op": {
                  "type": "string",
                  "enum": [
                    "contains",
                    "empty",
                    "equals",
                    "exists",
                    "gt",
                    "gte",
                    "lt",
                    "lte",
                    "not_contains",
                    "not_empty",
                    "not_equals",
                    "not_exists"
                  ]
                },
                "value": {
                  "description": "Required unless op is one of: empty, exists, not_empty, not_exists."
                }
              }
            },
            "description": "Assertions checked against the JSON response body on each probe. A failing assertion marks the endpoint DOWN."
          }
        },
        "type": "object",
        "required": [
          "id",
          "name",
          "url",
          "method",
          "interval_seconds",
          "is_active",
          "last_status",
          "last_checked_at",
          "created_at"
        ],
        "title": "EndpointResponse"
      },
      "RegressionResponse": {
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
          },
          "endpoint_id": {
            "type": "string",
            "format": "uuid",
            "title": "Endpoint Id"
          },
          "incident_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid"
              },
              {
                "type": "null"
              }
            ],
            "title": "Incident Id"
          },
          "regression_type": {
            "type": "string",
            "title": "Regression Type"
          },
          "severity": {
            "type": "string",
            "title": "Severity"
          },
          "diff_summary": {
            "additionalProperties": true,
            "type": "object",
            "title": "Diff Summary"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "is_acknowledged": {
            "type": "boolean",
            "title": "Is Acknowledged"
          },
          "is_resolved": {
            "type": "boolean",
            "title": "Is Resolved"
          },
          "resolved_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Resolved At"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "endpoint_id",
          "regression_type",
          "severity",
          "diff_summary",
          "description",
          "is_acknowledged",
          "is_resolved",
          "resolved_at",
          "created_at"
        ],
        "title": "RegressionResponse"
      },
      "OpenAPIDiffRequest": {
        "properties": {
          "old_spec": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Old Spec",
            "description": "Inline OpenAPI spec (JSON or YAML)."
          },
          "new_spec": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "New Spec",
            "description": "Inline OpenAPI spec (JSON or YAML)."
          },
          "old_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Old Url",
            "description": "HTTPS URL to fetch the old spec from."
          },
          "new_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "New Url",
            "description": "HTTPS URL to fetch the new spec from."
          }
        },
        "type": "object",
        "title": "OpenAPIDiffRequest"
      },
      "OpenAPIImportSkipped": {
        "properties": {
          "path": {
            "type": "string",
            "title": "Path"
          },
          "method": {
            "type": "string",
            "title": "Method"
          },
          "reason": {
            "type": "string",
            "title": "Reason"
          }
        },
        "type": "object",
        "required": [
          "path",
          "method",
          "reason"
        ],
        "title": "OpenAPIImportSkipped"
      },
      "RegressionResolve": {
        "properties": {
          "is_resolved": {
            "type": "boolean",
            "title": "Is Resolved",
            "default": true
          }
        },
        "type": "object",
        "title": "RegressionResolve"
      },
      "IncidentDetailResponse": {
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
          },
          "user_id": {
            "type": "string",
            "format": "uuid",
            "title": "User Id"
          },
          "endpoint_id": {
            "type": "string",
            "format": "uuid",
            "title": "Endpoint Id"
          },
          "status": {
            "type": "string",
            "title": "Status"
          },
          "severity": {
            "type": "string",
            "title": "Severity"
          },
          "title": {
            "type": "string",
            "title": "Title"
          },
          "summary": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Summary"
          },
          "regression_count": {
            "type": "integer",
            "title": "Regression Count"
          },
          "first_detected_at": {
            "type": "string",
            "format": "date-time",
            "title": "First Detected At"
          },
          "last_detected_at": {
            "type": "string",
            "format": "date-time",
            "title": "Last Detected At"
          },
          "acknowledged_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Acknowledged At"
          },
          "acknowledged_by_user_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid"
              },
              {
                "type": "null"
              }
            ],
            "title": "Acknowledged By User Id"
          },
          "resolved_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Resolved At"
          },
          "resolved_by_user_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid"
              },
              {
                "type": "null"
              }
            ],
            "title": "Resolved By User Id"
          },
          "opened_alert_sent_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Opened Alert Sent At"
          },
          "last_alerted_severity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Alerted Severity"
          },
          "recovery_alert_sent_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Recovery Alert Sent At"
          },
          "escalation_policy_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid"
              },
              {
                "type": "null"
              }
            ],
            "title": "Escalation Policy Id"
          },
          "assigned_to_user_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid"
              },
              {
                "type": "null"
              }
            ],
            "title": "Assigned To User Id"
          },
          "assigned_contact": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Assigned Contact"
          },
          "assigned_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Assigned At"
          },
          "assigned_by_user_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid"
              },
              {
                "type": "null"
              }
            ],
            "title": "Assigned By User Id"
          },
          "escalation_status": {
            "type": "string",
            "title": "Escalation Status",
            "default": "pending"
          },
          "current_escalation_step": {
            "type": "integer",
            "title": "Current Escalation Step",
            "default": 0
          },
          "next_escalation_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Escalation At"
          },
          "last_escalated_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Escalated At"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          },
          "updated_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Updated At"
          },
          "endpoint": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/IncidentEndpointSummary"
              },
              {
                "type": "null"
              }
            ]
          },
          "regressions": {
            "items": {
              "$ref": "#/components/schemas/IncidentRegressionSummary"
            },
            "type": "array",
            "title": "Regressions"
          },
          "timeline": {
            "items": {
              "$ref": "#/components/schemas/IncidentTimelineEventResponse"
            },
            "type": "array",
            "title": "Timeline"
          },
          "regressions_truncated": {
            "type": "boolean",
            "title": "Regressions Truncated",
            "default": false
          },
          "timeline_truncated": {
            "type": "boolean",
            "title": "Timeline Truncated",
            "default": false
          }
        },
        "type": "object",
        "required": [
          "id",
          "user_id",
          "endpoint_id",
          "status",
          "severity",
          "title",
          "summary",
          "regression_count",
          "first_detected_at",
          "last_detected_at",
          "acknowledged_at",
          "acknowledged_by_user_id",
          "resolved_at",
          "resolved_by_user_id",
          "created_at"
        ],
        "title": "IncidentDetailResponse"
      },
      "IncidentAssign": {
        "properties": {
          "assign_to_me": {
            "type": "boolean",
            "title": "Assign To Me",
            "default": false
          },
          "name": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 120
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "email": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 255
              },
              {
                "type": "null"
              }
            ],
            "title": "Email"
          },
          "clear": {
            "type": "boolean",
            "title": "Clear",
            "default": false
          }
        },
        "type": "object",
        "title": "IncidentAssign"
      },
      "OpenAPIImportResponse": {
        "properties": {
          "spec_url": {
            "type": "string",
            "title": "Spec Url"
          },
          "base_url": {
            "type": "string",
            "title": "Base Url"
          },
          "total_paths": {
            "type": "integer",
            "title": "Total Paths"
          },
          "total_created": {
            "type": "integer",
            "title": "Total Created"
          },
          "created": {
            "items": {
              "$ref": "#/components/schemas/OpenAPIImportedEndpoint"
            },
            "type": "array",
            "title": "Created"
          },
          "skipped": {
            "items": {
              "$ref": "#/components/schemas/OpenAPIImportSkipped"
            },
            "type": "array",
            "title": "Skipped"
          }
        },
        "type": "object",
        "required": [
          "spec_url",
          "base_url",
          "total_paths",
          "total_created",
          "created",
          "skipped"
        ],
        "title": "OpenAPIImportResponse"
      },
      "IncidentTimelineEventResponse": {
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
          },
          "incident_id": {
            "type": "string",
            "format": "uuid",
            "title": "Incident Id"
          },
          "regression_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid"
              },
              {
                "type": "null"
              }
            ],
            "title": "Regression Id"
          },
          "actor_user_id": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid"
              },
              {
                "type": "null"
              }
            ],
            "title": "Actor User Id"
          },
          "event_type": {
            "type": "string",
            "title": "Event Type"
          },
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Message"
          },
          "metadata": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Metadata"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "incident_id",
          "regression_id",
          "actor_user_id",
          "event_type",
          "message",
          "created_at"
        ],
        "title": "IncidentTimelineEventResponse"
      },
      "DashboardStats": {
        "properties": {
          "total_endpoints": {
            "type": "integer",
            "title": "Total Endpoints"
          },
          "active_endpoints": {
            "type": "integer",
            "title": "Active Endpoints"
          },
          "total_regressions": {
            "type": "integer",
            "title": "Total Regressions"
          },
          "unresolved_regressions": {
            "type": "integer",
            "title": "Unresolved Regressions"
          },
          "avg_response_time_ms": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Avg Response Time Ms"
          },
          "monitoring_coverage_percentage": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Monitoring Coverage Percentage"
          },
          "unknown_monitoring_seconds": {
            "type": "number",
            "title": "Unknown Monitoring Seconds",
            "default": 0
          },
          "uptime_percentage": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Uptime Percentage"
          }
        },
        "type": "object",
        "required": [
          "total_endpoints",
          "active_endpoints",
          "total_regressions",
          "unresolved_regressions",
          "avg_response_time_ms",
          "uptime_percentage"
        ],
        "title": "DashboardStats"
      },
      "IncidentEndpointSummary": {
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "url": {
            "type": "string",
            "title": "Url"
          },
          "method": {
            "type": "string",
            "title": "Method"
          }
        },
        "type": "object",
        "required": [
          "id",
          "name",
          "url",
          "method"
        ],
        "title": "IncidentEndpointSummary"
      },
      "IncidentRegressionSummary": {
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
          },
          "endpoint_id": {
            "type": "string",
            "format": "uuid",
            "title": "Endpoint Id"
          },
          "regression_type": {
            "type": "string",
            "title": "Regression Type"
          },
          "severity": {
            "type": "string",
            "title": "Severity"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "is_acknowledged": {
            "type": "boolean",
            "title": "Is Acknowledged"
          },
          "is_resolved": {
            "type": "boolean",
            "title": "Is Resolved"
          },
          "resolved_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Resolved At"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "endpoint_id",
          "regression_type",
          "severity",
          "description",
          "is_acknowledged",
          "is_resolved",
          "resolved_at",
          "created_at"
        ],
        "title": "IncidentRegressionSummary"
      },
      "OpenAPIImportCandidate": {
        "properties": {
          "path": {
            "type": "string",
            "title": "Path"
          },
          "method": {
            "type": "string",
            "title": "Method"
          },
          "url": {
            "type": "string",
            "title": "Url"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "tags": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Tags",
            "default": []
          },
          "params": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Params",
            "default": []
          }
        },
        "type": "object",
        "required": [
          "path",
          "method",
          "url",
          "name"
        ],
        "title": "OpenAPIImportCandidate"
      },
      "OpenAPIImportedEndpoint": {
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "url": {
            "type": "string",
            "title": "Url"
          },
          "method": {
            "type": "string",
            "title": "Method"
          }
        },
        "type": "object",
        "required": [
          "id",
          "name",
          "url",
          "method"
        ],
        "title": "OpenAPIImportedEndpoint"
      }
    },
    "responses": {
      "Unauthenticated": {
        "description": "Missing or invalid bearer credentials."
      }
    }
  }
}
