{
  "openapi": "3.1.0",
  "info": {
    "title": "Status by OpenApps",
    "version": "1.0.0",
    "summary": "Free status pages: components, incidents, scheduled maintenance and 90-day uptime history.",
    "description": "Make a status page with no key; the owner key in the answer lets CI, monitoring or an AI assistant change it. Reading a page (JSON, badge, RSS, Atom, calendar) needs no key. Component statuses also accept short words: up, degraded, partial, down, maintenance. Errors are JSON {error} with a sentence that says what to change. Guide: https://status-free.openapps.xyz/llms.txt",
    "contact": {
      "name": "OpenApps",
      "url": "https://free-apps.openapps.xyz/"
    }
  },
  "servers": [
    {
      "url": "https://functions.bounded.sh/apps/189c33495e4bbc89bfb2901a/api"
    }
  ],
  "externalDocs": {
    "description": "Guide for assistants",
    "url": "https://status-free.openapps.xyz/llms.txt"
  },
  "paths": {
    "/": {
      "get": {
        "operationId": "listRoutes",
        "summary": "Describe the API and list its routes",
        "responses": {
          "200": {
            "description": "The routes.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/pages": {
      "post": {
        "operationId": "createPage",
        "summary": "Make a status page (no key needed)",
        "description": "The slug is claimed once and can never be taken over. The answer includes adminUrl (give it to the person who owns the page) and ownerKey (keep it secret).",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePage"
              },
              "example": {
                "slug": "acme",
                "name": "Acme",
                "website": "https://acme.example",
                "components": [
                  "Website",
                  "API",
                  {
                    "name": "Database",
                    "group": "Core"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The page, its admin link and its owner key.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/PageStatus"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "adminUrl": {
                          "type": "string",
                          "format": "uri"
                        },
                        "ownerKey": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "adminUrl",
                        "ownerKey"
                      ]
                    }
                  ]
                },
                "example": {
                  "slug": "acme",
                  "name": "Acme",
                  "about": null,
                  "website": "https://acme.example/",
                  "url": "https://status-free.openapps.xyz/acme",
                  "status": {
                    "indicator": "none",
                    "description": "All systems operational"
                  },
                  "components": [
                    {
                      "id": "website",
                      "name": "Website",
                      "group": null,
                      "description": null,
                      "status": "operational",
                      "updatedAt": "2026-10-19T14:02:00.000Z",
                      "uptime90d": 100,
                      "incidentDays": []
                    },
                    {
                      "id": "api",
                      "name": "API",
                      "group": null,
                      "description": null,
                      "status": "major_outage",
                      "updatedAt": "2026-10-19T14:02:00.000Z",
                      "uptime90d": 99.87,
                      "incidentDays": [
                        {
                          "date": "2026-10-19",
                          "status": "major_outage",
                          "downMinutes": 18,
                          "incidents": [
                            "API errors"
                          ]
                        }
                      ]
                    }
                  ],
                  "incidents": [],
                  "maintenance": [],
                  "recent": [],
                  "historySince": "2026-07-21T14:02:00.000Z",
                  "feeds": {
                    "json": "https://functions.bounded.sh/apps/189c33495e4bbc89bfb2901a/api/pages/acme",
                    "rss": "https://functions.bounded.sh/apps/189c33495e4bbc89bfb2901a/api/pages/acme/feed.rss",
                    "atom": "https://functions.bounded.sh/apps/189c33495e4bbc89bfb2901a/api/pages/acme/feed.atom",
                    "calendar": "https://functions.bounded.sh/apps/189c33495e4bbc89bfb2901a/api/pages/acme/calendar.ics",
                    "badge": "https://functions.bounded.sh/apps/189c33495e4bbc89bfb2901a/api/pages/acme/badge.svg"
                  },
                  "checkedAt": "2026-10-19T14:02:00.000Z",
                  "adminUrl": "https://status-free.openapps.xyz/acme/admin#k=OWNER_KEY",
                  "ownerKey": "OWNER_KEY"
                }
              }
            }
          },
          "400": {
            "description": "Addresses are 3 to 40 lowercase letters, numbers or dashes, starting and ending with a letter or number.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Addresses are 3 to 40 lowercase letters, numbers or dashes, starting and ending with a letter or number."
                }
              }
            }
          },
          "409": {
            "description": "status-free.openapps.xyz/acme is taken. Try another slug.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "status-free.openapps.xyz/acme is taken. Try another slug."
                }
              }
            }
          },
          "429": {
            "description": "Too many requests: the whole API allows about 120 a minute per region. Retry after 60 seconds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/pages/{slug}": {
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "description": "The page's address: status-free.openapps.xyz/<slug>.",
          "schema": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"
          },
          "example": "acme"
        }
      ],
      "get": {
        "operationId": "getPage",
        "summary": "A page's status as JSON (no key needed)",
        "responses": {
          "200": {
            "description": "The overall status, components with uptime, open incidents, maintenance and recent incidents.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageStatus"
                },
                "example": {
                  "slug": "acme",
                  "name": "Acme",
                  "about": null,
                  "website": "https://acme.example/",
                  "url": "https://status-free.openapps.xyz/acme",
                  "status": {
                    "indicator": "critical",
                    "description": "Major outage"
                  },
                  "components": [
                    {
                      "id": "website",
                      "name": "Website",
                      "group": null,
                      "description": null,
                      "status": "operational",
                      "updatedAt": "2026-10-19T14:02:00.000Z",
                      "uptime90d": 100,
                      "incidentDays": []
                    },
                    {
                      "id": "api",
                      "name": "API",
                      "group": null,
                      "description": null,
                      "status": "major_outage",
                      "updatedAt": "2026-10-19T14:02:00.000Z",
                      "uptime90d": 99.87,
                      "incidentDays": [
                        {
                          "date": "2026-10-19",
                          "status": "major_outage",
                          "downMinutes": 18,
                          "incidents": [
                            "API errors"
                          ]
                        }
                      ]
                    }
                  ],
                  "incidents": [
                    {
                      "id": "k3m8x2pq",
                      "kind": "incident",
                      "title": "API errors",
                      "status": "identified",
                      "url": "https://status-free.openapps.xyz/acme/incidents/k3m8x2pq",
                      "components": [
                        {
                          "id": "api",
                          "name": "API",
                          "status": "major_outage"
                        }
                      ],
                      "updates": [
                        {
                          "status": "identified",
                          "message": "A bad deploy. Rolling back.",
                          "at": "2026-10-19T14:20:00.000Z",
                          "components": {
                            "api": "partial_outage"
                          }
                        },
                        {
                          "status": "investigating",
                          "message": "Some requests fail. We are looking into it.",
                          "at": "2026-10-19T14:02:00.000Z",
                          "components": {
                            "api": "major_outage"
                          }
                        }
                      ],
                      "startedAt": "2026-10-19T14:02:00.000Z",
                      "resolvedAt": null
                    }
                  ],
                  "maintenance": [
                    {
                      "id": "w7c2k9ha",
                      "kind": "maintenance",
                      "title": "Database upgrade",
                      "status": "scheduled",
                      "url": "https://status-free.openapps.xyz/acme/incidents/w7c2k9ha",
                      "components": [
                        {
                          "id": "database",
                          "name": "Database",
                          "status": "under_maintenance"
                        }
                      ],
                      "updates": [
                        {
                          "status": "scheduled",
                          "message": "Writes pause for up to 10 minutes.",
                          "at": "2026-10-19T14:02:00.000Z"
                        }
                      ],
                      "startsAt": "2026-10-25T02:00:00.000Z",
                      "endsAt": "2026-10-25T04:00:00.000Z"
                    }
                  ],
                  "recent": [],
                  "historySince": "2026-07-21T14:02:00.000Z",
                  "feeds": {
                    "json": "https://functions.bounded.sh/apps/189c33495e4bbc89bfb2901a/api/pages/acme",
                    "rss": "https://functions.bounded.sh/apps/189c33495e4bbc89bfb2901a/api/pages/acme/feed.rss",
                    "atom": "https://functions.bounded.sh/apps/189c33495e4bbc89bfb2901a/api/pages/acme/feed.atom",
                    "calendar": "https://functions.bounded.sh/apps/189c33495e4bbc89bfb2901a/api/pages/acme/calendar.ics",
                    "badge": "https://functions.bounded.sh/apps/189c33495e4bbc89bfb2901a/api/pages/acme/badge.svg"
                  },
                  "checkedAt": "2026-10-19T14:02:00.000Z"
                }
              }
            }
          },
          "404": {
            "description": "There is no status page at this address.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no status page at this address."
                }
              }
            }
          },
          "429": {
            "description": "Too many requests: the whole API allows about 120 a minute per region. Retry after 60 seconds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "patch": {
        "operationId": "updatePage",
        "summary": "Change the page's name, description, website or credit line",
        "security": [
          {
            "ownerKey": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PagePatch"
              },
              "example": {
                "about": "Payments for small shops."
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageStatus"
                }
              }
            }
          },
          "400": {
            "description": "Send at least one of name, about, website, showCredit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send at least one of name, about, website, showCredit."
                }
              }
            }
          },
          "401": {
            "description": "Send the page's owner key in the x-owner-key header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send the page's owner key in the x-owner-key header."
                }
              }
            }
          },
          "403": {
            "description": "That owner key does not match this status page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "That owner key does not match this status page."
                }
              }
            }
          },
          "404": {
            "description": "There is no status page at this address.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no status page at this address."
                }
              }
            }
          }
        }
      }
    },
    "/pages/{slug}/badge.svg": {
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "description": "The page's address: status-free.openapps.xyz/<slug>.",
          "schema": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"
          },
          "example": "acme"
        }
      ],
      "get": {
        "operationId": "getBadge",
        "summary": "A status badge for a README (no key needed)",
        "parameters": [
          {
            "name": "component",
            "in": "query",
            "required": false,
            "description": "Show one component instead of the whole page.",
            "schema": {
              "type": "string"
            },
            "example": "api"
          },
          {
            "name": "label",
            "in": "query",
            "required": false,
            "description": "The text on the left (default: status, or the component name).",
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          }
        ],
        "responses": {
          "200": {
            "description": "An SVG badge, like status | operational.",
            "content": {
              "image/svg+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "There is no status page at this address.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no status page at this address."
                }
              }
            }
          }
        }
      }
    },
    "/pages/{slug}/feed.rss": {
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "description": "The page's address: status-free.openapps.xyz/<slug>.",
          "schema": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"
          },
          "example": "acme"
        }
      ],
      "get": {
        "operationId": "getRss",
        "summary": "RSS feed: one item per incident or maintenance update",
        "responses": {
          "200": {
            "description": "RSS 2.0.",
            "content": {
              "application/rss+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "There is no status page at this address.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no status page at this address."
                }
              }
            }
          }
        }
      }
    },
    "/pages/{slug}/feed.atom": {
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "description": "The page's address: status-free.openapps.xyz/<slug>.",
          "schema": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"
          },
          "example": "acme"
        }
      ],
      "get": {
        "operationId": "getAtom",
        "summary": "Atom feed: one entry per incident or maintenance update",
        "responses": {
          "200": {
            "description": "Atom 1.0.",
            "content": {
              "application/atom+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "There is no status page at this address.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no status page at this address."
                }
              }
            }
          }
        }
      }
    },
    "/pages/{slug}/calendar.ics": {
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "description": "The page's address: status-free.openapps.xyz/<slug>.",
          "schema": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"
          },
          "example": "acme"
        }
      ],
      "get": {
        "operationId": "getCalendar",
        "summary": "Maintenance windows as an iCalendar feed to subscribe to",
        "responses": {
          "200": {
            "description": "iCalendar.",
            "content": {
              "text/calendar": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "There is no status page at this address.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no status page at this address."
                }
              }
            }
          }
        }
      }
    },
    "/pages/{slug}/components": {
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "description": "The page's address: status-free.openapps.xyz/<slug>.",
          "schema": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"
          },
          "example": "acme"
        }
      ],
      "post": {
        "operationId": "addComponent",
        "summary": "Add a component",
        "security": [
          {
            "ownerKey": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ComponentInput"
              },
              "example": {
                "name": "Mobile app",
                "group": "Apps"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The component. Its id comes from its name unless you send one.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Component"
                }
              }
            }
          },
          "400": {
            "description": "Add a component name.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Add a component name."
                }
              }
            }
          },
          "401": {
            "description": "Send the page's owner key in the x-owner-key header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send the page's owner key in the x-owner-key header."
                }
              }
            }
          },
          "403": {
            "description": "That owner key does not match this status page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "That owner key does not match this status page."
                }
              }
            }
          },
          "404": {
            "description": "There is no status page at this address.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no status page at this address."
                }
              }
            }
          },
          "409": {
            "description": "There is already a component \"api\".",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is already a component \"api\"."
                }
              }
            }
          }
        }
      }
    },
    "/pages/{slug}/components/{id}": {
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "description": "The page's address: status-free.openapps.xyz/<slug>.",
          "schema": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"
          },
          "example": "acme"
        },
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Component id, like api or mobile-app.",
          "schema": {
            "type": "string"
          },
          "example": "api"
        }
      ],
      "patch": {
        "operationId": "updateComponent",
        "summary": "Set a component's status (or rename, regroup, reorder it)",
        "security": [
          {
            "ownerKey": []
          }
        ],
        "description": "With incident (a title), a component that goes down opens that incident once, and coming back to operational resolves the open incidents it was in once every component they affect is operational. Repeating the same call changes nothing, so a check can send it every few minutes.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ComponentPatch"
              },
              "example": {
                "status": "major_outage",
                "incident": "Website is down"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The component, and the incident it opened, updated or resolved if you sent incident.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Component"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "incident": {
                          "$ref": "#/components/schemas/Event"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "status must be one of operational, degraded_performance, partial_outage, major_outage, under_maintenance.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "status must be one of operational, degraded_performance, partial_outage, major_outage, under_maintenance."
                }
              }
            }
          },
          "401": {
            "description": "Send the page's owner key in the x-owner-key header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send the page's owner key in the x-owner-key header."
                }
              }
            }
          },
          "403": {
            "description": "That owner key does not match this status page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "That owner key does not match this status page."
                }
              }
            }
          },
          "404": {
            "description": "There is no component \"web\" on this page. Components: website, api.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no component \"web\" on this page. Components: website, api."
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteComponent",
        "summary": "Remove a component",
        "security": [
          {
            "ownerKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Removed.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "deleted": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "deleted": "api"
                }
              }
            }
          },
          "401": {
            "description": "Send the page's owner key in the x-owner-key header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send the page's owner key in the x-owner-key header."
                }
              }
            }
          },
          "403": {
            "description": "That owner key does not match this status page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "That owner key does not match this status page."
                }
              }
            }
          },
          "404": {
            "description": "There is no status page at this address.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no status page at this address."
                }
              }
            }
          }
        }
      }
    },
    "/pages/{slug}/incidents": {
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "description": "The page's address: status-free.openapps.xyz/<slug>.",
          "schema": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"
          },
          "example": "acme"
        }
      ],
      "get": {
        "operationId": "listIncidents",
        "summary": "Every incident and maintenance window, newest first, 50 at a time (no key needed)",
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "nextCursor from the previous answer.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of incidents.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "incidents": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Event"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "incidents",
                    "nextCursor"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "The cursor does not work.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "That cursor does not work. Send the nextCursor from the previous answer, or leave it out."
                }
              }
            }
          },
          "404": {
            "description": "There is no status page at this address.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no status page at this address."
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "openIncident",
        "summary": "Open an incident",
        "security": [
          {
            "ownerKey": []
          }
        ],
        "description": "components sets those components' statuses now. To record a past incident, send status resolved with startedAt and resolvedAt: it goes into the history and changes nothing now.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IncidentInput"
              },
              "example": {
                "title": "API errors",
                "status": "investigating",
                "message": "Some requests fail. We are looking into it.",
                "components": {
                  "api": "major_outage"
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The incident.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Event"
                },
                "example": {
                  "id": "k3m8x2pq",
                  "kind": "incident",
                  "title": "API errors",
                  "status": "investigating",
                  "url": "https://status-free.openapps.xyz/acme/incidents/k3m8x2pq",
                  "components": [
                    {
                      "id": "api",
                      "name": "API",
                      "status": "major_outage"
                    }
                  ],
                  "updates": [
                    {
                      "status": "investigating",
                      "message": "Some requests fail. We are looking into it.",
                      "at": "2026-10-19T14:02:00.000Z",
                      "components": {
                        "api": "major_outage"
                      }
                    }
                  ],
                  "startedAt": "2026-10-19T14:02:00.000Z",
                  "resolvedAt": null
                }
              }
            }
          },
          "400": {
            "description": "Add a title.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Add a title."
                }
              }
            }
          },
          "401": {
            "description": "Send the page's owner key in the x-owner-key header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send the page's owner key in the x-owner-key header."
                }
              }
            }
          },
          "403": {
            "description": "That owner key does not match this status page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "That owner key does not match this status page."
                }
              }
            }
          },
          "404": {
            "description": "There is no status page at this address.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no status page at this address."
                }
              }
            }
          }
        }
      }
    },
    "/pages/{slug}/incidents/{id}": {
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "description": "The page's address: status-free.openapps.xyz/<slug>.",
          "schema": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"
          },
          "example": "acme"
        },
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "The incident id from the answer that made it.",
          "schema": {
            "type": "string",
            "pattern": "^[a-z0-9]{6,24}$"
          },
          "example": "k3m8x2pq"
        }
      ],
      "get": {
        "operationId": "getIncident",
        "summary": "One incident or maintenance window with all its updates (no key needed)",
        "responses": {
          "200": {
            "description": "The incident.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Event"
                },
                "example": {
                  "id": "k3m8x2pq",
                  "kind": "incident",
                  "title": "API errors",
                  "status": "identified",
                  "url": "https://status-free.openapps.xyz/acme/incidents/k3m8x2pq",
                  "components": [
                    {
                      "id": "api",
                      "name": "API",
                      "status": "major_outage"
                    }
                  ],
                  "updates": [
                    {
                      "status": "identified",
                      "message": "A bad deploy. Rolling back.",
                      "at": "2026-10-19T14:20:00.000Z",
                      "components": {
                        "api": "partial_outage"
                      }
                    },
                    {
                      "status": "investigating",
                      "message": "Some requests fail. We are looking into it.",
                      "at": "2026-10-19T14:02:00.000Z",
                      "components": {
                        "api": "major_outage"
                      }
                    }
                  ],
                  "startedAt": "2026-10-19T14:02:00.000Z",
                  "resolvedAt": null
                }
              }
            }
          },
          "404": {
            "description": "There is no incident or maintenance with that id on this page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no incident or maintenance with that id on this page."
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteIncident",
        "summary": "Remove an incident (component statuses stay as they are)",
        "security": [
          {
            "ownerKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Removed.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "deleted": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Send the page's owner key in the x-owner-key header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send the page's owner key in the x-owner-key header."
                }
              }
            }
          },
          "403": {
            "description": "That owner key does not match this status page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "That owner key does not match this status page."
                }
              }
            }
          },
          "404": {
            "description": "There is no status page at this address.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no status page at this address."
                }
              }
            }
          }
        }
      }
    },
    "/pages/{slug}/incidents/{id}/updates": {
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "description": "The page's address: status-free.openapps.xyz/<slug>.",
          "schema": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"
          },
          "example": "acme"
        },
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "The incident id from the answer that made it.",
          "schema": {
            "type": "string",
            "pattern": "^[a-z0-9]{6,24}$"
          },
          "example": "k3m8x2pq"
        }
      ],
      "post": {
        "operationId": "updateIncident",
        "summary": "Post an update; status resolved resolves the incident",
        "security": [
          {
            "ownerKey": []
          }
        ],
        "description": "Resolving puts the components the incident affected back to operational, unless another open incident still affects them or you send other statuses.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IncidentUpdate"
              },
              "example": {
                "status": "resolved",
                "message": "Fixed. Sorry for the trouble."
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The incident.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          },
          "400": {
            "description": "Send a message, a new status, or component statuses.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send a message, a new status, or component statuses."
                }
              }
            }
          },
          "401": {
            "description": "Send the page's owner key in the x-owner-key header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send the page's owner key in the x-owner-key header."
                }
              }
            }
          },
          "403": {
            "description": "That owner key does not match this status page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "That owner key does not match this status page."
                }
              }
            }
          },
          "404": {
            "description": "There is no incident with that id on this page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no incident with that id on this page."
                }
              }
            }
          }
        }
      }
    },
    "/pages/{slug}/maintenance": {
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "description": "The page's address: status-free.openapps.xyz/<slug>.",
          "schema": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"
          },
          "example": "acme"
        }
      ],
      "get": {
        "operationId": "listMaintenance",
        "summary": "Maintenance windows, newest first (no key needed)",
        "parameters": [
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of maintenance windows.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "incidents": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Event"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The cursor does not work.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "That cursor does not work. Send the nextCursor from the previous answer, or leave it out."
                }
              }
            }
          },
          "404": {
            "description": "There is no status page at this address.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no status page at this address."
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "scheduleMaintenance",
        "summary": "Schedule maintenance",
        "security": [
          {
            "ownerKey": []
          }
        ],
        "description": "While the window runs, its components show under maintenance. Up to 31 days long and up to a year ahead.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MaintenanceInput"
              },
              "example": {
                "title": "Database upgrade",
                "startsAt": "2026-10-25T02:00:00Z",
                "endsAt": "2026-10-25T04:00:00Z",
                "message": "Writes pause for up to 10 minutes.",
                "components": [
                  "database"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The maintenance window.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Event"
                },
                "example": {
                  "id": "w7c2k9ha",
                  "kind": "maintenance",
                  "title": "Database upgrade",
                  "status": "scheduled",
                  "url": "https://status-free.openapps.xyz/acme/incidents/w7c2k9ha",
                  "components": [
                    {
                      "id": "database",
                      "name": "Database",
                      "status": "under_maintenance"
                    }
                  ],
                  "updates": [
                    {
                      "status": "scheduled",
                      "message": "Writes pause for up to 10 minutes.",
                      "at": "2026-10-19T14:02:00.000Z"
                    }
                  ],
                  "startsAt": "2026-10-25T02:00:00.000Z",
                  "endsAt": "2026-10-25T04:00:00.000Z"
                }
              }
            }
          },
          "400": {
            "description": "The maintenance must end after it starts.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "The maintenance must end after it starts."
                }
              }
            }
          },
          "401": {
            "description": "Send the page's owner key in the x-owner-key header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send the page's owner key in the x-owner-key header."
                }
              }
            }
          },
          "403": {
            "description": "That owner key does not match this status page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "That owner key does not match this status page."
                }
              }
            }
          },
          "404": {
            "description": "There is no status page at this address.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no status page at this address."
                }
              }
            }
          }
        }
      }
    },
    "/pages/{slug}/maintenance/{id}": {
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "description": "The page's address: status-free.openapps.xyz/<slug>.",
          "schema": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"
          },
          "example": "acme"
        },
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "The maintenance id from the answer that made it.",
          "schema": {
            "type": "string",
            "pattern": "^[a-z0-9]{6,24}$"
          },
          "example": "k3m8x2pq"
        }
      ],
      "get": {
        "operationId": "getMaintenance",
        "summary": "One maintenance window (no key needed)",
        "responses": {
          "200": {
            "description": "The maintenance window.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Event"
                },
                "example": {
                  "id": "w7c2k9ha",
                  "kind": "maintenance",
                  "title": "Database upgrade",
                  "status": "scheduled",
                  "url": "https://status-free.openapps.xyz/acme/incidents/w7c2k9ha",
                  "components": [
                    {
                      "id": "database",
                      "name": "Database",
                      "status": "under_maintenance"
                    }
                  ],
                  "updates": [
                    {
                      "status": "scheduled",
                      "message": "Writes pause for up to 10 minutes.",
                      "at": "2026-10-19T14:02:00.000Z"
                    }
                  ],
                  "startsAt": "2026-10-25T02:00:00.000Z",
                  "endsAt": "2026-10-25T04:00:00.000Z"
                }
              }
            }
          },
          "404": {
            "description": "There is no status page at this address.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no status page at this address."
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteMaintenance",
        "summary": "Remove a maintenance window",
        "security": [
          {
            "ownerKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Removed.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "deleted": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Send the page's owner key in the x-owner-key header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send the page's owner key in the x-owner-key header."
                }
              }
            }
          },
          "403": {
            "description": "That owner key does not match this status page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "That owner key does not match this status page."
                }
              }
            }
          },
          "404": {
            "description": "There is no status page at this address.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no status page at this address."
                }
              }
            }
          }
        }
      }
    },
    "/pages/{slug}/maintenance/{id}/updates": {
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "description": "The page's address: status-free.openapps.xyz/<slug>.",
          "schema": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"
          },
          "example": "acme"
        },
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "The maintenance id from the answer that made it.",
          "schema": {
            "type": "string",
            "pattern": "^[a-z0-9]{6,24}$"
          },
          "example": "k3m8x2pq"
        }
      ],
      "post": {
        "operationId": "updateMaintenance",
        "summary": "Post a message, start early, complete, cancel or move a maintenance window",
        "security": [
          {
            "ownerKey": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MaintenanceUpdate"
              },
              "example": {
                "status": "completed",
                "message": "Done early."
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The maintenance window.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          },
          "400": {
            "description": "This maintenance has not started yet. Cancel it instead.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "This maintenance has not started yet. Cancel it instead."
                }
              }
            }
          },
          "401": {
            "description": "Send the page's owner key in the x-owner-key header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send the page's owner key in the x-owner-key header."
                }
              }
            }
          },
          "403": {
            "description": "That owner key does not match this status page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "That owner key does not match this status page."
                }
              }
            }
          },
          "404": {
            "description": "There is no status page at this address.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "There is no status page at this address."
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ownerKey": {
        "type": "apiKey",
        "in": "header",
        "name": "x-owner-key",
        "description": "The page's owner key, returned when the page was made. Authorization: Bearer <key> also works."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string"
          }
        },
        "required": [
          "error"
        ]
      },
      "ComponentStatus": {
        "type": "string",
        "enum": [
          "operational",
          "degraded_performance",
          "partial_outage",
          "major_outage",
          "under_maintenance"
        ]
      },
      "Time": {
        "type": "string",
        "description": "ISO 8601, like 2026-10-25T02:00:00Z, or unix seconds.",
        "examples": [
          "2026-10-25T02:00:00Z"
        ]
      },
      "Component": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "group": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "$ref": "#/components/schemas/ComponentStatus",
            "description": "Under maintenance while a maintenance window that lists it runs."
          },
          "updatedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "uptime90d": {
            "type": "number",
            "description": "Percent of the last 90 days (or since the page was made) without a partial or major outage, from incidents."
          },
          "incidentDays": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "date": {
                  "type": "string",
                  "format": "date"
                },
                "status": {
                  "$ref": "#/components/schemas/ComponentStatus"
                },
                "downMinutes": {
                  "type": "integer"
                },
                "incidents": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "required": [
          "id",
          "name",
          "status"
        ]
      },
      "Update": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "at": {
            "type": "string",
            "format": "date-time"
          },
          "components": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/ComponentStatus"
            }
          }
        },
        "required": [
          "status",
          "message",
          "at"
        ]
      },
      "Event": {
        "type": "object",
        "description": "An incident or a maintenance window. Updates are newest first.",
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "incident",
              "maintenance"
            ]
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "description": "Incidents: investigating, identified, monitoring, resolved. Maintenance: scheduled, in_progress, completed, cancelled."
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "components": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "status": {
                  "$ref": "#/components/schemas/ComponentStatus"
                }
              }
            }
          },
          "updates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Update"
            }
          },
          "startedAt": {
            "type": "string",
            "format": "date-time"
          },
          "resolvedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "startsAt": {
            "type": "string",
            "format": "date-time"
          },
          "endsAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "kind",
          "title",
          "status",
          "url",
          "components",
          "updates"
        ]
      },
      "PageStatus": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "about": {
            "type": [
              "string",
              "null"
            ]
          },
          "website": {
            "type": [
              "string",
              "null"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "status": {
            "type": "object",
            "properties": {
              "indicator": {
                "type": "string",
                "enum": [
                  "none",
                  "minor",
                  "major",
                  "critical",
                  "maintenance"
                ]
              },
              "description": {
                "type": "string"
              }
            },
            "required": [
              "indicator",
              "description"
            ]
          },
          "components": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Component"
            }
          },
          "incidents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Event"
            },
            "description": "Open incidents."
          },
          "maintenance": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Event"
            },
            "description": "Maintenance running now or coming up."
          },
          "recent": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Event"
            },
            "description": "Up to 20 resolved incidents and finished maintenance from the last 90 days."
          },
          "historySince": {
            "type": "string",
            "format": "date-time"
          },
          "feeds": {
            "type": "object",
            "properties": {
              "json": {
                "type": "string"
              },
              "rss": {
                "type": "string"
              },
              "atom": {
                "type": "string"
              },
              "calendar": {
                "type": "string"
              },
              "badge": {
                "type": "string"
              }
            }
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "slug",
          "name",
          "url",
          "status",
          "components",
          "incidents",
          "maintenance",
          "recent",
          "feeds"
        ]
      },
      "CreatePage": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"
          },
          "name": {
            "type": "string",
            "maxLength": 80
          },
          "about": {
            "type": "string",
            "maxLength": 300
          },
          "website": {
            "type": "string",
            "maxLength": 300
          },
          "showCredit": {
            "type": "boolean"
          },
          "components": {
            "type": "array",
            "maxItems": 60,
            "items": {
              "oneOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/components/schemas/ComponentInput"
                }
              ]
            }
          }
        },
        "required": [
          "slug",
          "name"
        ]
      },
      "PagePatch": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 80
          },
          "about": {
            "type": "string",
            "maxLength": 300
          },
          "website": {
            "type": "string",
            "maxLength": 300
          },
          "showCredit": {
            "type": "boolean"
          }
        }
      },
      "ComponentInput": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 80
          },
          "group": {
            "type": "string",
            "maxLength": 60
          },
          "description": {
            "type": "string",
            "maxLength": 200
          },
          "status": {
            "type": "string"
          },
          "id": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]{0,39}$"
          }
        },
        "required": [
          "name"
        ]
      },
      "ComponentPatch": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "description": "A component status, or up, degraded, partial, down, maintenance."
          },
          "name": {
            "type": "string"
          },
          "group": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "order": {
            "type": "integer"
          },
          "incident": {
            "type": "string",
            "maxLength": 200,
            "description": "Title of the incident to open when this component goes down; coming back up resolves it."
          },
          "message": {
            "type": "string",
            "maxLength": 5000,
            "description": "Message for the incident that incident opens, updates or resolves."
          }
        }
      },
      "IncidentInput": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "status": {
            "type": "string",
            "enum": [
              "investigating",
              "identified",
              "monitoring",
              "resolved"
            ],
            "default": "investigating"
          },
          "message": {
            "type": "string",
            "maxLength": 5000
          },
          "components": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Component id (or name) to status."
          },
          "startedAt": {
            "$ref": "#/components/schemas/Time"
          },
          "resolvedAt": {
            "$ref": "#/components/schemas/Time"
          }
        },
        "required": [
          "title"
        ]
      },
      "IncidentUpdate": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "investigating",
              "identified",
              "monitoring",
              "resolved"
            ]
          },
          "message": {
            "type": "string",
            "maxLength": 5000
          },
          "components": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "title": {
            "type": "string",
            "maxLength": 200
          }
        }
      },
      "MaintenanceInput": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "startsAt": {
            "$ref": "#/components/schemas/Time"
          },
          "endsAt": {
            "$ref": "#/components/schemas/Time"
          },
          "message": {
            "type": "string",
            "maxLength": 5000
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "title",
          "startsAt",
          "endsAt"
        ]
      },
      "MaintenanceUpdate": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "scheduled",
              "in_progress",
              "completed",
              "cancelled"
            ]
          },
          "message": {
            "type": "string",
            "maxLength": 5000
          },
          "startsAt": {
            "$ref": "#/components/schemas/Time"
          },
          "endsAt": {
            "$ref": "#/components/schemas/Time"
          },
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}
