GitHub Raw JSON API

openstatusHQ / openstatus

8,653 TypeScript

🫖 Status page with uptime monitoring & API monitoring as code 🫖

OpenStatus API Specification

Located in apps/server/static/openapi-v1.json on branch HEAD

3.0.0 JSON 28 Endpoints 308.5 KB

Operations & Route Endpoints (39)

GET /monitor
List all monitors
POST /monitor
Create a monitor
GET /monitor/{id}
Get a monitor
PUT /monitor/{id}
Update a monitor
DELETE /monitor/{id}
Delete a monitor
POST /monitor/http
Create a http monitor
POST /monitor/tcp
Create a tcp monitor
POST /monitor/dns
Create a dns monitor
PUT /monitor/http/{id}
Update an HTTP monitor
PUT /monitor/tcp/{id}
Update an TCP monitor
PUT /monitor/dns/{id}
Update an DNS monitor
GET /monitor/{id}/summary
Get a monitor summary
POST /monitor/{id}/trigger
Create a monitor trigger
GET /monitor/{id}/result/{resultId}
Get a monitor result
POST /monitor/{id}/run
Create a monitor run
GET /page/{id}
Get a status page
PUT /page/{id}
Update a status page
GET /page
List all status pages
POST /page
Create a status page
GET /status_report
List all status reports
POST /status_report
Create a status report
DELETE /status_report/{id}
Delete a status report
GET /status_report/{id}
Get a status report
POST /status_report/{id}/update
Create a status report update
GET /status_report_update/{id}
Get a status report update
POST /status_report_update
Create a status report update
GET /incident
List all incidents
GET /incident/{id}
Get an incident
PUT /incident/{id}
Update an incident
GET /maintenance
List all maintenances
POST /maintenance
Create a maintenance
GET /maintenance/{id}
Get a maintenance
PUT /maintenance/{id}
Update a maintenance
GET /notification
List all notifications
POST /notification
Create a notification
GET /notification/{id}
Get a notification
POST /page_subscriber/{id}/update
Subscribe to a status page
POST /check/http
Run a single check
GET /whoami
Get your informations
Raw JSON Specification
{
  "openapi": "3.0.0",
  "info": {
    "version": "1.0.0",
    "title": "OpenStatus API",
    "contact": {
      "email": "[email protected]",
      "url": "https://www.openstatus.dev"
    },
    "description": "This version is deprecated please use v2"
  },
  "tags": [
    {
      "name": "monitor",
      "description": "Monitor related endpoints",
      "x-displayName": "Monitor"
    },
    {
      "name": "page",
      "description": "Page related endpoints",
      "x-displayName": "Page"
    },
    {
      "name": "status_report",
      "description": "Status report related endpoints",
      "x-displayName": "Status Report"
    },
    {
      "name": "status_report_update",
      "description": "Status report update related endpoints",
      "x-displayName": "Status Report Update"
    },
    {
      "name": "incident",
      "description": "Incident related endpoints",
      "x-displayName": "Incident"
    },
    {
      "name": "maintenance",
      "description": "Maintenance related endpoints",
      "x-displayName": "Maintenance"
    },
    {
      "name": "notification",
      "description": "Notification related endpoints",
      "x-displayName": "Notification"
    },
    {
      "name": "page_subscriber",
      "description": "Page subscriber related endpoints",
      "x-displayName": "Page Subscriber"
    },
    {
      "name": "check",
      "description": "Check related endpoints",
      "x-displayName": "Check"
    },
    {
      "name": "whoami",
      "description": "WhoAmI related endpoints",
      "x-displayName": "WhoAmI"
    }
  ],
  "security": [
    {
      "ApiKeyAuth": []
    }
  ],
  "components": {
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "x-openstatus-key",
        "x-openstatus-key": "string"
      }
    },
    "schemas": {
      "Monitor": {
        "type": "object",
        "properties": {
          "id": {
            "type": "number",
            "example": 123,
            "description": "The id of the monitor"
          },
          "periodicity": {
            "type": "string",
            "enum": [
              "30s",
              "1m",
              "5m",
              "10m",
              "30m",
              "1h",
              "other"
            ],
            "example": "1m",
            "description": "How often the monitor should run"
          },
          "url": {
            "type": "string",
            "example": "https://www.documenso.co",
            "description": "The url to monitor"
          },
          "regions": {
            "type": "array",
            "nullable": true,
            "items": {
              "type": "string",
              "enum": [
                "ams",
                "arn",
                "atl",
                "bog",
                "bom",
                "bos",
                "cdg",
                "den",
                "dfw",
                "ewr",
                "eze",
                "fra",
                "gdl",
                "gig",
                "gru",
                "hkg",
                "iad",
                "jnb",
                "lax",
                "lhr",
                "mad",
                "mia",
                "nrt",
                "ord",
                "otp",
                "phx",
                "qro",
                "scl",
                "sjc",
                "sea",
                "sin",
                "syd",
                "waw",
                "yul",
                "yyz",
                "koyeb_fra",
                "koyeb_was",
                "koyeb_sin",
                "koyeb_tyo",
                "koyeb_par",
                "koyeb_sfo",
                "railway_europe-west4-drams3a",
                "railway_us-east4-eqdc4a",
                "railway_asia-southeast1-eqsg3a",
                "railway_us-west2"
              ]
            },
            "default": [],
            "example": [
              "ams"
            ],
            "description": "Where we should monitor it"
          },
          "name": {
            "type": "string",
            "example": "documenso-web",
            "description": "The name of the monitor"
          },
          "externalName": {
            "type": "string",
            "nullable": true,
            "example": "Documenso",
            "description": "The external name of the monitor, used to display on the status page or in the external notifications"
          },
          "description": {
            "type": "string",
            "nullable": true,
            "example": "Documenso website",
            "description": "The description of your monitor"
          },
          "method": {
            "type": "string",
            "enum": [
              "GET",
              "POST",
              "HEAD",
              "PUT",
              "PATCH",
              "DELETE",
              "TRACE",
              "CONNECT",
              "OPTIONS"
            ],
            "example": "GET"
          },
          "body": {
            "type": "string",
            "nullable": true,
            "default": "",
            "example": "Hello World",
            "description": "The body"
          },
          "headers": {
            "type": "array",
            "nullable": true,
            "items": {
              "type": "object",
              "properties": {
                "key": {
                  "type": "string"
                },
                "value": {
                  "type": "string"
                }
              },
              "required": [
                "key",
                "value"
              ]
            },
            "default": [],
            "description": "The headers of your request",
            "example": [
              {
                "key": "x-apikey",
                "value": "supersecrettoken"
              }
            ]
          },
          "assertions": {
            "type": "array",
            "nullable": true,
            "items": {
              "oneOf": [
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "status"
                      ]
                    },
                    "compare": {
                      "type": "string",
                      "enum": [
                        "eq",
                        "not_eq",
                        "gt",
                        "gte",
                        "lt",
                        "lte"
                      ],
                      "description": "Comparison operator",
                      "examples": [
                        "eq",
                        "not_eq",
                        "gt",
                        "gte",
                        "lt",
                        "lte"
                      ]
                    },
                    "target": {
                      "type": "integer",
                      "minimum": 0,
                      "exclusiveMinimum": true,
                      "description": "The target value"
                    }
                  },
                  "required": [
                    "type",
                    "compare",
                    "target"
                  ],
                  "description": "The status assertion"
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "header"
                      ]
                    },
                    "compare": {
                      "type": "string",
                      "enum": [
                        "contains",
                        "not_contains",
                        "eq",
                        "not_eq",
                        "empty",
                        "not_empty",
                        "gt",
                        "gte",
                        "lt",
                        "lte"
                      ]
                    },
                    "key": {
                      "type": "string",
                      "description": "The key of the header"
                    },
                    "target": {
                      "type": "string",
                      "description": "the header value"
                    }
                  },
                  "required": [
                    "type",
                    "compare",
                    "key",
                    "target"
                  ],
                  "description": "The header assertion"
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "textBody"
                      ]
                    },
                    "compare": {
                      "type": "string",
                      "enum": [
                        "contains",
                        "not_contains",
                        "eq",
                        "not_eq",
                        "empty",
                        "not_empty",
                        "gt",
                        "gte",
                        "lt",
                        "lte"
                      ]
                    },
                    "target": {
                      "type": "string",
                      "description": "The target value"
                    }
                  },
                  "required": [
                    "type",
                    "compare",
                    "target"
                  ],
                  "description": "The text body assertion"
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "dnsRecord"
                      ]
                    },
                    "key": {
                      "type": "string",
                      "enum": [
                        "A",
                        "AAAA",
                        "CNAME",
                        "MX",
                        "TXT",
                        "NS"
                      ]
                    },
                    "compare": {
                      "type": "string",
                      "enum": [
                        "contains",
                        "not_contains",
                        "eq",
                        "not_eq"
                      ]
                    },
                    "target": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "key",
                    "compare",
                    "target"
                  ],
                  "description": "The DNS record assertion"
                }
              ]
            },
            "default": [],
            "description": "The assertions to run"
          },
          "active": {
            "type": "boolean",
            "default": false,
            "description": "If the monitor is active"
          },
          "public": {
            "type": "boolean",
            "default": false,
            "description": "If the monitor is public"
          },
          "degradedAfter": {
            "type": "number",
            "nullable": true,
            "description": "The time after the monitor is considered degraded in milliseconds"
          },
          "timeout": {
            "type": "number",
            "nullable": true,
            "default": 45000,
            "description": "The timeout of the request in milliseconds"
          },
          "retry": {
            "type": "number",
            "default": 3,
            "description": "The number of retries to attempt"
          },
          "followRedirects": {
            "type": "boolean",
            "default": true,
            "description": "If the monitor should follow redirects"
          },
          "jobType": {
            "type": "string",
            "enum": [
              "http",
              "tcp",
              "icmp",
              "udp",
              "dns",
              "ssl"
            ],
            "default": "http",
            "description": "The type of the monitor"
          },
          "openTelemetry": {
            "type": "object",
            "properties": {
              "endpoint": {
                "type": "string",
                "format": "uri",
                "default": "http://localhost:4317",
                "description": "The endpoint of the OpenTelemetry collector"
              },
              "headers": {
                "type": "object",
                "additionalProperties": {
                  "type": "string"
                },
                "default": {},
                "description": "The headers to send to the OpenTelemetry collector"
              }
            },
            "description": "The OpenTelemetry configuration"
          }
        },
        "required": [
          "id",
          "periodicity",
          "url",
          "name",
          "method"
        ]
      },
      "ErrBadRequest": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "BAD_REQUEST",
              "FORBIDDEN",
              "INTERNAL_SERVER_ERROR",
              "PAYMENT_REQUIRED",
              "CONFLICT",
              "NOT_FOUND",
              "UNAUTHORIZED",
              "METHOD_NOT_ALLOWED",
              "UNPROCESSABLE_ENTITY"
            ],
            "example": "BAD_REQUEST",
            "description": "The error code related to the status code."
          },
          "message": {
            "type": "string",
            "description": "A human readable message describing the issue.",
            "example": "<string>"
          },
          "docs": {
            "type": "string",
            "description": "A link to the documentation for the error.",
            "example": "https://www.openstatus.dev/docs/api-references/errors/code/BAD_REQUEST"
          },
          "requestId": {
            "type": "string",
            "description": "The request id to be used for debugging and error reporting.",
            "example": "<uuid>"
          }
        },
        "required": [
          "code",
          "message",
          "docs",
          "requestId"
        ]
      },
      "ErrUnauthorized": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "BAD_REQUEST",
              "FORBIDDEN",
              "INTERNAL_SERVER_ERROR",
              "PAYMENT_REQUIRED",
              "CONFLICT",
              "NOT_FOUND",
              "UNAUTHORIZED",
              "METHOD_NOT_ALLOWED",
              "UNPROCESSABLE_ENTITY"
            ],
            "example": "UNAUTHORIZED",
            "description": "The error code related to the status code."
          },
          "message": {
            "type": "string",
            "description": "A human readable message describing the issue.",
            "example": "<string>"
          },
          "docs": {
            "type": "string",
            "description": "A link to the documentation for the error.",
            "example": "https://www.openstatus.dev/docs/api-references/errors/code/UNAUTHORIZED"
          },
          "requestId": {
            "type": "string",
            "description": "The request id to be used for debugging and error reporting.",
            "example": "<uuid>"
          }
        },
        "required": [
          "code",
          "message",
          "docs",
          "requestId"
        ]
      },
      "ErrPaymentRequired": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "BAD_REQUEST",
              "FORBIDDEN",
              "INTERNAL_SERVER_ERROR",
              "PAYMENT_REQUIRED",
              "CONFLICT",
              "NOT_FOUND",
              "UNAUTHORIZED",
              "METHOD_NOT_ALLOWED",
              "UNPROCESSABLE_ENTITY"
            ],
            "example": "PAYMENT_REQUIRED",
            "description": "The error code related to the status code."
          },
          "message": {
            "type": "string",
            "description": "A human readable message describing the issue.",
            "example": "<string>"
          },
          "docs": {
            "type": "string",
            "description": "A link to the documentation for the error.",
            "example": "https://www.openstatus.dev/docs/api-references/errors/code/PAYMENT_REQUIRED"
          },
          "requestId": {
            "type": "string",
            "description": "The request id to be used for debugging and error reporting.",
            "example": "<uuid>"
          }
        },
        "required": [
          "code",
          "message",
          "docs",
          "requestId"
        ]
      },
      "ErrForbidden": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "BAD_REQUEST",
              "FORBIDDEN",
              "INTERNAL_SERVER_ERROR",
              "PAYMENT_REQUIRED",
              "CONFLICT",
              "NOT_FOUND",
              "UNAUTHORIZED",
              "METHOD_NOT_ALLOWED",
              "UNPROCESSABLE_ENTITY"
            ],
            "example": "FORBIDDEN",
            "description": "The error code related to the status code."
          },
          "message": {
            "type": "string",
            "description": "A human readable message describing the issue.",
            "example": "<string>"
          },
          "docs": {
            "type": "string",
            "description": "A link to the documentation for the error.",
            "example": "https://www.openstatus.dev/docs/api-references/errors/code/FORBIDDEN"
          },
          "requestId": {
            "type": "string",
            "description": "The request id to be used for debugging and error reporting.",
            "example": "<uuid>"
          }
        },
        "required": [
          "code",
          "message",
          "docs",
          "requestId"
        ]
      },
      "ErrNotFound": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "BAD_REQUEST",
              "FORBIDDEN",
              "INTERNAL_SERVER_ERROR",
              "PAYMENT_REQUIRED",
              "CONFLICT",
              "NOT_FOUND",
              "UNAUTHORIZED",
              "METHOD_NOT_ALLOWED",
              "UNPROCESSABLE_ENTITY"
            ],
            "example": "NOT_FOUND",
            "description": "The error code related to the status code."
          },
          "message": {
            "type": "string",
            "description": "A human readable message describing the issue.",
            "example": "<string>"
          },
          "docs": {
            "type": "string",
            "description": "A link to the documentation for the error.",
            "example": "https://www.openstatus.dev/docs/api-references/errors/code/NOT_FOUND"
          },
          "requestId": {
            "type": "string",
            "description": "The request id to be used for debugging and error reporting.",
            "example": "<uuid>"
          }
        },
        "required": [
          "code",
          "message",
          "docs",
          "requestId"
        ]
      },
      "ErrConflict": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "BAD_REQUEST",
              "FORBIDDEN",
              "INTERNAL_SERVER_ERROR",
              "PAYMENT_REQUIRED",
              "CONFLICT",
              "NOT_FOUND",
              "UNAUTHORIZED",
              "METHOD_NOT_ALLOWED",
              "UNPROCESSABLE_ENTITY"
            ],
            "example": "CONFLICT",
            "description": "The error code related to the status code."
          },
          "message": {
            "type": "string",
            "description": "A human readable message describing the issue.",
            "example": "<string>"
          },
          "docs": {
            "type": "string",
            "description": "A link to the documentation for the error.",
            "example": "https://www.openstatus.dev/docs/api-references/errors/code/CONFLICT"
          },
          "requestId": {
            "type": "string",
            "description": "The request id to be used for debugging and error reporting.",
            "example": "<uuid>"
          }
        },
        "required": [
          "code",
          "message",
          "docs",
          "requestId"
        ]
      },
      "ErrInternalServerError": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "BAD_REQUEST",
              "FORBIDDEN",
              "INTERNAL_SERVER_ERROR",
              "PAYMENT_REQUIRED",
              "CONFLICT",
              "NOT_FOUND",
              "UNAUTHORIZED",
              "METHOD_NOT_ALLOWED",
              "UNPROCESSABLE_ENTITY"
            ],
            "example": "INTERNAL_SERVER_ERROR",
            "description": "The error code related to the status code."
          },
          "message": {
            "type": "string",
            "description": "A human readable message describing the issue.",
            "example": "<string>"
          },
          "docs": {
            "type": "string",
            "description": "A link to the documentation for the error.",
            "example": "https://www.openstatus.dev/docs/api-references/errors/code/INTERNAL_SERVER_ERROR"
          },
          "requestId": {
            "type": "string",
            "description": "The request id to be used for debugging and error reporting.",
            "example": "<uuid>"
          }
        },
        "required": [
          "code",
          "message",
          "docs",
          "requestId"
        ]
      },
      "Page": {
        "type": "object",
        "properties": {
          "id": {
            "type": "number",
            "description": "The id of the page",
            "example": 1
          },
          "title": {
            "type": "string",
            "description": "The title of the page",
            "example": "My Page"
          },
          "description": {
            "type": "string",
            "description": "The description of the page",
            "example": "My awesome status page"
          },
          "slug": {
            "type": "string",
            "description": "The slug of the page",
            "example": "my-page"
          },
          "customDomain": {
            "type": "string",
            "nullable": true,
            "description": "The custom domain of the page. To be configured within the dashboard.",
            "example": "status.acme.com"
          },
          "icon": {
            "anyOf": [
              {
                "type": "string",
                "format": "uri"
              },
              {
                "type": "string",
                "enum": [
                  ""
                ]
              },
              {
                "nullable": true
              }
            ],
            "description": "The icon of the page",
            "example": "https://example.com/icon.png"
          },
          "passwordProtected": {
            "type": "boolean",
            "default": false,
            "description": "Deprecated in favor of `accessType`. Used to set the password protection type. Returns true if `accessType` is set to 'password' and false otherwise.",
            "example": true,
            "deprecated": true
          },
          "accessType": {
            "type": "string",
            "enum": [
              "public",
              "password",
              "email-domain"
            ],
            "default": "public",
            "description": "The access type of the page",
            "example": "public"
          },
          "password": {
            "type": "string",
            "nullable": true,
            "description": "Your password to protect the page from the public",
            "example": "hidden-password"
          },
          "authEmailDomains": {
            "type": "array",
            "nullable": true,
            "items": {
              "type": "string"
            },
            "description": "The email domains of the page",
            "example": [
              "example.com",
              "example.org"
            ]
          },
          "showMonitorValues": {
            "type": "boolean",
            "nullable": true,
            "default": true,
            "description": "Displays the total and failed request numbers for each monitor. Deprecated and will be removed in the future in favor for `configuration` property.",
            "example": true,
            "deprecated": true
          },
          "monitors": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "number"
                },
                "description": "The monitors of the page as an array of ids. We recommend using the object format to include the order.",
                "deprecated": true,
                "example": [
                  1,
                  2
                ]
              },
              {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "monitorId": {
                      "type": "number"
                    },
                    "order": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "monitorId",
                    "order"
                  ]
                },
                "description": "The monitor as object allowing to pass id and order",
                "example": [
                  {
                    "monitorId": 1,
                    "order": 0
                  },
                  {
                    "monitorId": 2,
                    "order": 1
                  }
                ]
              }
            ]
          }
        },
        "required": [
          "id",
          "title",
          "description",
          "slug"
        ]
      },
      "StatusReport": {
        "type": "object",
        "properties": {
          "id": {
            "type": "number",
            "description": "The id of the status report"
          },
          "title": {
            "type": "string",
            "example": "Documenso",
            "description": "The title of the status report"
          },
          "status": {
            "type": "string",
            "enum": [
              "investigating",
              "identified",
              "monitoring",
              "resolved"
            ],
            "description": "The current status of the report"
          },
          "statusReportUpdateIds": {
            "type": "array",
            "nullable": true,
            "items": {
              "type": "number"
            },
            "default": [],
            "description": "The ids of the status report updates"
          },
          "monitorIds": {
            "type": "array",
            "items": {
              "type": "number"
            },
            "default": [],
            "description": "Ids of the monitors the status report."
          },
          "pageId": {
            "type": "number",
            "description": "The id of the page this status report belongs to"
          }
        },
        "required": [
          "id",
          "title",
          "status",
          "pageId"
        ]
      },
      "StatusReportUpdate": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "nullable": true,
            "description": "The id of the update"
          },
          "status": {
            "type": "string",
            "enum": [
              "investigating",
              "identified",
              "monitoring",
              "resolved"
            ],
            "description": "The status of the update"
          },
          "date": {
            "type": "string",
            "nullable": true,
            "format": "date",
            "default": "2026-02-12T22:01:46.114Z",
            "description": "The date of the update in ISO8601 format"
          },
          "message": {
            "type": "string",
            "minLength": 1,
            "description": "The message of the update"
          },
          "statusReportId": {
            "type": "number",
            "description": "The id of the status report"
          }
        },
        "required": [
          "status",
          "message",
          "statusReportId"
        ]
      },
      "Incident": {
        "type": "object",
        "properties": {
          "id": {
            "type": "number",
            "description": "The id of the incident",
            "example": 1
          },
          "startedAt": {
            "type": "string",
            "nullable": true,
            "format": "date",
            "description": "The date the incident started"
          },
          "monitorId": {
            "type": "number",
            "nullable": true,
            "description": "The id of the monitor associated with the incident",
            "example": 1
          },
          "acknowledgedAt": {
            "type": "string",
            "nullable": true,
            "format": "date",
            "description": "The date the incident was acknowledged"
          },
          "acknowledgedBy": {
            "type": "number",
            "nullable": true,
            "description": "The user who acknowledged the incident"
          },
          "resolvedAt": {
            "type": "string",
            "nullable": true,
            "format": "date",
            "description": "The date the incident was resolved"
          },
          "resolvedBy": {
            "type": "number",
            "nullable": true,
            "description": "The user who resolved the incident"
          }
        },
        "required": [
          "id",
          "startedAt",
          "monitorId",
          "acknowledgedBy",
          "resolvedBy"
        ]
      },
      "Maintenance": {
        "type": "object",
        "properties": {
          "id": {
            "type": "number",
            "description": "The id of the maintenance",
            "example": 1
          },
          "title": {
            "type": "string",
            "description": "The title of the maintenance",
            "example": "Database Upgrade"
          },
          "message": {
            "type": "string",
            "description": "The message describing the maintenance",
            "example": "Upgrading database to improve performance"
          },
          "from": {
            "type": "string",
            "nullable": true,
            "format": "date",
            "description": "When the maintenance starts"
          },
          "to": {
            "type": "string",
            "nullable": true,
            "format": "date",
            "description": "When the maintenance ends"
          },
          "monitorIds": {
            "type": "array",
            "items": {
              "type": "number"
            },
            "default": [],
            "description": "IDs of affected monitors"
          },
          "pageId": {
            "type": "number",
            "description": "The id of the status page this maintenance belongs to"
          }
        },
        "required": [
          "id",
          "title",
          "message",
          "from",
          "to",
          "pageId"
        ]
      },
      "Notification": {
        "type": "object",
        "properties": {
          "id": {
            "type": "number",
            "description": "The id of the notification",
            "example": 1
          },
          "name": {
            "type": "string",
            "description": "The name of the notification",
            "example": "OpenStatus Discord"
          },
          "provider": {
            "type": "string",
            "enum": [
              "discord",
              "email",
              "google-chat",
              "grafana-oncall",
              "ms-teams",
              "ntfy",
              "pagerduty",
              "opsgenie",
              "slack",
              "sms",
              "telegram",
              "webhook",
              "whatsapp"
            ],
            "description": "The provider of the notification",
            "example": "discord"
          },
          "payload": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "discord": {
                    "type": "string",
                    "format": "uri"
                  }
                },
                "required": [
                  "discord"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email"
                  }
                },
                "required": [
                  "email"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "grafana-oncall": {
                    "type": "object",
                    "properties": {
                      "webhookUrl": {
                        "type": "string",
                        "format": "uri"
                      }
                    },
                    "required": [
                      "webhookUrl"
                    ]
                  }
                },
                "required": [
                  "grafana-oncall"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "ms-teams": {
                    "type": "object",
                    "properties": {
                      "webhookUrl": {
                        "type": "string",
                        "format": "uri"
                      }
                    },
                    "required": [
                      "webhookUrl"
                    ]
                  }
                },
                "required": [
                  "ms-teams"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "ntfy": {
                    "type": "object",
                    "properties": {
                      "topic": {
                        "type": "string",
                        "default": ""
                      },
                      "serverUrl": {
                        "type": "string",
                        "default": "https://ntfy.sh"
                      },
                      "token": {
                        "type": "string"
                      }
                    }
                  }
                },
                "required": [
                  "ntfy"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "opsgenie": {
                    "type": "object",
                    "properties": {
                      "apiKey": {
                        "type": "string"
                      },
                      "region": {
                        "type": "string",
                        "enum": [
                          "us",
                          "eu"
                        ]
                      }
                    },
                    "required": [
                      "apiKey",
                      "region"
                    ]
                  }
                },
                "required": [
                  "opsgenie"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "pagerduty": {
                    "type": "string"
                  }
                },
                "required": [
                  "pagerduty"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "sms": {
                    "type": "string",
                    "pattern": "^([+]?[\\s0-9]+)?(\\d{3}|[(]?[0-9]+[)])?([-]?[\\s]?[0-9])+$"
                  }
                },
                "required": [
                  "sms"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "telegram": {
                    "type": "object",
                    "properties": {
                      "chatId": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "chatId"
                    ]
                  }
                },
                "required": [
                  "telegram"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "slack": {
                    "type": "string",
                    "format": "uri"
                  }
                },
                "required": [
                  "slack"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "webhook": {
                    "type": "object",
                    "properties": {
                      "endpoint": {
                        "type": "string",
                        "format": "uri"
                      },
                      "headers": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "key": {
                              "type": "string"
                            },
                            "value": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "key",
                            "value"
                          ]
                        }
                      }
                    },
                    "required": [
                      "endpoint"
                    ]
                  }
                },
                "required": [
                  "webhook"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "whatsapp": {
                    "type": "string",
                    "pattern": "^([+]?[\\s0-9]+)?(\\d{3}|[(]?[0-9]+[)])?([-]?[\\s]?[0-9])+$"
                  }
                },
                "required": [
                  "whatsapp"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "google-chat": {
                    "type": "string",
                    "format": "uri"
                  }
                },
                "required": [
                  "google-chat"
                ]
              }
            ],
            "description": "The data of the notification"
          },
          "monitors": {
            "type": "array",
            "nullable": true,
            "items": {
              "type": "number"
            },
            "description": "The monitors that the notification is linked to",
            "example": [
              1,
              2
            ]
          }
        },
        "required": [
          "id",
          "name",
          "provider",
          "payload"
        ]
      },
      "PageSubscriber": {
        "type": "object",
        "properties": {
          "id": {
            "type": "number",
            "description": "The id of the subscriber",
            "example": 1
          },
          "email": {
            "type": "string",
            "format": "email",
            "description": "The email of the subscriber"
          },
          "pageId": {
            "type": "number",
            "description": "The id of the page to subscribe to",
            "example": 1
          }
        },
        "required": [
          "id",
          "email",
          "pageId"
        ]
      },
      "Workspace": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The current workspace name"
          },
          "slug": {
            "type": "string",
            "description": "The current workspace slug"
          },
          "plan": {
            "type": "string",
            "nullable": true,
            "enum": [
              "free",
              "starter",
              "team"
            ],
            "default": "free",
            "description": "The current workspace plan"
          }
        },
        "required": [
          "slug"
        ]
      }
    },
    "parameters": {}
  },
  "paths": {
    "/monitor": {
      "get": {
        "tags": [
          "monitor"
        ],
        "summary": "List all monitors",
        "responses": {
          "200": {
            "description": "All the monitors",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Monitor"
                  }
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "monitor"
        ],
        "summary": "Create a monitor",
        "requestBody": {
          "description": "The monitor to create",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "periodicity": {
                    "type": "string",
                    "enum": [
                      "30s",
                      "1m",
                      "5m",
                      "10m",
                      "30m",
                      "1h",
                      "other"
                    ],
                    "example": "1m",
                    "description": "How often the monitor should run"
                  },
                  "url": {
                    "type": "string",
                    "example": "https://www.documenso.co",
                    "description": "The url to monitor"
                  },
                  "regions": {
                    "type": "array",
                    "nullable": true,
                    "items": {
                      "type": "string",
                      "enum": [
                        "ams",
                        "arn",
                        "atl",
                        "bog",
                        "bom",
                        "bos",
                        "cdg",
                        "den",
                        "dfw",
                        "ewr",
                        "eze",
                        "fra",
                        "gdl",
                        "gig",
                        "gru",
                        "hkg",
                        "iad",
                        "jnb",
                        "lax",
                        "lhr",
                        "mad",
                        "mia",
                        "nrt",
                        "ord",
                        "otp",
                        "phx",
                        "qro",
                        "scl",
                        "sjc",
                        "sea",
                        "sin",
                        "syd",
                        "waw",
                        "yul",
                        "yyz",
                        "koyeb_fra",
                        "koyeb_was",
                        "koyeb_sin",
                        "koyeb_tyo",
                        "koyeb_par",
                        "koyeb_sfo",
                        "railway_europe-west4-drams3a",
                        "railway_us-east4-eqdc4a",
                        "railway_asia-southeast1-eqsg3a",
                        "railway_us-west2"
                      ]
                    },
                    "default": [],
                    "example": [
                      "ams"
                    ],
                    "description": "Where we should monitor it"
                  },
                  "name": {
                    "type": "string",
                    "example": "documenso-web",
                    "description": "The name of the monitor"
                  },
                  "externalName": {
                    "type": "string",
                    "nullable": true,
                    "example": "Documenso",
                    "description": "The external name of the monitor, used to display on the status page or in the external notifications"
                  },
                  "description": {
                    "type": "string",
                    "nullable": true,
                    "example": "Documenso website",
                    "description": "The description of your monitor"
                  },
                  "method": {
                    "type": "string",
                    "enum": [
                      "GET",
                      "POST",
                      "HEAD",
                      "PUT",
                      "PATCH",
                      "DELETE",
                      "TRACE",
                      "CONNECT",
                      "OPTIONS"
                    ],
                    "example": "GET"
                  },
                  "body": {
                    "type": "string",
                    "nullable": true,
                    "default": "",
                    "example": "Hello World",
                    "description": "The body"
                  },
                  "headers": {
                    "type": "array",
                    "nullable": true,
                    "items": {
                      "type": "object",
                      "properties": {
                        "key": {
                          "type": "string"
                        },
                        "value": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "key",
                        "value"
                      ]
                    },
                    "default": [],
                    "description": "The headers of your request",
                    "example": [
                      {
                        "key": "x-apikey",
                        "value": "supersecrettoken"
                      }
                    ]
                  },
                  "assertions": {
                    "type": "array",
                    "nullable": true,
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "enum": [
                                "status"
                              ]
                            },
                            "compare": {
                              "type": "string",
                              "enum": [
                                "eq",
                                "not_eq",
                                "gt",
                                "gte",
                                "lt",
                                "lte"
                              ],
                              "description": "Comparison operator",
                              "examples": [
                                "eq",
                                "not_eq",
                                "gt",
                                "gte",
                                "lt",
                                "lte"
                              ]
                            },
                            "target": {
                              "type": "integer",
                              "minimum": 0,
                              "exclusiveMinimum": true,
                              "description": "The target value"
                            }
                          },
                          "required": [
                            "type",
                            "compare",
                            "target"
                          ],
                          "description": "The status assertion"
                        },
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "enum": [
                                "header"
                              ]
                            },
                            "compare": {
                              "type": "string",
                              "enum": [
                                "contains",
                                "not_contains",
                                "eq",
                                "not_eq",
                                "empty",
                                "not_empty",
                                "gt",
                                "gte",
                                "lt",
                                "lte"
                              ]
                            },
                            "key": {
                              "type": "string",
                              "description": "The key of the header"
                            },
                            "target": {
                              "type": "string",
                              "description": "the header value"
                            }
                          },
                          "required": [
                            "type",
                            "compare",
                            "key",
                            "target"
                          ],
                          "description": "The header assertion"
                        },
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "enum": [
                                "textBody"
                              ]
                            },
                            "compare": {
                              "type": "string",
                              "enum": [
                                "contains",
                                "not_contains",
                                "eq",
                                "not_eq",
                                "empty",
                                "not_empty",
                                "gt",
                                "gte",
                                "lt",
                                "lte"
                              ]
                            },
                            "target": {
                              "type": "string",
                              "description": "The target value"
                            }
                          },
                          "required": [
                            "type",
                            "compare",
                            "target"
                          ],
                          "description": "The text body assertion"
                        },
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "enum": [
                                "dnsRecord"
                              ]
                            },
                            "key": {
                              "type": "string",
                              "enum": [
                                "A",
                                "AAAA",
                                "CNAME",
                                "MX",
                                "TXT",
                                "NS"
                              ]
                            },
                            "compare": {
                              "type": "string",
                              "enum": [
                                "contains",
                                "not_contains",
                                "eq",
                                "not_eq"
                              ]
                            },
                            "target": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "type",
                            "key",
                            "compare",
                            "target"
                          ],
                          "description": "The DNS record assertion"
                        }
                      ]
                    },
                    "default": [],
                    "description": "The assertions to run"
                  },
                  "active": {
                    "type": "boolean",
                    "default": false,
                    "description": "If the monitor is active"
                  },
                  "public": {
                    "type": "boolean",
                    "default": false,
                    "description": "If the monitor is public"
                  },
                  "degradedAfter": {
                    "type": "number",
                    "nullable": true,
                    "description": "The time after the monitor is considered degraded in milliseconds"
                  },
                  "timeout": {
                    "type": "number",
                    "nullable": true,
                    "default": 45000,
                    "description": "The timeout of the request in milliseconds"
                  },
                  "retry": {
                    "type": "number",
                    "default": 3,
                    "description": "The number of retries to attempt"
                  },
                  "followRedirects": {
                    "type": "boolean",
                    "default": true,
                    "description": "If the monitor should follow redirects"
                  },
                  "jobType": {
                    "type": "string",
                    "enum": [
                      "http",
                      "tcp",
                      "icmp",
                      "udp",
                      "dns",
                      "ssl"
                    ],
                    "default": "http",
                    "description": "The type of the monitor"
                  },
                  "openTelemetry": {
                    "type": "object",
                    "properties": {
                      "endpoint": {
                        "type": "string",
                        "format": "uri",
                        "default": "http://localhost:4317",
                        "description": "The endpoint of the OpenTelemetry collector"
                      },
                      "headers": {
                        "type": "object",
                        "additionalProperties": {
                          "type": "string"
                        },
                        "default": {},
                        "description": "The headers to send to the OpenTelemetry collector"
                      }
                    },
                    "description": "The OpenTelemetry configuration"
                  }
                },
                "required": [
                  "periodicity",
                  "url",
                  "name",
                  "method"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Create a monitor",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Monitor"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/monitor/{id}": {
      "get": {
        "tags": [
          "monitor"
        ],
        "summary": "Get a monitor",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the monitor",
              "example": "1"
            },
            "required": true,
            "description": "The id of the monitor",
            "name": "id",
            "in": "path"
          }
        ],
        "responses": {
          "200": {
            "description": "The monitor",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Monitor"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "monitor"
        ],
        "summary": "Update a monitor",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the monitor",
              "example": "1"
            },
            "required": true,
            "description": "The id of the monitor",
            "name": "id",
            "in": "path"
          }
        ],
        "requestBody": {
          "description": "The monitor to update",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "periodicity": {
                    "type": "string",
                    "enum": [
                      "30s",
                      "1m",
                      "5m",
                      "10m",
                      "30m",
                      "1h",
                      "other"
                    ],
                    "example": "1m",
                    "description": "How often the monitor should run"
                  },
                  "url": {
                    "type": "string",
                    "example": "https://www.documenso.co",
                    "description": "The url to monitor"
                  },
                  "regions": {
                    "type": "array",
                    "nullable": true,
                    "items": {
                      "type": "string",
                      "enum": [
                        "ams",
                        "arn",
                        "atl",
                        "bog",
                        "bom",
                        "bos",
                        "cdg",
                        "den",
                        "dfw",
                        "ewr",
                        "eze",
                        "fra",
                        "gdl",
                        "gig",
                        "gru",
                        "hkg",
                        "iad",
                        "jnb",
                        "lax",
                        "lhr",
                        "mad",
                        "mia",
                        "nrt",
                        "ord",
                        "otp",
                        "phx",
                        "qro",
                        "scl",
                        "sjc",
                        "sea",
                        "sin",
                        "syd",
                        "waw",
                        "yul",
                        "yyz",
                        "koyeb_fra",
                        "koyeb_was",
                        "koyeb_sin",
                        "koyeb_tyo",
                        "koyeb_par",
                        "koyeb_sfo",
                        "railway_europe-west4-drams3a",
                        "railway_us-east4-eqdc4a",
                        "railway_asia-southeast1-eqsg3a",
                        "railway_us-west2"
                      ]
                    },
                    "default": [],
                    "example": [
                      "ams"
                    ],
                    "description": "Where we should monitor it"
                  },
                  "name": {
                    "type": "string",
                    "example": "documenso-web",
                    "description": "The name of the monitor"
                  },
                  "externalName": {
                    "type": "string",
                    "nullable": true,
                    "example": "Documenso",
                    "description": "The external name of the monitor, used to display on the status page or in the external notifications"
                  },
                  "description": {
                    "type": "string",
                    "nullable": true,
                    "example": "Documenso website",
                    "description": "The description of your monitor"
                  },
                  "method": {
                    "type": "string",
                    "enum": [
                      "GET",
                      "POST",
                      "HEAD",
                      "PUT",
                      "PATCH",
                      "DELETE",
                      "TRACE",
                      "CONNECT",
                      "OPTIONS"
                    ],
                    "example": "GET"
                  },
                  "body": {
                    "type": "string",
                    "nullable": true,
                    "default": "",
                    "example": "Hello World",
                    "description": "The body"
                  },
                  "headers": {
                    "type": "array",
                    "nullable": true,
                    "items": {
                      "type": "object",
                      "properties": {
                        "key": {
                          "type": "string"
                        },
                        "value": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "key",
                        "value"
                      ]
                    },
                    "default": [],
                    "description": "The headers of your request",
                    "example": [
                      {
                        "key": "x-apikey",
                        "value": "supersecrettoken"
                      }
                    ]
                  },
                  "assertions": {
                    "type": "array",
                    "nullable": true,
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "enum": [
                                "status"
                              ]
                            },
                            "compare": {
                              "type": "string",
                              "enum": [
                                "eq",
                                "not_eq",
                                "gt",
                                "gte",
                                "lt",
                                "lte"
                              ],
                              "description": "Comparison operator",
                              "examples": [
                                "eq",
                                "not_eq",
                                "gt",
                                "gte",
                                "lt",
                                "lte"
                              ]
                            },
                            "target": {
                              "type": "integer",
                              "minimum": 0,
                              "exclusiveMinimum": true,
                              "description": "The target value"
                            }
                          },
                          "required": [
                            "type",
                            "compare",
                            "target"
                          ],
                          "description": "The status assertion"
                        },
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "enum": [
                                "header"
                              ]
                            },
                            "compare": {
                              "type": "string",
                              "enum": [
                                "contains",
                                "not_contains",
                                "eq",
                                "not_eq",
                                "empty",
                                "not_empty",
                                "gt",
                                "gte",
                                "lt",
                                "lte"
                              ]
                            },
                            "key": {
                              "type": "string",
                              "description": "The key of the header"
                            },
                            "target": {
                              "type": "string",
                              "description": "the header value"
                            }
                          },
                          "required": [
                            "type",
                            "compare",
                            "key",
                            "target"
                          ],
                          "description": "The header assertion"
                        },
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "enum": [
                                "textBody"
                              ]
                            },
                            "compare": {
                              "type": "string",
                              "enum": [
                                "contains",
                                "not_contains",
                                "eq",
                                "not_eq",
                                "empty",
                                "not_empty",
                                "gt",
                                "gte",
                                "lt",
                                "lte"
                              ]
                            },
                            "target": {
                              "type": "string",
                              "description": "The target value"
                            }
                          },
                          "required": [
                            "type",
                            "compare",
                            "target"
                          ],
                          "description": "The text body assertion"
                        },
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "enum": [
                                "dnsRecord"
                              ]
                            },
                            "key": {
                              "type": "string",
                              "enum": [
                                "A",
                                "AAAA",
                                "CNAME",
                                "MX",
                                "TXT",
                                "NS"
                              ]
                            },
                            "compare": {
                              "type": "string",
                              "enum": [
                                "contains",
                                "not_contains",
                                "eq",
                                "not_eq"
                              ]
                            },
                            "target": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "type",
                            "key",
                            "compare",
                            "target"
                          ],
                          "description": "The DNS record assertion"
                        }
                      ]
                    },
                    "default": [],
                    "description": "The assertions to run"
                  },
                  "active": {
                    "type": "boolean",
                    "default": false,
                    "description": "If the monitor is active"
                  },
                  "public": {
                    "type": "boolean",
                    "default": false,
                    "description": "If the monitor is public"
                  },
                  "degradedAfter": {
                    "type": "number",
                    "nullable": true,
                    "description": "The time after the monitor is considered degraded in milliseconds"
                  },
                  "timeout": {
                    "type": "number",
                    "nullable": true,
                    "default": 45000,
                    "description": "The timeout of the request in milliseconds"
                  },
                  "retry": {
                    "type": "number",
                    "default": 3,
                    "description": "The number of retries to attempt"
                  },
                  "followRedirects": {
                    "type": "boolean",
                    "default": true,
                    "description": "If the monitor should follow redirects"
                  },
                  "jobType": {
                    "type": "string",
                    "enum": [
                      "http",
                      "tcp",
                      "icmp",
                      "udp",
                      "dns",
                      "ssl"
                    ],
                    "default": "http",
                    "description": "The type of the monitor"
                  },
                  "openTelemetry": {
                    "type": "object",
                    "properties": {
                      "endpoint": {
                        "type": "string",
                        "format": "uri",
                        "default": "http://localhost:4317",
                        "description": "The endpoint of the OpenTelemetry collector"
                      },
                      "headers": {
                        "type": "object",
                        "additionalProperties": {
                          "type": "string"
                        },
                        "default": {},
                        "description": "The headers to send to the OpenTelemetry collector"
                      }
                    },
                    "description": "The OpenTelemetry configuration"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Update a monitor",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Monitor"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "monitor"
        ],
        "summary": "Delete a monitor",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the monitor",
              "example": "1"
            },
            "required": true,
            "description": "The id of the monitor",
            "name": "id",
            "in": "path"
          }
        ],
        "responses": {
          "200": {
            "description": "The monitor was successfully deleted",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {}
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/monitor/http": {
      "post": {
        "tags": [
          "monitor"
        ],
        "summary": "Create a  http monitor",
        "requestBody": {
          "description": "The monitor to create",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Name of the monitor"
                  },
                  "description": {
                    "type": "string"
                  },
                  "retry": {
                    "type": "number",
                    "maximum": 10,
                    "minimum": 1,
                    "default": 3,
                    "description": "Number of retries to attempt",
                    "examples": [
                      1,
                      3,
                      5
                    ]
                  },
                  "degradedAfter": {
                    "type": "number",
                    "minimum": 0,
                    "default": 30000,
                    "description": "Time in milliseconds to wait before marking the request as degraded",
                    "examples": [
                      30000
                    ]
                  },
                  "timeout": {
                    "type": "number",
                    "minimum": 0,
                    "default": 45000,
                    "description": "Time in milliseconds to wait before marking the request as timed out",
                    "examples": [
                      45000
                    ]
                  },
                  "frequency": {
                    "type": "string",
                    "enum": [
                      "30s",
                      "1m",
                      "5m",
                      "10m",
                      "30m",
                      "1h"
                    ]
                  },
                  "active": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the monitor is active"
                  },
                  "public": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the monitor is public"
                  },
                  "regions": {
                    "type": "array",
                    "nullable": true,
                    "items": {
                      "type": "string",
                      "enum": [
                        "ams",
                        "arn",
                        "atl",
                        "bog",
                        "bom",
                        "bos",
                        "cdg",
                        "den",
                        "dfw",
                        "ewr",
                        "eze",
                        "fra",
                        "gdl",
                        "gig",
                        "gru",
                        "hkg",
                        "iad",
                        "jnb",
                        "lax",
                        "lhr",
                        "mad",
                        "mia",
                        "nrt",
                        "ord",
                        "otp",
                        "phx",
                        "qro",
                        "scl",
                        "sjc",
                        "sea",
                        "sin",
                        "syd",
                        "waw",
                        "yul",
                        "yyz",
                        "koyeb_fra",
                        "koyeb_was",
                        "koyeb_sin",
                        "koyeb_tyo",
                        "koyeb_par",
                        "koyeb_sfo",
                        "railway_europe-west4-drams3a",
                        "railway_us-east4-eqdc4a",
                        "railway_asia-southeast1-eqsg3a",
                        "railway_us-west2"
                      ]
                    },
                    "default": [],
                    "example": [
                      "ams"
                    ],
                    "description": "Where we should monitor it"
                  },
                  "openTelemetry": {
                    "type": "object",
                    "nullable": true,
                    "properties": {
                      "endpoint": {
                        "type": "string",
                        "format": "uri",
                        "description": "OTEL endpoint to send metrics to",
                        "examples": [
                          "https://otel.example.com"
                        ]
                      },
                      "headers": {
                        "type": "object",
                        "additionalProperties": {
                          "type": "string"
                        },
                        "description": "Headers to send with the OTEL request",
                        "examples": [
                          {
                            "Content-Type": "application/json"
                          }
                        ]
                      }
                    }
                  },
                  "assertions": {
                    "type": "array",
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "kind": {
                              "type": "string",
                              "enum": [
                                "statusCode"
                              ]
                            },
                            "compare": {
                              "type": "string",
                              "enum": [
                                "eq",
                                "not_eq",
                                "gt",
                                "gte",
                                "lt",
                                "lte"
                              ],
                              "description": "Comparison operator",
                              "examples": [
                                "eq",
                                "not_eq",
                                "gt",
                                "gte",
                                "lt",
                                "lte"
                              ]
                            },
                            "target": {
                              "type": "number",
                              "description": "Status code to assert",
                              "examples": [
                                200,
                                404,
                                418,
                                500
                              ]
                            }
                          },
                          "required": [
                            "kind",
                            "compare",
                            "target"
                          ],
                          "examples": [
                            {
                              "kind": "statusCode",
                              "compare": "eq",
                              "target": 200
                            },
                            {
                              "kind": "statusCode",
                              "compare": "not_eq",
                              "target": 404
                            },
                            {
                              "kind": "statusCode",
                              "compare": "gt",
                              "target": 300
                            }
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "kind": {
                              "type": "string",
                              "enum": [
                                "header"
                              ]
                            },
                            "compare": {
                              "type": "string",
                              "enum": [
                                "contains",
                                "not_contains",
                                "eq",
                                "not_eq",
                                "empty",
                                "not_empty",
                                "gt",
                                "gte",
                                "lt",
                                "lte"
                              ],
                              "description": "Comparison operator",
                              "examples": [
                                "eq",
                                "not_eq",
                                "contains",
                                "not_contains"
                              ]
                            },
                            "key": {
                              "type": "string",
                              "description": "Header key to assert",
                              "examples": [
                                "Content-Type",
                                "X-Request-ID"
                              ]
                            },
                            "target": {
                              "type": "string",
                              "description": "Header value to assert",
                              "examples": [
                                "application/json",
                                "text/html"
                              ]
                            }
                          },
                          "required": [
                            "kind",
                            "compare",
                            "key",
                            "target"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "kind": {
                              "type": "string",
                              "enum": [
                                "textBody"
                              ]
                            },
                            "compare": {
                              "type": "string",
                              "enum": [
                                "contains",
                                "not_contains",
                                "eq",
                                "not_eq",
                                "empty",
                                "not_empty",
                                "gt",
                                "gte",
                                "lt",
                                "lte"
                              ],
                              "description": "Comparison operator",
                              "examples": [
                                "eq",
                                "not_eq",
                                "contains",
                                "not_contains"
                              ]
                            },
                            "target": {
                              "type": "string",
                              "description": "Text body to assert",
                              "examples": [
                                "Hello, world!",
                                "404 Not Found"
                              ]
                            }
                          },
                          "required": [
                            "kind",
                            "compare",
                            "target"
                          ]
                        }
                      ]
                    },
                    "description": "Assertions to run on the response"
                  },
                  "request": {
                    "type": "object",
                    "properties": {
                      "method": {
                        "type": "string",
                        "enum": [
                          "GET",
                          "POST",
                          "HEAD",
                          "PUT",
                          "PATCH",
                          "DELETE",
                          "TRACE",
                          "CONNECT",
                          "OPTIONS"
                        ]
                      },
                      "url": {
                        "type": "string",
                        "format": "uri",
                        "description": "URL to request",
                        "examples": [
                          "https://openstat.us",
                          "https://www.openstatus.dev"
                        ]
                      },
                      "headers": {
                        "type": "object",
                        "additionalProperties": {
                          "type": "string"
                        },
                        "description": "Headers to send with the request",
                        "examples": [
                          {
                            "Content-Type": "application/json"
                          }
                        ]
                      },
                      "body": {
                        "type": "string",
                        "description": "Body to send with the request",
                        "examples": [
                          "{ \"key\": \"value\" }",
                          "Hello World"
                        ]
                      }
                    },
                    "required": [
                      "method",
                      "url"
                    ],
                    "description": "The HTTP Request we are sending"
                  }
                },
                "required": [
                  "name",
                  "frequency",
                  "request"
                ],
                "title": "HTTP Monitor Schema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Create a monitor",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Monitor"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/monitor/tcp": {
      "post": {
        "tags": [
          "monitor"
        ],
        "summary": "Create a  tcp monitor",
        "requestBody": {
          "description": "The monitor to create",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Name of the monitor"
                  },
                  "description": {
                    "type": "string"
                  },
                  "retry": {
                    "type": "number",
                    "maximum": 10,
                    "minimum": 1,
                    "default": 3,
                    "description": "Number of retries to attempt",
                    "examples": [
                      1,
                      3,
                      5
                    ]
                  },
                  "degradedAfter": {
                    "type": "number",
                    "minimum": 0,
                    "default": 30000,
                    "description": "Time in milliseconds to wait before marking the request as degraded",
                    "examples": [
                      30000
                    ]
                  },
                  "timeout": {
                    "type": "number",
                    "minimum": 0,
                    "default": 45000,
                    "description": "Time in milliseconds to wait before marking the request as timed out",
                    "examples": [
                      45000
                    ]
                  },
                  "frequency": {
                    "type": "string",
                    "enum": [
                      "30s",
                      "1m",
                      "5m",
                      "10m",
                      "30m",
                      "1h"
                    ]
                  },
                  "active": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the monitor is active"
                  },
                  "public": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the monitor is public"
                  },
                  "regions": {
                    "type": "array",
                    "nullable": true,
                    "items": {
                      "type": "string",
                      "enum": [
                        "ams",
                        "arn",
                        "atl",
                        "bog",
                        "bom",
                        "bos",
                        "cdg",
                        "den",
                        "dfw",
                        "ewr",
                        "eze",
                        "fra",
                        "gdl",
                        "gig",
                        "gru",
                        "hkg",
                        "iad",
                        "jnb",
                        "lax",
                        "lhr",
                        "mad",
                        "mia",
                        "nrt",
                        "ord",
                        "otp",
                        "phx",
                        "qro",
                        "scl",
                        "sjc",
                        "sea",
                        "sin",
                        "syd",
                        "waw",
                        "yul",
                        "yyz",
                        "koyeb_fra",
                        "koyeb_was",
                        "koyeb_sin",
                        "koyeb_tyo",
                        "koyeb_par",
                        "koyeb_sfo",
                        "railway_europe-west4-drams3a",
                        "railway_us-east4-eqdc4a",
                        "railway_asia-southeast1-eqsg3a",
                        "railway_us-west2"
                      ]
                    },
                    "default": [],
                    "example": [
                      "ams"
                    ],
                    "description": "Where we should monitor it"
                  },
                  "openTelemetry": {
                    "type": "object",
                    "nullable": true,
                    "properties": {
                      "endpoint": {
                        "type": "string",
                        "format": "uri",
                        "description": "OTEL endpoint to send metrics to",
                        "examples": [
                          "https://otel.example.com"
                        ]
                      },
                      "headers": {
                        "type": "object",
                        "additionalProperties": {
                          "type": "string"
                        },
                        "description": "Headers to send with the OTEL request",
                        "examples": [
                          {
                            "Content-Type": "application/json"
                          }
                        ]
                      }
                    }
                  },
                  "request": {
                    "type": "object",
                    "properties": {
                      "host": {
                        "type": "string",
                        "minLength": 1,
                        "examples": [
                          "example.com",
                          "localhost"
                        ],
                        "description": "Host to connect to"
                      },
                      "port": {
                        "type": "number",
                        "description": "Port to connect to",
                        "examples": [
                          80,
                          443,
                          1337
                        ]
                      }
                    },
                    "required": [
                      "host",
                      "port"
                    ],
                    "description": "The TCP Request we are sending"
                  }
                },
                "required": [
                  "name",
                  "frequency",
                  "request"
                ],
                "title": "TCP Monitor Schema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Create a monitor",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Monitor"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/monitor/dns": {
      "post": {
        "tags": [
          "monitor"
        ],
        "summary": "Create a  dns monitor",
        "requestBody": {
          "description": "The monitor to create",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Name of the monitor"
                  },
                  "description": {
                    "type": "string"
                  },
                  "retry": {
                    "type": "number",
                    "maximum": 10,
                    "minimum": 1,
                    "default": 3,
                    "description": "Number of retries to attempt",
                    "examples": [
                      1,
                      3,
                      5
                    ]
                  },
                  "degradedAfter": {
                    "type": "number",
                    "minimum": 0,
                    "default": 30000,
                    "description": "Time in milliseconds to wait before marking the request as degraded",
                    "examples": [
                      30000
                    ]
                  },
                  "timeout": {
                    "type": "number",
                    "minimum": 0,
                    "default": 45000,
                    "description": "Time in milliseconds to wait before marking the request as timed out",
                    "examples": [
                      45000
                    ]
                  },
                  "frequency": {
                    "type": "string",
                    "enum": [
                      "30s",
                      "1m",
                      "5m",
                      "10m",
                      "30m",
                      "1h"
                    ]
                  },
                  "active": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the monitor is active"
                  },
                  "public": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the monitor is public"
                  },
                  "regions": {
                    "type": "array",
                    "nullable": true,
                    "items": {
                      "type": "string",
                      "enum": [
                        "ams",
                        "arn",
                        "atl",
                        "bog",
                        "bom",
                        "bos",
                        "cdg",
                        "den",
                        "dfw",
                        "ewr",
                        "eze",
                        "fra",
                        "gdl",
                        "gig",
                        "gru",
                        "hkg",
                        "iad",
                        "jnb",
                        "lax",
                        "lhr",
                        "mad",
                        "mia",
                        "nrt",
                        "ord",
                        "otp",
                        "phx",
                        "qro",
                        "scl",
                        "sjc",
                        "sea",
                        "sin",
                        "syd",
                        "waw",
                        "yul",
                        "yyz",
                        "koyeb_fra",
                        "koyeb_was",
                        "koyeb_sin",
                        "koyeb_tyo",
                        "koyeb_par",
                        "koyeb_sfo",
                        "railway_europe-west4-drams3a",
                        "railway_us-east4-eqdc4a",
                        "railway_asia-southeast1-eqsg3a",
                        "railway_us-west2"
                      ]
                    },
                    "default": [],
                    "example": [
                      "ams"
                    ],
                    "description": "Where we should monitor it"
                  },
                  "openTelemetry": {
                    "type": "object",
                    "nullable": true,
                    "properties": {
                      "endpoint": {
                        "type": "string",
                        "format": "uri",
                        "description": "OTEL endpoint to send metrics to",
                        "examples": [
                          "https://otel.example.com"
                        ]
                      },
                      "headers": {
                        "type": "object",
                        "additionalProperties": {
                          "type": "string"
                        },
                        "description": "Headers to send with the OTEL request",
                        "examples": [
                          {
                            "Content-Type": "application/json"
                          }
                        ]
                      }
                    }
                  },
                  "request": {
                    "type": "object",
                    "properties": {
                      "uri": {
                        "type": "string",
                        "description": "The DNS server to query",
                        "examples": [
                          "openstatus.dev"
                        ]
                      }
                    },
                    "required": [
                      "uri"
                    ],
                    "description": "The DNS Request we are sending"
                  },
                  "assertions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "enum": [
                            "dnsRecord"
                          ]
                        },
                        "recordType": {
                          "type": "string",
                          "enum": [
                            "A",
                            "AAAA",
                            "CNAME",
                            "MX",
                            "TXT"
                          ],
                          "description": "Type of DNS record to check",
                          "examples": [
                            "A",
                            "CNAME"
                          ]
                        },
                        "compare": {
                          "type": "string",
                          "enum": [
                            "contains",
                            "not_contains",
                            "eq",
                            "not_eq"
                          ],
                          "description": "Comparison operator",
                          "examples": [
                            "eq",
                            "not_eq",
                            "contains",
                            "not_contains"
                          ]
                        },
                        "target": {
                          "type": "string",
                          "description": "DNS record value to assert",
                          "examples": [
                            "example.com"
                          ]
                        }
                      },
                      "required": [
                        "kind",
                        "recordType",
                        "compare",
                        "target"
                      ]
                    },
                    "description": "Assertions to run on the DNS response"
                  }
                },
                "required": [
                  "name",
                  "frequency",
                  "request"
                ],
                "title": "DNS Monitor Schema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Create a monitor",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Monitor"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/monitor/http/{id}": {
      "put": {
        "tags": [
          "monitor"
        ],
        "summary": "Update an HTTP monitor",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the monitor",
              "example": "1"
            },
            "required": true,
            "description": "The id of the monitor",
            "name": "id",
            "in": "path"
          }
        ],
        "requestBody": {
          "description": "The monitor to update",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Name of the monitor"
                  },
                  "description": {
                    "type": "string"
                  },
                  "retry": {
                    "type": "number",
                    "maximum": 10,
                    "minimum": 1,
                    "default": 3,
                    "description": "Number of retries to attempt",
                    "examples": [
                      1,
                      3,
                      5
                    ]
                  },
                  "degradedAfter": {
                    "type": "number",
                    "minimum": 0,
                    "default": 30000,
                    "description": "Time in milliseconds to wait before marking the request as degraded",
                    "examples": [
                      30000
                    ]
                  },
                  "timeout": {
                    "type": "number",
                    "minimum": 0,
                    "default": 45000,
                    "description": "Time in milliseconds to wait before marking the request as timed out",
                    "examples": [
                      45000
                    ]
                  },
                  "frequency": {
                    "type": "string",
                    "enum": [
                      "30s",
                      "1m",
                      "5m",
                      "10m",
                      "30m",
                      "1h"
                    ]
                  },
                  "active": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the monitor is active"
                  },
                  "public": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the monitor is public"
                  },
                  "regions": {
                    "type": "array",
                    "nullable": true,
                    "items": {
                      "type": "string",
                      "enum": [
                        "ams",
                        "arn",
                        "atl",
                        "bog",
                        "bom",
                        "bos",
                        "cdg",
                        "den",
                        "dfw",
                        "ewr",
                        "eze",
                        "fra",
                        "gdl",
                        "gig",
                        "gru",
                        "hkg",
                        "iad",
                        "jnb",
                        "lax",
                        "lhr",
                        "mad",
                        "mia",
                        "nrt",
                        "ord",
                        "otp",
                        "phx",
                        "qro",
                        "scl",
                        "sjc",
                        "sea",
                        "sin",
                        "syd",
                        "waw",
                        "yul",
                        "yyz",
                        "koyeb_fra",
                        "koyeb_was",
                        "koyeb_sin",
                        "koyeb_tyo",
                        "koyeb_par",
                        "koyeb_sfo",
                        "railway_europe-west4-drams3a",
                        "railway_us-east4-eqdc4a",
                        "railway_asia-southeast1-eqsg3a",
                        "railway_us-west2"
                      ]
                    },
                    "default": [],
                    "example": [
                      "ams"
                    ],
                    "description": "Where we should monitor it"
                  },
                  "openTelemetry": {
                    "type": "object",
                    "nullable": true,
                    "properties": {
                      "endpoint": {
                        "type": "string",
                        "format": "uri",
                        "description": "OTEL endpoint to send metrics to",
                        "examples": [
                          "https://otel.example.com"
                        ]
                      },
                      "headers": {
                        "type": "object",
                        "additionalProperties": {
                          "type": "string"
                        },
                        "description": "Headers to send with the OTEL request",
                        "examples": [
                          {
                            "Content-Type": "application/json"
                          }
                        ]
                      }
                    }
                  },
                  "assertions": {
                    "type": "array",
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "kind": {
                              "type": "string",
                              "enum": [
                                "statusCode"
                              ]
                            },
                            "compare": {
                              "type": "string",
                              "enum": [
                                "eq",
                                "not_eq",
                                "gt",
                                "gte",
                                "lt",
                                "lte"
                              ],
                              "description": "Comparison operator",
                              "examples": [
                                "eq",
                                "not_eq",
                                "gt",
                                "gte",
                                "lt",
                                "lte"
                              ]
                            },
                            "target": {
                              "type": "number",
                              "description": "Status code to assert",
                              "examples": [
                                200,
                                404,
                                418,
                                500
                              ]
                            }
                          },
                          "required": [
                            "kind",
                            "compare",
                            "target"
                          ],
                          "examples": [
                            {
                              "kind": "statusCode",
                              "compare": "eq",
                              "target": 200
                            },
                            {
                              "kind": "statusCode",
                              "compare": "not_eq",
                              "target": 404
                            },
                            {
                              "kind": "statusCode",
                              "compare": "gt",
                              "target": 300
                            }
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "kind": {
                              "type": "string",
                              "enum": [
                                "header"
                              ]
                            },
                            "compare": {
                              "type": "string",
                              "enum": [
                                "contains",
                                "not_contains",
                                "eq",
                                "not_eq",
                                "empty",
                                "not_empty",
                                "gt",
                                "gte",
                                "lt",
                                "lte"
                              ],
                              "description": "Comparison operator",
                              "examples": [
                                "eq",
                                "not_eq",
                                "contains",
                                "not_contains"
                              ]
                            },
                            "key": {
                              "type": "string",
                              "description": "Header key to assert",
                              "examples": [
                                "Content-Type",
                                "X-Request-ID"
                              ]
                            },
                            "target": {
                              "type": "string",
                              "description": "Header value to assert",
                              "examples": [
                                "application/json",
                                "text/html"
                              ]
                            }
                          },
                          "required": [
                            "kind",
                            "compare",
                            "key",
                            "target"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "kind": {
                              "type": "string",
                              "enum": [
                                "textBody"
                              ]
                            },
                            "compare": {
                              "type": "string",
                              "enum": [
                                "contains",
                                "not_contains",
                                "eq",
                                "not_eq",
                                "empty",
                                "not_empty",
                                "gt",
                                "gte",
                                "lt",
                                "lte"
                              ],
                              "description": "Comparison operator",
                              "examples": [
                                "eq",
                                "not_eq",
                                "contains",
                                "not_contains"
                              ]
                            },
                            "target": {
                              "type": "string",
                              "description": "Text body to assert",
                              "examples": [
                                "Hello, world!",
                                "404 Not Found"
                              ]
                            }
                          },
                          "required": [
                            "kind",
                            "compare",
                            "target"
                          ]
                        }
                      ]
                    },
                    "description": "Assertions to run on the response"
                  },
                  "request": {
                    "type": "object",
                    "properties": {
                      "method": {
                        "type": "string",
                        "enum": [
                          "GET",
                          "POST",
                          "HEAD",
                          "PUT",
                          "PATCH",
                          "DELETE",
                          "TRACE",
                          "CONNECT",
                          "OPTIONS"
                        ]
                      },
                      "url": {
                        "type": "string",
                        "format": "uri",
                        "description": "URL to request",
                        "examples": [
                          "https://openstat.us",
                          "https://www.openstatus.dev"
                        ]
                      },
                      "headers": {
                        "type": "object",
                        "additionalProperties": {
                          "type": "string"
                        },
                        "description": "Headers to send with the request",
                        "examples": [
                          {
                            "Content-Type": "application/json"
                          }
                        ]
                      },
                      "body": {
                        "type": "string",
                        "description": "Body to send with the request",
                        "examples": [
                          "{ \"key\": \"value\" }",
                          "Hello World"
                        ]
                      }
                    },
                    "required": [
                      "method",
                      "url"
                    ],
                    "description": "The HTTP Request we are sending"
                  }
                },
                "required": [
                  "name",
                  "frequency",
                  "request"
                ],
                "title": "HTTP Monitor Schema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Update a monitor",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Monitor"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/monitor/tcp/{id}": {
      "put": {
        "tags": [
          "monitor"
        ],
        "summary": "Update an TCP monitor",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the monitor",
              "example": "1"
            },
            "required": true,
            "description": "The id of the monitor",
            "name": "id",
            "in": "path"
          }
        ],
        "requestBody": {
          "description": "The monitor to update",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Name of the monitor"
                  },
                  "description": {
                    "type": "string"
                  },
                  "retry": {
                    "type": "number",
                    "maximum": 10,
                    "minimum": 1,
                    "default": 3,
                    "description": "Number of retries to attempt",
                    "examples": [
                      1,
                      3,
                      5
                    ]
                  },
                  "degradedAfter": {
                    "type": "number",
                    "minimum": 0,
                    "default": 30000,
                    "description": "Time in milliseconds to wait before marking the request as degraded",
                    "examples": [
                      30000
                    ]
                  },
                  "timeout": {
                    "type": "number",
                    "minimum": 0,
                    "default": 45000,
                    "description": "Time in milliseconds to wait before marking the request as timed out",
                    "examples": [
                      45000
                    ]
                  },
                  "frequency": {
                    "type": "string",
                    "enum": [
                      "30s",
                      "1m",
                      "5m",
                      "10m",
                      "30m",
                      "1h"
                    ]
                  },
                  "active": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the monitor is active"
                  },
                  "public": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the monitor is public"
                  },
                  "regions": {
                    "type": "array",
                    "nullable": true,
                    "items": {
                      "type": "string",
                      "enum": [
                        "ams",
                        "arn",
                        "atl",
                        "bog",
                        "bom",
                        "bos",
                        "cdg",
                        "den",
                        "dfw",
                        "ewr",
                        "eze",
                        "fra",
                        "gdl",
                        "gig",
                        "gru",
                        "hkg",
                        "iad",
                        "jnb",
                        "lax",
                        "lhr",
                        "mad",
                        "mia",
                        "nrt",
                        "ord",
                        "otp",
                        "phx",
                        "qro",
                        "scl",
                        "sjc",
                        "sea",
                        "sin",
                        "syd",
                        "waw",
                        "yul",
                        "yyz",
                        "koyeb_fra",
                        "koyeb_was",
                        "koyeb_sin",
                        "koyeb_tyo",
                        "koyeb_par",
                        "koyeb_sfo",
                        "railway_europe-west4-drams3a",
                        "railway_us-east4-eqdc4a",
                        "railway_asia-southeast1-eqsg3a",
                        "railway_us-west2"
                      ]
                    },
                    "default": [],
                    "example": [
                      "ams"
                    ],
                    "description": "Where we should monitor it"
                  },
                  "openTelemetry": {
                    "type": "object",
                    "nullable": true,
                    "properties": {
                      "endpoint": {
                        "type": "string",
                        "format": "uri",
                        "description": "OTEL endpoint to send metrics to",
                        "examples": [
                          "https://otel.example.com"
                        ]
                      },
                      "headers": {
                        "type": "object",
                        "additionalProperties": {
                          "type": "string"
                        },
                        "description": "Headers to send with the OTEL request",
                        "examples": [
                          {
                            "Content-Type": "application/json"
                          }
                        ]
                      }
                    }
                  },
                  "request": {
                    "type": "object",
                    "properties": {
                      "host": {
                        "type": "string",
                        "minLength": 1,
                        "examples": [
                          "example.com",
                          "localhost"
                        ],
                        "description": "Host to connect to"
                      },
                      "port": {
                        "type": "number",
                        "description": "Port to connect to",
                        "examples": [
                          80,
                          443,
                          1337
                        ]
                      }
                    },
                    "required": [
                      "host",
                      "port"
                    ],
                    "description": "The TCP Request we are sending"
                  }
                },
                "required": [
                  "name",
                  "frequency",
                  "request"
                ],
                "title": "TCP Monitor Schema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Update a monitor",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Monitor"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/monitor/dns/{id}": {
      "put": {
        "tags": [
          "monitor"
        ],
        "summary": "Update an DNS monitor",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the monitor",
              "example": "1"
            },
            "required": true,
            "description": "The id of the monitor",
            "name": "id",
            "in": "path"
          }
        ],
        "requestBody": {
          "description": "The monitor to update",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Name of the monitor"
                  },
                  "description": {
                    "type": "string"
                  },
                  "retry": {
                    "type": "number",
                    "maximum": 10,
                    "minimum": 1,
                    "default": 3,
                    "description": "Number of retries to attempt",
                    "examples": [
                      1,
                      3,
                      5
                    ]
                  },
                  "degradedAfter": {
                    "type": "number",
                    "minimum": 0,
                    "default": 30000,
                    "description": "Time in milliseconds to wait before marking the request as degraded",
                    "examples": [
                      30000
                    ]
                  },
                  "timeout": {
                    "type": "number",
                    "minimum": 0,
                    "default": 45000,
                    "description": "Time in milliseconds to wait before marking the request as timed out",
                    "examples": [
                      45000
                    ]
                  },
                  "frequency": {
                    "type": "string",
                    "enum": [
                      "30s",
                      "1m",
                      "5m",
                      "10m",
                      "30m",
                      "1h"
                    ]
                  },
                  "active": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the monitor is active"
                  },
                  "public": {
                    "type": "boolean",
                    "default": false,
                    "description": "Whether the monitor is public"
                  },
                  "regions": {
                    "type": "array",
                    "nullable": true,
                    "items": {
                      "type": "string",
                      "enum": [
                        "ams",
                        "arn",
                        "atl",
                        "bog",
                        "bom",
                        "bos",
                        "cdg",
                        "den",
                        "dfw",
                        "ewr",
                        "eze",
                        "fra",
                        "gdl",
                        "gig",
                        "gru",
                        "hkg",
                        "iad",
                        "jnb",
                        "lax",
                        "lhr",
                        "mad",
                        "mia",
                        "nrt",
                        "ord",
                        "otp",
                        "phx",
                        "qro",
                        "scl",
                        "sjc",
                        "sea",
                        "sin",
                        "syd",
                        "waw",
                        "yul",
                        "yyz",
                        "koyeb_fra",
                        "koyeb_was",
                        "koyeb_sin",
                        "koyeb_tyo",
                        "koyeb_par",
                        "koyeb_sfo",
                        "railway_europe-west4-drams3a",
                        "railway_us-east4-eqdc4a",
                        "railway_asia-southeast1-eqsg3a",
                        "railway_us-west2"
                      ]
                    },
                    "default": [],
                    "example": [
                      "ams"
                    ],
                    "description": "Where we should monitor it"
                  },
                  "openTelemetry": {
                    "type": "object",
                    "nullable": true,
                    "properties": {
                      "endpoint": {
                        "type": "string",
                        "format": "uri",
                        "description": "OTEL endpoint to send metrics to",
                        "examples": [
                          "https://otel.example.com"
                        ]
                      },
                      "headers": {
                        "type": "object",
                        "additionalProperties": {
                          "type": "string"
                        },
                        "description": "Headers to send with the OTEL request",
                        "examples": [
                          {
                            "Content-Type": "application/json"
                          }
                        ]
                      }
                    }
                  },
                  "request": {
                    "type": "object",
                    "properties": {
                      "uri": {
                        "type": "string",
                        "description": "The DNS server to query",
                        "examples": [
                          "openstatus.dev"
                        ]
                      }
                    },
                    "required": [
                      "uri"
                    ],
                    "description": "The DNS Request we are sending"
                  },
                  "assertions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "enum": [
                            "dnsRecord"
                          ]
                        },
                        "recordType": {
                          "type": "string",
                          "enum": [
                            "A",
                            "AAAA",
                            "CNAME",
                            "MX",
                            "TXT"
                          ],
                          "description": "Type of DNS record to check",
                          "examples": [
                            "A",
                            "CNAME"
                          ]
                        },
                        "compare": {
                          "type": "string",
                          "enum": [
                            "contains",
                            "not_contains",
                            "eq",
                            "not_eq"
                          ],
                          "description": "Comparison operator",
                          "examples": [
                            "eq",
                            "not_eq",
                            "contains",
                            "not_contains"
                          ]
                        },
                        "target": {
                          "type": "string",
                          "description": "DNS record value to assert",
                          "examples": [
                            "example.com"
                          ]
                        }
                      },
                      "required": [
                        "kind",
                        "recordType",
                        "compare",
                        "target"
                      ]
                    },
                    "description": "Assertions to run on the DNS response"
                  }
                },
                "required": [
                  "name",
                  "frequency",
                  "request"
                ],
                "title": "DNS Monitor Schema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Update a monitor",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Monitor"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/monitor/{id}/summary": {
      "get": {
        "tags": [
          "monitor"
        ],
        "summary": "Get a monitor summary",
        "description": "Get a monitor summary of the last 45 days of data to be used within a status page",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the monitor",
              "example": "1"
            },
            "required": true,
            "description": "The id of the monitor",
            "name": "id",
            "in": "path"
          }
        ],
        "responses": {
          "200": {
            "description": "All the historical metrics",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "ok": {
                            "type": "integer",
                            "description": "The number of ok responses (defined by the assertions - or by default status code 200)"
                          },
                          "count": {
                            "type": "integer",
                            "description": "The total number of request"
                          },
                          "day": {
                            "type": "string",
                            "nullable": true,
                            "format": "date",
                            "description": "The date of the daily stat in ISO8601 format"
                          }
                        },
                        "required": [
                          "ok",
                          "count",
                          "day"
                        ]
                      }
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/monitor/{id}/trigger": {
      "post": {
        "tags": [
          "monitor"
        ],
        "summary": "Create a monitor trigger",
        "description": "Trigger a monitor check without waiting the result",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the monitor",
              "example": "1"
            },
            "required": true,
            "description": "The id of the monitor",
            "name": "id",
            "in": "path"
          }
        ],
        "responses": {
          "200": {
            "description": "Returns a result id that can be used to get the result of your trigger",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "resultId": {
                      "type": "number",
                      "description": "the id of your check result"
                    }
                  },
                  "required": [
                    "resultId"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/monitor/{id}/result/{resultId}": {
      "get": {
        "tags": [
          "monitor"
        ],
        "summary": "Get a monitor result",
        "description": "**WARNING:** This works only for HTTP monitors. We will add support for other types of monitors soon.",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the monitor",
              "example": "1"
            },
            "required": true,
            "description": "The id of the monitor",
            "name": "id",
            "in": "path"
          },
          {
            "schema": {
              "type": "string",
              "description": "The id of the result"
            },
            "required": true,
            "description": "The id of the result",
            "name": "resultId",
            "in": "path"
          }
        ],
        "responses": {
          "200": {
            "description": "All the metrics for the result id from the monitor",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "latency": {
                        "type": "integer"
                      },
                      "statusCode": {
                        "type": "integer",
                        "nullable": true,
                        "default": null
                      },
                      "monitorId": {
                        "type": "string",
                        "default": ""
                      },
                      "url": {
                        "type": "string"
                      },
                      "error": {
                        "type": "boolean",
                        "nullable": true,
                        "default": false
                      },
                      "region": {
                        "type": "string",
                        "enum": [
                          "ams",
                          "arn",
                          "atl",
                          "bog",
                          "bom",
                          "bos",
                          "cdg",
                          "den",
                          "dfw",
                          "ewr",
                          "eze",
                          "fra",
                          "gdl",
                          "gig",
                          "gru",
                          "hkg",
                          "iad",
                          "jnb",
                          "lax",
                          "lhr",
                          "mad",
                          "mia",
                          "nrt",
                          "ord",
                          "otp",
                          "phx",
                          "qro",
                          "scl",
                          "sjc",
                          "sea",
                          "sin",
                          "syd",
                          "waw",
                          "yul",
                          "yyz",
                          "koyeb_fra",
                          "koyeb_was",
                          "koyeb_sin",
                          "koyeb_tyo",
                          "koyeb_par",
                          "koyeb_sfo",
                          "railway_europe-west4-drams3a",
                          "railway_us-east4-eqdc4a",
                          "railway_asia-southeast1-eqsg3a",
                          "railway_us-west2"
                        ]
                      },
                      "timestamp": {
                        "type": "integer"
                      },
                      "message": {
                        "type": "string",
                        "nullable": true
                      },
                      "timing": {
                        "type": "object",
                        "nullable": true,
                        "properties": {
                          "dnsStart": {
                            "type": "number"
                          },
                          "dnsDone": {
                            "type": "number"
                          },
                          "connectStart": {
                            "type": "number"
                          },
                          "connectDone": {
                            "type": "number"
                          },
                          "tlsHandshakeStart": {
                            "type": "number"
                          },
                          "tlsHandshakeDone": {
                            "type": "number"
                          },
                          "firstByteStart": {
                            "type": "number"
                          },
                          "firstByteDone": {
                            "type": "number"
                          },
                          "transferStart": {
                            "type": "number"
                          },
                          "transferDone": {
                            "type": "number"
                          }
                        },
                        "required": [
                          "dnsStart",
                          "dnsDone",
                          "connectStart",
                          "connectDone",
                          "tlsHandshakeStart",
                          "tlsHandshakeDone",
                          "firstByteStart",
                          "firstByteDone",
                          "transferStart",
                          "transferDone"
                        ]
                      }
                    },
                    "required": [
                      "latency",
                      "region"
                    ]
                  }
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/monitor/{id}/run": {
      "post": {
        "tags": [
          "monitor"
        ],
        "summary": "Create a monitor run",
        "description": "Run a synthetic check for a specific monitor. It will take all configs into account.",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the monitor",
              "example": "1"
            },
            "required": true,
            "description": "The id of the monitor",
            "name": "id",
            "in": "path"
          },
          {
            "schema": {
              "type": "boolean",
              "nullable": true,
              "default": false,
              "description": "Don't wait for the result"
            },
            "required": false,
            "description": "Don't wait for the result",
            "name": "no-wait",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "All the historical metrics",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "jobType": {
                            "type": "string",
                            "enum": [
                              "http"
                            ]
                          },
                          "status": {
                            "type": "number"
                          },
                          "latency": {
                            "type": "number"
                          },
                          "region": {
                            "type": "string",
                            "enum": [
                              "ams",
                              "arn",
                              "atl",
                              "bog",
                              "bom",
                              "bos",
                              "cdg",
                              "den",
                              "dfw",
                              "ewr",
                              "eze",
                              "fra",
                              "gdl",
                              "gig",
                              "gru",
                              "hkg",
                              "iad",
                              "jnb",
                              "lax",
                              "lhr",
                              "mad",
                              "mia",
                              "nrt",
                              "ord",
                              "otp",
                              "phx",
                              "qro",
                              "scl",
                              "sjc",
                              "sea",
                              "sin",
                              "syd",
                              "waw",
                              "yul",
                              "yyz",
                              "koyeb_fra",
                              "koyeb_was",
                              "koyeb_sin",
                              "koyeb_tyo",
                              "koyeb_par",
                              "koyeb_sfo",
                              "railway_europe-west4-drams3a",
                              "railway_us-east4-eqdc4a",
                              "railway_asia-southeast1-eqsg3a",
                              "railway_us-west2"
                            ]
                          },
                          "timestamp": {
                            "type": "number"
                          },
                          "timing": {
                            "type": "object",
                            "properties": {
                              "dnsStart": {
                                "type": "number"
                              },
                              "dnsDone": {
                                "type": "number"
                              },
                              "connectStart": {
                                "type": "number"
                              },
                              "connectDone": {
                                "type": "number"
                              },
                              "tlsHandshakeStart": {
                                "type": "number"
                              },
                              "tlsHandshakeDone": {
                                "type": "number"
                              },
                              "firstByteStart": {
                                "type": "number"
                              },
                              "firstByteDone": {
                                "type": "number"
                              },
                              "transferStart": {
                                "type": "number"
                              },
                              "transferDone": {
                                "type": "number"
                              }
                            },
                            "required": [
                              "dnsStart",
                              "dnsDone",
                              "connectStart",
                              "connectDone",
                              "tlsHandshakeStart",
                              "tlsHandshakeDone",
                              "firstByteStart",
                              "firstByteDone",
                              "transferStart",
                              "transferDone"
                            ]
                          },
                          "body": {
                            "type": "string",
                            "nullable": true
                          },
                          "error": {
                            "type": "string",
                            "nullable": true
                          }
                        },
                        "required": [
                          "jobType",
                          "status",
                          "latency",
                          "region",
                          "timestamp",
                          "timing"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "jobType": {
                            "type": "string",
                            "enum": [
                              "tcp"
                            ]
                          },
                          "latency": {
                            "type": "number"
                          },
                          "region": {
                            "type": "string",
                            "enum": [
                              "ams",
                              "arn",
                              "atl",
                              "bog",
                              "bom",
                              "bos",
                              "cdg",
                              "den",
                              "dfw",
                              "ewr",
                              "eze",
                              "fra",
                              "gdl",
                              "gig",
                              "gru",
                              "hkg",
                              "iad",
                              "jnb",
                              "lax",
                              "lhr",
                              "mad",
                              "mia",
                              "nrt",
                              "ord",
                              "otp",
                              "phx",
                              "qro",
                              "scl",
                              "sjc",
                              "sea",
                              "sin",
                              "syd",
                              "waw",
                              "yul",
                              "yyz",
                              "koyeb_fra",
                              "koyeb_was",
                              "koyeb_sin",
                              "koyeb_tyo",
                              "koyeb_par",
                              "koyeb_sfo",
                              "railway_europe-west4-drams3a",
                              "railway_us-east4-eqdc4a",
                              "railway_asia-southeast1-eqsg3a",
                              "railway_us-west2"
                            ]
                          },
                          "timestamp": {
                            "type": "number"
                          },
                          "timing": {
                            "type": "object",
                            "properties": {
                              "tcpStart": {
                                "type": "number"
                              },
                              "tcpDone": {
                                "type": "number"
                              }
                            },
                            "required": [
                              "tcpStart",
                              "tcpDone"
                            ]
                          },
                          "error": {
                            "type": "number",
                            "nullable": true
                          },
                          "errorMessage": {
                            "type": "string",
                            "nullable": true
                          }
                        },
                        "required": [
                          "jobType",
                          "latency",
                          "region",
                          "timestamp",
                          "timing"
                        ]
                      }
                    ]
                  }
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/page/{id}": {
      "get": {
        "tags": [
          "page"
        ],
        "summary": "Get a status page",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the page",
              "example": "1"
            },
            "required": true,
            "description": "The id of the page",
            "name": "id",
            "in": "path"
          }
        ],
        "responses": {
          "200": {
            "description": "Get an Status page",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Page"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "page"
        ],
        "summary": "Update a status page",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the page",
              "example": "1"
            },
            "required": true,
            "description": "The id of the page",
            "name": "id",
            "in": "path"
          }
        ],
        "requestBody": {
          "description": "The monitor to update",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "description": "The title of the page",
                    "example": "My Page"
                  },
                  "description": {
                    "type": "string",
                    "description": "The description of the page",
                    "example": "My awesome status page"
                  },
                  "slug": {
                    "type": "string",
                    "description": "The slug of the page",
                    "example": "my-page"
                  },
                  "customDomain": {
                    "type": "string",
                    "nullable": true,
                    "description": "The custom domain of the page. To be configured within the dashboard.",
                    "example": "status.acme.com"
                  },
                  "icon": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uri"
                      },
                      {
                        "type": "string",
                        "enum": [
                          ""
                        ]
                      },
                      {
                        "nullable": true
                      }
                    ],
                    "description": "The icon of the page",
                    "example": "https://example.com/icon.png"
                  },
                  "passwordProtected": {
                    "type": "boolean",
                    "default": false,
                    "description": "Deprecated in favor of `accessType`. Used to set the password protection type. Returns true if `accessType` is set to 'password' and false otherwise.",
                    "example": true,
                    "deprecated": true
                  },
                  "accessType": {
                    "type": "string",
                    "enum": [
                      "public",
                      "password",
                      "email-domain"
                    ],
                    "default": "public",
                    "description": "The access type of the page",
                    "example": "public"
                  },
                  "password": {
                    "type": "string",
                    "nullable": true,
                    "description": "Your password to protect the page from the public",
                    "example": "hidden-password"
                  },
                  "authEmailDomains": {
                    "type": "array",
                    "nullable": true,
                    "items": {
                      "type": "string"
                    },
                    "description": "The email domains of the page",
                    "example": [
                      "example.com",
                      "example.org"
                    ]
                  },
                  "showMonitorValues": {
                    "type": "boolean",
                    "nullable": true,
                    "default": true,
                    "description": "Displays the total and failed request numbers for each monitor. Deprecated and will be removed in the future in favor for `configuration` property.",
                    "example": true,
                    "deprecated": true
                  },
                  "monitors": {
                    "anyOf": [
                      {
                        "type": "array",
                        "items": {
                          "type": "number"
                        },
                        "description": "The monitors of the page as an array of ids. We recommend using the object format to include the order.",
                        "deprecated": true,
                        "example": [
                          1,
                          2
                        ]
                      },
                      {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "monitorId": {
                              "type": "number"
                            },
                            "order": {
                              "type": "number"
                            }
                          },
                          "required": [
                            "monitorId",
                            "order"
                          ]
                        },
                        "description": "The monitor as object allowing to pass id and order",
                        "example": [
                          {
                            "monitorId": 1,
                            "order": 0
                          },
                          {
                            "monitorId": 2,
                            "order": 1
                          }
                        ]
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Get an Status page",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Page"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/page": {
      "get": {
        "tags": [
          "page"
        ],
        "summary": "List all status pages",
        "responses": {
          "200": {
            "description": "A list of your status pages",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Page"
                  }
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "page"
        ],
        "summary": "Create a status page",
        "requestBody": {
          "description": "The status page to create",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "description": "The title of the page",
                    "example": "My Page"
                  },
                  "description": {
                    "type": "string",
                    "description": "The description of the page",
                    "example": "My awesome status page"
                  },
                  "slug": {
                    "type": "string",
                    "description": "The slug of the page",
                    "example": "my-page"
                  },
                  "customDomain": {
                    "type": "string",
                    "nullable": true,
                    "description": "The custom domain of the page. To be configured within the dashboard.",
                    "example": "status.acme.com"
                  },
                  "icon": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uri"
                      },
                      {
                        "type": "string",
                        "enum": [
                          ""
                        ]
                      },
                      {
                        "nullable": true
                      }
                    ],
                    "description": "The icon of the page",
                    "example": "https://example.com/icon.png"
                  },
                  "passwordProtected": {
                    "type": "boolean",
                    "default": false,
                    "description": "Deprecated in favor of `accessType`. Used to set the password protection type. Returns true if `accessType` is set to 'password' and false otherwise.",
                    "example": true,
                    "deprecated": true
                  },
                  "accessType": {
                    "type": "string",
                    "enum": [
                      "public",
                      "password",
                      "email-domain"
                    ],
                    "default": "public",
                    "description": "The access type of the page",
                    "example": "public"
                  },
                  "password": {
                    "type": "string",
                    "nullable": true,
                    "description": "Your password to protect the page from the public",
                    "example": "hidden-password"
                  },
                  "authEmailDomains": {
                    "type": "array",
                    "nullable": true,
                    "items": {
                      "type": "string"
                    },
                    "description": "The email domains of the page",
                    "example": [
                      "example.com",
                      "example.org"
                    ]
                  },
                  "showMonitorValues": {
                    "type": "boolean",
                    "nullable": true,
                    "default": true,
                    "description": "Displays the total and failed request numbers for each monitor. Deprecated and will be removed in the future in favor for `configuration` property.",
                    "example": true,
                    "deprecated": true
                  },
                  "monitors": {
                    "anyOf": [
                      {
                        "type": "array",
                        "items": {
                          "type": "number"
                        },
                        "description": "The monitors of the page as an array of ids. We recommend using the object format to include the order.",
                        "deprecated": true,
                        "example": [
                          1,
                          2
                        ]
                      },
                      {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "monitorId": {
                              "type": "number"
                            },
                            "order": {
                              "type": "number"
                            }
                          },
                          "required": [
                            "monitorId",
                            "order"
                          ]
                        },
                        "description": "The monitor as object allowing to pass id and order",
                        "example": [
                          {
                            "monitorId": 1,
                            "order": 0
                          },
                          {
                            "monitorId": 2,
                            "order": 1
                          }
                        ]
                      }
                    ]
                  }
                },
                "required": [
                  "title",
                  "description",
                  "slug"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Get an Status page",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Page"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/status_report": {
      "get": {
        "tags": [
          "status_report"
        ],
        "summary": "List all status reports",
        "responses": {
          "200": {
            "description": "Get all status reports",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/StatusReport"
                  }
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "status_report"
        ],
        "summary": "Create a status report",
        "requestBody": {
          "description": "The status report to create",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "example": "Documenso",
                    "description": "The title of the status report"
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "investigating",
                      "identified",
                      "monitoring",
                      "resolved"
                    ],
                    "description": "The current status of the report"
                  },
                  "monitorIds": {
                    "type": "array",
                    "items": {
                      "type": "number"
                    },
                    "default": [],
                    "description": "Ids of the monitors the status report."
                  },
                  "pageId": {
                    "type": "number",
                    "description": "The id of the page this status report belongs to"
                  },
                  "date": {
                    "type": "string",
                    "nullable": true,
                    "format": "date",
                    "default": "2026-02-12T22:01:46.114Z",
                    "description": "The date of the report in ISO8601 format, defaults to now"
                  },
                  "message": {
                    "type": "string",
                    "description": "The message of the current status of incident"
                  }
                },
                "required": [
                  "title",
                  "status",
                  "pageId",
                  "message"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The created status report",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StatusReport"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/status_report/{id}": {
      "delete": {
        "tags": [
          "status_report"
        ],
        "summary": "Delete a status report",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the status report",
              "example": "1"
            },
            "required": true,
            "description": "The id of the status report",
            "name": "id",
            "in": "path"
          }
        ],
        "responses": {
          "200": {
            "description": "Status report deleted",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {}
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "status_report"
        ],
        "summary": "Get a status report",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the status report",
              "example": "1"
            },
            "required": true,
            "description": "The id of the status report",
            "name": "id",
            "in": "path"
          }
        ],
        "responses": {
          "200": {
            "description": "Get all status reports",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StatusReport"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/status_report/{id}/update": {
      "post": {
        "tags": [
          "status_report"
        ],
        "summary": "Create a status report update",
        "deprecated": true,
        "description": "Preferably use [`/status-report-updates`](#tag/status_report_update/POST/status_report_update) instead.",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the status report",
              "example": "1"
            },
            "required": true,
            "description": "The id of the status report",
            "name": "id",
            "in": "path"
          }
        ],
        "requestBody": {
          "description": "the status report update",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "status": {
                    "type": "string",
                    "enum": [
                      "investigating",
                      "identified",
                      "monitoring",
                      "resolved"
                    ],
                    "description": "The status of the update"
                  },
                  "date": {
                    "type": "string",
                    "nullable": true,
                    "format": "date",
                    "default": "2026-02-12T22:01:46.114Z",
                    "description": "The date of the update in ISO8601 format"
                  },
                  "message": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The message of the update"
                  }
                },
                "required": [
                  "status",
                  "message"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Status report updated",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StatusReport"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/status_report_update/{id}": {
      "get": {
        "tags": [
          "status_report_update"
        ],
        "summary": "Get a status report update",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the update",
              "example": "1"
            },
            "required": true,
            "description": "The id of the update",
            "name": "id",
            "in": "path"
          }
        ],
        "responses": {
          "200": {
            "description": "Get a status report update",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StatusReportUpdate"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/status_report_update": {
      "post": {
        "tags": [
          "status_report_update"
        ],
        "summary": "Create a status report update",
        "requestBody": {
          "description": "The status report update to create",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "status": {
                    "type": "string",
                    "enum": [
                      "investigating",
                      "identified",
                      "monitoring",
                      "resolved"
                    ],
                    "description": "The status of the update"
                  },
                  "date": {
                    "type": "string",
                    "nullable": true,
                    "format": "date",
                    "default": "2026-02-12T22:01:46.114Z",
                    "description": "The date of the update in ISO8601 format"
                  },
                  "message": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The message of the update"
                  },
                  "statusReportId": {
                    "type": "number",
                    "description": "The id of the status report"
                  }
                },
                "required": [
                  "status",
                  "message",
                  "statusReportId"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The created status report update",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StatusReportUpdate"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/incident": {
      "get": {
        "tags": [
          "incident"
        ],
        "summary": "List all incidents",
        "responses": {
          "200": {
            "description": "Get all incidents",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Incident"
                  }
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/incident/{id}": {
      "get": {
        "tags": [
          "incident"
        ],
        "summary": "Get an incident",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "pattern": "^\\d+$",
              "description": "The id of the Incident",
              "example": "1"
            },
            "required": true,
            "description": "The id of the Incident",
            "name": "id",
            "in": "path"
          }
        ],
        "responses": {
          "200": {
            "description": "Get an incident",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Incident"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "incident"
        ],
        "summary": "Update an incident",
        "description": "Acknowledge or resolve an incident",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "pattern": "^\\d+$",
              "description": "The id of the Incident",
              "example": "1"
            },
            "required": true,
            "description": "The id of the Incident",
            "name": "id",
            "in": "path"
          }
        ],
        "requestBody": {
          "description": "The incident to update",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "acknowledgedAt": {
                    "type": "string",
                    "nullable": true,
                    "format": "date",
                    "description": "The date the incident was acknowledged"
                  },
                  "resolvedAt": {
                    "type": "string",
                    "nullable": true,
                    "format": "date",
                    "description": "The date the incident was resolved"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Update a monitor",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Incident"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/maintenance": {
      "get": {
        "tags": [
          "maintenance"
        ],
        "summary": "List all maintenances",
        "responses": {
          "200": {
            "description": "Get all maintenances",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Maintenance"
                  }
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "maintenance"
        ],
        "summary": "Create a maintenance",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "description": "The title of the maintenance",
                    "example": "Database Upgrade"
                  },
                  "message": {
                    "type": "string",
                    "description": "The message describing the maintenance",
                    "example": "Upgrading database to improve performance"
                  },
                  "from": {
                    "type": "string",
                    "nullable": true,
                    "format": "date",
                    "description": "When the maintenance starts"
                  },
                  "to": {
                    "type": "string",
                    "nullable": true,
                    "format": "date",
                    "description": "When the maintenance ends"
                  },
                  "monitorIds": {
                    "type": "array",
                    "items": {
                      "type": "number"
                    },
                    "default": [],
                    "description": "IDs of affected monitors"
                  },
                  "pageId": {
                    "type": "number",
                    "description": "The id of the status page this maintenance belongs to"
                  }
                },
                "required": [
                  "title",
                  "message",
                  "from",
                  "to",
                  "pageId"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Create a maintenance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Maintenance"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/maintenance/{id}": {
      "get": {
        "tags": [
          "maintenance"
        ],
        "summary": "Get a maintenance",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "pattern": "^\\d+$",
              "description": "The id of the maintenance",
              "example": "1"
            },
            "required": true,
            "description": "The id of the maintenance",
            "name": "id",
            "in": "path"
          }
        ],
        "responses": {
          "200": {
            "description": "Get a maintenance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Maintenance"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "maintenance"
        ],
        "summary": "Update a maintenance",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "pattern": "^\\d+$",
              "description": "The id of the maintenance",
              "example": "1"
            },
            "required": true,
            "description": "The id of the maintenance",
            "name": "id",
            "in": "path"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "description": "The title of the maintenance",
                    "example": "Database Upgrade"
                  },
                  "message": {
                    "type": "string",
                    "description": "The message describing the maintenance",
                    "example": "Upgrading database to improve performance"
                  },
                  "from": {
                    "type": "string",
                    "nullable": true,
                    "format": "date",
                    "description": "When the maintenance starts"
                  },
                  "to": {
                    "type": "string",
                    "nullable": true,
                    "format": "date",
                    "description": "When the maintenance ends"
                  },
                  "monitorIds": {
                    "type": "array",
                    "items": {
                      "type": "number"
                    },
                    "default": [],
                    "description": "IDs of affected monitors"
                  },
                  "pageId": {
                    "type": "number",
                    "description": "The id of the status page this maintenance belongs to"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Update a maintenance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Maintenance"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/notification": {
      "get": {
        "tags": [
          "notification"
        ],
        "summary": "List all notifications",
        "responses": {
          "200": {
            "description": "Get all your workspace notification",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Notification"
                  }
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "notification"
        ],
        "summary": "Create a notification",
        "requestBody": {
          "description": "The notification to create",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "The name of the notification",
                    "example": "OpenStatus Discord"
                  },
                  "provider": {
                    "type": "string",
                    "enum": [
                      "discord",
                      "email",
                      "google-chat",
                      "grafana-oncall",
                      "ntfy",
                      "pagerduty",
                      "opsgenie",
                      "slack",
                      "sms",
                      "telegram",
                      "webhook",
                      "whatsapp"
                    ],
                    "description": "The provider of the notification",
                    "example": "discord"
                  },
                  "payload": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "discord": {
                            "type": "string",
                            "format": "uri"
                          }
                        },
                        "required": [
                          "discord"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "email": {
                            "type": "string",
                            "format": "email"
                          }
                        },
                        "required": [
                          "email"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "grafana-oncall": {
                            "type": "object",
                            "properties": {
                              "webhookUrl": {
                                "type": "string",
                                "format": "uri"
                              }
                            },
                            "required": [
                              "webhookUrl"
                            ]
                          }
                        },
                        "required": [
                          "grafana-oncall"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "ms-teams": {
                            "type": "object",
                            "properties": {
                              "webhookUrl": {
                                "type": "string",
                                "format": "uri"
                              }
                            },
                            "required": [
                              "webhookUrl"
                            ]
                          }
                        },
                        "required": [
                          "ms-teams"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "ntfy": {
                            "type": "object",
                            "properties": {
                              "topic": {
                                "type": "string",
                                "default": ""
                              },
                              "serverUrl": {
                                "type": "string",
                                "default": "https://ntfy.sh"
                              },
                              "token": {
                                "type": "string"
                              }
                            }
                          }
                        },
                        "required": [
                          "ntfy"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "opsgenie": {
                            "type": "object",
                            "properties": {
                              "apiKey": {
                                "type": "string"
                              },
                              "region": {
                                "type": "string",
                                "enum": [
                                  "us",
                                  "eu"
                                ]
                              }
                            },
                            "required": [
                              "apiKey",
                              "region"
                            ]
                          }
                        },
                        "required": [
                          "opsgenie"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "pagerduty": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "pagerduty"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "sms": {
                            "type": "string",
                            "pattern": "^([+]?[\\s0-9]+)?(\\d{3}|[(]?[0-9]+[)])?([-]?[\\s]?[0-9])+$"
                          }
                        },
                        "required": [
                          "sms"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "telegram": {
                            "type": "object",
                            "properties": {
                              "chatId": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "chatId"
                            ]
                          }
                        },
                        "required": [
                          "telegram"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "slack": {
                            "type": "string",
                            "format": "uri"
                          }
                        },
                        "required": [
                          "slack"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "webhook": {
                            "type": "object",
                            "properties": {
                              "endpoint": {
                                "type": "string",
                                "format": "uri"
                              },
                              "headers": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "key": {
                                      "type": "string"
                                    },
                                    "value": {
                                      "type": "string"
                                    }
                                  },
                                  "required": [
                                    "key",
                                    "value"
                                  ]
                                }
                              }
                            },
                            "required": [
                              "endpoint"
                            ]
                          }
                        },
                        "required": [
                          "webhook"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "whatsapp": {
                            "type": "string",
                            "pattern": "^([+]?[\\s0-9]+)?(\\d{3}|[(]?[0-9]+[)])?([-]?[\\s]?[0-9])+$"
                          }
                        },
                        "required": [
                          "whatsapp"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "google-chat": {
                            "type": "string",
                            "format": "uri"
                          }
                        },
                        "required": [
                          "google-chat"
                        ]
                      }
                    ],
                    "description": "The data of the notification"
                  },
                  "monitors": {
                    "type": "array",
                    "nullable": true,
                    "items": {
                      "type": "number"
                    },
                    "description": "The monitors that the notification is linked to",
                    "example": [
                      1,
                      2
                    ]
                  }
                },
                "required": [
                  "name",
                  "provider",
                  "payload"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Return the created notification",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Notification"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/notification/{id}": {
      "get": {
        "tags": [
          "notification"
        ],
        "summary": "Get a notification",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the notification",
              "example": "1"
            },
            "required": true,
            "description": "The id of the notification",
            "name": "id",
            "in": "path"
          }
        ],
        "responses": {
          "200": {
            "description": "Get an Status page",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Notification"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/page_subscriber/{id}/update": {
      "post": {
        "tags": [
          "page_subscriber"
        ],
        "summary": "Subscribe to a status page",
        "description": "Add a subscriber to a status page",
        "parameters": [
          {
            "schema": {
              "type": "string",
              "minLength": 1,
              "description": "The id of the page",
              "example": "1"
            },
            "required": true,
            "description": "The id of the page",
            "name": "id",
            "in": "path"
          }
        ],
        "requestBody": {
          "description": "The subscriber payload",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email",
                    "description": "The email of the subscriber"
                  }
                },
                "required": [
                  "email"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The user has been subscribed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageSubscriber"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/check/http": {
      "post": {
        "tags": [
          "check"
        ],
        "summary": "Run a single check",
        "requestBody": {
          "description": "The run request to create",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "example": "https://www.documenso.co",
                    "description": "The url to monitor"
                  },
                  "body": {
                    "type": "string",
                    "nullable": true,
                    "default": "",
                    "example": "Hello World",
                    "description": "The body"
                  },
                  "headers": {
                    "type": "array",
                    "nullable": true,
                    "items": {
                      "type": "object",
                      "properties": {
                        "key": {
                          "type": "string"
                        },
                        "value": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "key",
                        "value"
                      ]
                    },
                    "default": [],
                    "description": "The headers of your request",
                    "example": [
                      {
                        "key": "x-apikey",
                        "value": "supersecrettoken"
                      }
                    ]
                  },
                  "method": {
                    "type": "string",
                    "enum": [
                      "GET",
                      "POST",
                      "HEAD",
                      "PUT",
                      "PATCH",
                      "DELETE",
                      "TRACE",
                      "CONNECT",
                      "OPTIONS"
                    ],
                    "example": "GET"
                  },
                  "regions": {
                    "type": "array",
                    "nullable": true,
                    "items": {
                      "type": "string",
                      "enum": [
                        "ams",
                        "arn",
                        "atl",
                        "bog",
                        "bom",
                        "bos",
                        "cdg",
                        "den",
                        "dfw",
                        "ewr",
                        "eze",
                        "fra",
                        "gdl",
                        "gig",
                        "gru",
                        "hkg",
                        "iad",
                        "jnb",
                        "lax",
                        "lhr",
                        "mad",
                        "mia",
                        "nrt",
                        "ord",
                        "otp",
                        "phx",
                        "qro",
                        "scl",
                        "sjc",
                        "sea",
                        "sin",
                        "syd",
                        "waw",
                        "yul",
                        "yyz",
                        "koyeb_fra",
                        "koyeb_was",
                        "koyeb_sin",
                        "koyeb_tyo",
                        "koyeb_par",
                        "koyeb_sfo",
                        "railway_europe-west4-drams3a",
                        "railway_us-east4-eqdc4a",
                        "railway_asia-southeast1-eqsg3a",
                        "railway_us-west2"
                      ]
                    },
                    "default": [],
                    "example": [
                      "ams"
                    ],
                    "description": "Where we should monitor it"
                  },
                  "runCount": {
                    "type": "number",
                    "maximum": 5,
                    "default": 1,
                    "description": "The number of times to run the check"
                  },
                  "aggregated": {
                    "type": "boolean",
                    "description": "Whether to aggregate the results or not"
                  }
                },
                "required": [
                  "url",
                  "method"
                ],
                "description": "The check request"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Return a run result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "integer",
                      "description": "The id of the check"
                    },
                    "raw": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "dnsStart": {
                            "type": "number",
                            "description": "DNS timestamp start time in UTC "
                          },
                          "dnsDone": {
                            "type": "number",
                            "description": "DNS timestamp end time in UTC "
                          },
                          "connectStart": {
                            "type": "number",
                            "description": "Connect timestamp start time in UTC "
                          },
                          "connectDone": {
                            "type": "number",
                            "description": "Connect timestamp end time in UTC "
                          },
                          "tlsHandshakeStart": {
                            "type": "number",
                            "description": "TLS handshake timestamp start time in UTC "
                          },
                          "tlsHandshakeDone": {
                            "type": "number",
                            "description": "TLS handshake timestamp end time in UTC "
                          },
                          "firstByteStart": {
                            "type": "number",
                            "description": "First byte timestamp start time in UTC "
                          },
                          "firstByteDone": {
                            "type": "number",
                            "description": "First byte timestamp end time in UTC "
                          },
                          "transferStart": {
                            "type": "number",
                            "description": "Transfer timestamp start time in UTC "
                          },
                          "transferDone": {
                            "type": "number",
                            "description": "Transfer timestamp end time in UTC "
                          }
                        },
                        "required": [
                          "dnsStart",
                          "dnsDone",
                          "connectStart",
                          "connectDone",
                          "tlsHandshakeStart",
                          "tlsHandshakeDone",
                          "firstByteStart",
                          "firstByteDone",
                          "transferStart",
                          "transferDone"
                        ]
                      },
                      "description": "The raw data of the check"
                    },
                    "response": {
                      "type": "object",
                      "properties": {
                        "timestamp": {
                          "type": "number",
                          "description": "The timestamp of the response in UTC"
                        },
                        "status": {
                          "type": "number",
                          "description": "The status code of the response"
                        },
                        "latency": {
                          "type": "number",
                          "description": "The latency of the response"
                        },
                        "body": {
                          "type": "string",
                          "description": "The body of the response"
                        },
                        "headers": {
                          "type": "object",
                          "additionalProperties": {
                            "type": "string"
                          },
                          "description": "The headers of the response"
                        },
                        "timing": {
                          "type": "object",
                          "properties": {
                            "dnsStart": {
                              "type": "number",
                              "description": "DNS timestamp start time in UTC "
                            },
                            "dnsDone": {
                              "type": "number",
                              "description": "DNS timestamp end time in UTC "
                            },
                            "connectStart": {
                              "type": "number",
                              "description": "Connect timestamp start time in UTC "
                            },
                            "connectDone": {
                              "type": "number",
                              "description": "Connect timestamp end time in UTC "
                            },
                            "tlsHandshakeStart": {
                              "type": "number",
                              "description": "TLS handshake timestamp start time in UTC "
                            },
                            "tlsHandshakeDone": {
                              "type": "number",
                              "description": "TLS handshake timestamp end time in UTC "
                            },
                            "firstByteStart": {
                              "type": "number",
                              "description": "First byte timestamp start time in UTC "
                            },
                            "firstByteDone": {
                              "type": "number",
                              "description": "First byte timestamp end time in UTC "
                            },
                            "transferStart": {
                              "type": "number",
                              "description": "Transfer timestamp start time in UTC "
                            },
                            "transferDone": {
                              "type": "number",
                              "description": "Transfer timestamp end time in UTC "
                            }
                          },
                          "required": [
                            "dnsStart",
                            "dnsDone",
                            "connectStart",
                            "connectDone",
                            "tlsHandshakeStart",
                            "tlsHandshakeDone",
                            "firstByteStart",
                            "firstByteDone",
                            "transferStart",
                            "transferDone"
                          ],
                          "description": "The timing metrics of the response"
                        },
                        "aggregated": {
                          "type": "object",
                          "properties": {
                            "dns": {
                              "type": "object",
                              "properties": {
                                "p50": {
                                  "type": "number",
                                  "description": "The 50th percentile"
                                },
                                "p75": {
                                  "type": "number",
                                  "description": "The 75th percentile"
                                },
                                "p95": {
                                  "type": "number",
                                  "description": "The 95th percentile"
                                },
                                "p99": {
                                  "type": "number",
                                  "description": "The 99th percentile"
                                },
                                "min": {
                                  "type": "number",
                                  "description": "The minimum value"
                                },
                                "max": {
                                  "type": "number",
                                  "description": "The maximum value"
                                }
                              },
                              "required": [
                                "p50",
                                "p75",
                                "p95",
                                "p99",
                                "min",
                                "max"
                              ],
                              "description": "The aggregated DNS timing of the check"
                            },
                            "connection": {
                              "type": "object",
                              "properties": {
                                "p50": {
                                  "type": "number",
                                  "description": "The 50th percentile"
                                },
                                "p75": {
                                  "type": "number",
                                  "description": "The 75th percentile"
                                },
                                "p95": {
                                  "type": "number",
                                  "description": "The 95th percentile"
                                },
                                "p99": {
                                  "type": "number",
                                  "description": "The 99th percentile"
                                },
                                "min": {
                                  "type": "number",
                                  "description": "The minimum value"
                                },
                                "max": {
                                  "type": "number",
                                  "description": "The maximum value"
                                }
                              },
                              "required": [
                                "p50",
                                "p75",
                                "p95",
                                "p99",
                                "min",
                                "max"
                              ],
                              "description": "The aggregated connection timing of the check"
                            },
                            "tls": {
                              "type": "object",
                              "properties": {
                                "p50": {
                                  "type": "number",
                                  "description": "The 50th percentile"
                                },
                                "p75": {
                                  "type": "number",
                                  "description": "The 75th percentile"
                                },
                                "p95": {
                                  "type": "number",
                                  "description": "The 95th percentile"
                                },
                                "p99": {
                                  "type": "number",
                                  "description": "The 99th percentile"
                                },
                                "min": {
                                  "type": "number",
                                  "description": "The minimum value"
                                },
                                "max": {
                                  "type": "number",
                                  "description": "The maximum value"
                                }
                              },
                              "required": [
                                "p50",
                                "p75",
                                "p95",
                                "p99",
                                "min",
                                "max"
                              ],
                              "description": "The aggregated tls timing of the check"
                            },
                            "firstByte": {
                              "type": "object",
                              "properties": {
                                "p50": {
                                  "type": "number",
                                  "description": "The 50th percentile"
                                },
                                "p75": {
                                  "type": "number",
                                  "description": "The 75th percentile"
                                },
                                "p95": {
                                  "type": "number",
                                  "description": "The 95th percentile"
                                },
                                "p99": {
                                  "type": "number",
                                  "description": "The 99th percentile"
                                },
                                "min": {
                                  "type": "number",
                                  "description": "The minimum value"
                                },
                                "max": {
                                  "type": "number",
                                  "description": "The maximum value"
                                }
                              },
                              "required": [
                                "p50",
                                "p75",
                                "p95",
                                "p99",
                                "min",
                                "max"
                              ],
                              "description": "The aggregated first byte timing of the check"
                            },
                            "transfer": {
                              "type": "object",
                              "properties": {
                                "p50": {
                                  "type": "number",
                                  "description": "The 50th percentile"
                                },
                                "p75": {
                                  "type": "number",
                                  "description": "The 75th percentile"
                                },
                                "p95": {
                                  "type": "number",
                                  "description": "The 95th percentile"
                                },
                                "p99": {
                                  "type": "number",
                                  "description": "The 99th percentile"
                                },
                                "min": {
                                  "type": "number",
                                  "description": "The minimum value"
                                },
                                "max": {
                                  "type": "number",
                                  "description": "The maximum value"
                                }
                              },
                              "required": [
                                "p50",
                                "p75",
                                "p95",
                                "p99",
                                "min",
                                "max"
                              ],
                              "description": "The aggregated transfer timing of the check"
                            },
                            "latency": {
                              "type": "object",
                              "properties": {
                                "p50": {
                                  "type": "number",
                                  "description": "The 50th percentile"
                                },
                                "p75": {
                                  "type": "number",
                                  "description": "The 75th percentile"
                                },
                                "p95": {
                                  "type": "number",
                                  "description": "The 95th percentile"
                                },
                                "p99": {
                                  "type": "number",
                                  "description": "The 99th percentile"
                                },
                                "min": {
                                  "type": "number",
                                  "description": "The minimum value"
                                },
                                "max": {
                                  "type": "number",
                                  "description": "The maximum value"
                                }
                              },
                              "required": [
                                "p50",
                                "p75",
                                "p95",
                                "p99",
                                "min",
                                "max"
                              ],
                              "description": "The aggregated latency timing of the check"
                            }
                          },
                          "required": [
                            "dns",
                            "connection",
                            "tls",
                            "firstByte",
                            "transfer",
                            "latency"
                          ],
                          "description": "The aggregated data dns timing of the check"
                        },
                        "region": {
                          "type": "string",
                          "description": "The region where the check ran"
                        }
                      },
                      "required": [
                        "timestamp",
                        "status",
                        "latency",
                        "timing",
                        "region"
                      ],
                      "description": "The last response of the check"
                    },
                    "aggregated": {
                      "type": "object",
                      "properties": {
                        "dns": {
                          "type": "object",
                          "properties": {
                            "p50": {
                              "type": "number",
                              "description": "The 50th percentile"
                            },
                            "p75": {
                              "type": "number",
                              "description": "The 75th percentile"
                            },
                            "p95": {
                              "type": "number",
                              "description": "The 95th percentile"
                            },
                            "p99": {
                              "type": "number",
                              "description": "The 99th percentile"
                            },
                            "min": {
                              "type": "number",
                              "description": "The minimum value"
                            },
                            "max": {
                              "type": "number",
                              "description": "The maximum value"
                            }
                          },
                          "required": [
                            "p50",
                            "p75",
                            "p95",
                            "p99",
                            "min",
                            "max"
                          ],
                          "description": "The aggregated data of the check"
                        },
                        "connect": {
                          "type": "object",
                          "properties": {
                            "p50": {
                              "type": "number",
                              "description": "The 50th percentile"
                            },
                            "p75": {
                              "type": "number",
                              "description": "The 75th percentile"
                            },
                            "p95": {
                              "type": "number",
                              "description": "The 95th percentile"
                            },
                            "p99": {
                              "type": "number",
                              "description": "The 99th percentile"
                            },
                            "min": {
                              "type": "number",
                              "description": "The minimum value"
                            },
                            "max": {
                              "type": "number",
                              "description": "The maximum value"
                            }
                          },
                          "required": [
                            "p50",
                            "p75",
                            "p95",
                            "p99",
                            "min",
                            "max"
                          ],
                          "description": "The aggregated data of the check"
                        },
                        "tls": {
                          "type": "object",
                          "properties": {
                            "p50": {
                              "type": "number",
                              "description": "The 50th percentile"
                            },
                            "p75": {
                              "type": "number",
                              "description": "The 75th percentile"
                            },
                            "p95": {
                              "type": "number",
                              "description": "The 95th percentile"
                            },
                            "p99": {
                              "type": "number",
                              "description": "The 99th percentile"
                            },
                            "min": {
                              "type": "number",
                              "description": "The minimum value"
                            },
                            "max": {
                              "type": "number",
                              "description": "The maximum value"
                            }
                          },
                          "required": [
                            "p50",
                            "p75",
                            "p95",
                            "p99",
                            "min",
                            "max"
                          ],
                          "description": "The aggregated data of the check"
                        },
                        "firstByte": {
                          "type": "object",
                          "properties": {
                            "p50": {
                              "type": "number",
                              "description": "The 50th percentile"
                            },
                            "p75": {
                              "type": "number",
                              "description": "The 75th percentile"
                            },
                            "p95": {
                              "type": "number",
                              "description": "The 95th percentile"
                            },
                            "p99": {
                              "type": "number",
                              "description": "The 99th percentile"
                            },
                            "min": {
                              "type": "number",
                              "description": "The minimum value"
                            },
                            "max": {
                              "type": "number",
                              "description": "The maximum value"
                            }
                          },
                          "required": [
                            "p50",
                            "p75",
                            "p95",
                            "p99",
                            "min",
                            "max"
                          ],
                          "description": "The aggregated data of the check"
                        },
                        "transfer": {
                          "type": "object",
                          "properties": {
                            "p50": {
                              "type": "number",
                              "description": "The 50th percentile"
                            },
                            "p75": {
                              "type": "number",
                              "description": "The 75th percentile"
                            },
                            "p95": {
                              "type": "number",
                              "description": "The 95th percentile"
                            },
                            "p99": {
                              "type": "number",
                              "description": "The 99th percentile"
                            },
                            "min": {
                              "type": "number",
                              "description": "The minimum value"
                            },
                            "max": {
                              "type": "number",
                              "description": "The maximum value"
                            }
                          },
                          "required": [
                            "p50",
                            "p75",
                            "p95",
                            "p99",
                            "min",
                            "max"
                          ],
                          "description": "The aggregated data of the check"
                        },
                        "latency": {
                          "type": "object",
                          "properties": {
                            "p50": {
                              "type": "number",
                              "description": "The 50th percentile"
                            },
                            "p75": {
                              "type": "number",
                              "description": "The 75th percentile"
                            },
                            "p95": {
                              "type": "number",
                              "description": "The 95th percentile"
                            },
                            "p99": {
                              "type": "number",
                              "description": "The 99th percentile"
                            },
                            "min": {
                              "type": "number",
                              "description": "The minimum value"
                            },
                            "max": {
                              "type": "number",
                              "description": "The maximum value"
                            }
                          },
                          "required": [
                            "p50",
                            "p75",
                            "p95",
                            "p99",
                            "min",
                            "max"
                          ],
                          "description": "The aggregated data of the check"
                        }
                      },
                      "required": [
                        "dns",
                        "connect",
                        "tls",
                        "firstByte",
                        "transfer",
                        "latency"
                      ],
                      "description": "The aggregated data of the check"
                    }
                  },
                  "required": [
                    "id",
                    "raw",
                    "response"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    },
    "/whoami": {
      "get": {
        "tags": [
          "whoami"
        ],
        "summary": "Get your informations",
        "description": "Get the current workspace information attached to the API key.",
        "responses": {
          "200": {
            "description": "The current workspace information with the limits",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Workspace"
                }
              }
            }
          },
          "400": {
            "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrBadRequest"
                }
              }
            }
          },
          "401": {
            "description": "The client must authenticate itself to get the requested response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrUnauthorized"
                }
              }
            }
          },
          "402": {
            "description": "A higher pricing plan is required to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrPaymentRequired"
                }
              }
            }
          },
          "403": {
            "description": "The client does not have the necessary permissions to access the resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrForbidden"
                }
              }
            }
          },
          "404": {
            "description": "The server can't find the requested resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrNotFound"
                }
              }
            }
          },
          "409": {
            "description": "The request could not be completed due to a conflict mainly due to unique constraints.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrConflict"
                }
              }
            }
          },
          "500": {
            "description": "The server has encountered a situation it doesn't know how to handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrInternalServerError"
                }
              }
            }
          }
        }
      }
    }
  }
}