{
  "openapi": "3.1.0",
  "info": {
    "title": "Holler If It\u2019s Down API",
    "version": "1.1.0",
    "description": "Uptime for humans and agents. Same workspace, same permissions, same observations. Free core product; self-hosted operation incurs infrastructure costs."
  },
  "servers": [
    {
      "url": "/"
    }
  ],
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer"
      }
    },
    "schemas": {
      "MonitorInput": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Public HTTP/HTTPS endpoint, no credentials, ports 80 or 443."
          },
          "interval_seconds": {
            "type": "integer",
            "enum": [
              60,
              300,
              1200
            ],
            "default": 60
          },
          "timeout_seconds": {
            "type": "integer",
            "minimum": 2,
            "maximum": 15,
            "default": 10
          },
          "expected_status": {
            "type": "integer",
            "minimum": 100,
            "maximum": 599,
            "default": 200
          },
          "slow_ms": {
            "type": "integer",
            "minimum": 100,
            "maximum": 15000,
            "default": 1500
          },
          "public": {
            "type": "boolean",
            "default": true
          },
          "paused": {
            "type": "boolean",
            "default": false
          },
          "maintenance_until": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Unix seconds; at most 30 days ahead."
          }
        },
        "required": [
          "name",
          "url"
        ],
        "additionalProperties": false
      }
    }
  },
  "paths": {
    "/api/v1/status/{slug}": {
      "get": {
        "operationId": "get__status_slug",
        "summary": "Read a public status page",
        "description": "Target URLs and private monitors are omitted. Availability is sample-based; missing observations never count as successful.",
        "security": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/auth/request": {
      "post": {
        "operationId": "post__auth_request",
        "summary": "Email a sign-in code",
        "description": "",
        "security": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email"
                  }
                },
                "required": [
                  "email"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/api/v1/auth/verify": {
      "post": {
        "operationId": "post__auth_verify",
        "summary": "Verify a code and create an account if needed",
        "description": "",
        "security": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "challenge": {
                    "type": "string"
                  },
                  "code": {
                    "type": "string",
                    "pattern": "^[0-9]{6}$"
                  }
                },
                "required": [
                  "challenge",
                  "code"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/api/v1/auth/key": {
      "post": {
        "operationId": "post__auth_key",
        "summary": "Exchange an API key for a browser session",
        "description": "",
        "security": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "key": {
                    "type": "string"
                  }
                },
                "required": [
                  "key"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/api/v1/session": {
      "delete": {
        "operationId": "delete__session",
        "summary": "Sign out the current browser session",
        "description": "",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        }
      }
    },
    "/api/v1/me": {
      "get": {
        "operationId": "get__me",
        "summary": "Read current workspace and identity",
        "description": "",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        }
      }
    },
    "/api/v1/workspace": {
      "put": {
        "operationId": "put__workspace",
        "summary": "Update workspace name and public slug",
        "description": "Admin scope required.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  "slug": {
                    "type": "string",
                    "pattern": "^[a-z0-9][a-z0-9-]{2,47}$"
                  }
                },
                "required": [
                  "name",
                  "slug"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/api/v1/monitors": {
      "get": {
        "operationId": "get__monitors",
        "summary": "List workspace monitors and statistics",
        "description": "",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        }
      },
      "post": {
        "operationId": "post__monitors",
        "summary": "Create a monitor",
        "description": "Write scope required. Ten monitors per workspace. No idempotency guarantee: reconcile uncertain creates before retrying.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  "url": {
                    "type": "string",
                    "format": "uri",
                    "description": "Public HTTP/HTTPS endpoint, no credentials, ports 80 or 443."
                  },
                  "interval_seconds": {
                    "type": "integer",
                    "enum": [
                      60,
                      300,
                      1200
                    ],
                    "default": 60
                  },
                  "timeout_seconds": {
                    "type": "integer",
                    "minimum": 2,
                    "maximum": 15,
                    "default": 10
                  },
                  "expected_status": {
                    "type": "integer",
                    "minimum": 100,
                    "maximum": 599,
                    "default": 200
                  },
                  "slow_ms": {
                    "type": "integer",
                    "minimum": 100,
                    "maximum": 15000,
                    "default": 1500
                  },
                  "public": {
                    "type": "boolean",
                    "default": true
                  },
                  "paused": {
                    "type": "boolean",
                    "default": false
                  },
                  "maintenance_until": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "description": "Unix seconds; at most 30 days ahead."
                  }
                },
                "required": [
                  "name",
                  "url"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/api/v1/monitors/{id}": {
      "put": {
        "operationId": "put__monitors_id",
        "summary": "Replace editable monitor settings",
        "description": "Write scope. Preserve existing settings. URL and expected_status are immutable; create a new monitor to change them.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  "url": {
                    "type": "string",
                    "format": "uri",
                    "description": "Public HTTP/HTTPS endpoint, no credentials, ports 80 or 443."
                  },
                  "interval_seconds": {
                    "type": "integer",
                    "enum": [
                      60,
                      300,
                      1200
                    ],
                    "default": 60
                  },
                  "timeout_seconds": {
                    "type": "integer",
                    "minimum": 2,
                    "maximum": 15,
                    "default": 10
                  },
                  "expected_status": {
                    "type": "integer",
                    "minimum": 100,
                    "maximum": 599,
                    "default": 200
                  },
                  "slow_ms": {
                    "type": "integer",
                    "minimum": 100,
                    "maximum": 15000,
                    "default": 1500
                  },
                  "public": {
                    "type": "boolean",
                    "default": true
                  },
                  "paused": {
                    "type": "boolean",
                    "default": false
                  },
                  "maintenance_until": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "description": "Unix seconds; at most 30 days ahead."
                  }
                },
                "required": [
                  "name",
                  "url"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "delete__monitors_id",
        "summary": "Permanently delete a monitor and its history",
        "description": "Write scope required.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/monitors/{id}/check": {
      "post": {
        "operationId": "post__monitors_id_check",
        "summary": "Queue an immediate check",
        "description": "Write scope. One request per 30 seconds. Check history for the result.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "202": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/monitors/{id}/checks": {
      "get": {
        "operationId": "get__monitors_id_checks",
        "summary": "Read the latest 200 check results",
        "description": "",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/incidents": {
      "get": {
        "operationId": "get__incidents",
        "summary": "Read the latest 100 incidents and updates",
        "description": "",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        }
      }
    },
    "/api/v1/incidents/{id}/updates": {
      "post": {
        "operationId": "post__incidents_id_updates",
        "summary": "Post an incident update",
        "description": "Write scope. Updates for public monitors are public.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "body": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000
                  }
                },
                "required": [
                  "body"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/api/v1/keys": {
      "get": {
        "operationId": "get__keys",
        "summary": "List scoped API keys without secrets",
        "description": "Admin scope required.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        }
      },
      "post": {
        "operationId": "post__keys",
        "summary": "Create a scoped API key, returned once",
        "description": "Admin scope. Store the returned key securely.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  "scope": {
                    "type": "string",
                    "enum": [
                      "read",
                      "write",
                      "admin"
                    ]
                  }
                },
                "required": [
                  "name",
                  "scope"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/api/v1/keys/{id}": {
      "delete": {
        "operationId": "delete__keys_id",
        "summary": "Revoke a key and its sessions",
        "description": "Admin scope. Cannot revoke your own key or email sign-in identities.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/activity": {
      "get": {
        "operationId": "get__activity",
        "summary": "Read the latest 100 audit actions",
        "description": "",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        }
      }
    },
    "/api/v1/notifications": {
      "get": {
        "operationId": "get__notifications",
        "summary": "Read the latest 50 email delivery states",
        "description": "",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        }
      }
    },
    "/api/v1/team": {
      "get": {
        "operationId": "get__team",
        "summary": "List team members, invitations, and your alert preference",
        "description": "",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        }
      }
    },
    "/api/v1/team/invitations": {
      "post": {
        "operationId": "post__team_invitations",
        "summary": "Invite a member by email",
        "description": "Admin scope. Invitation expires after seven days; access requires verified recipient acceptance.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email"
                  }
                },
                "required": [
                  "email"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/api/v1/team/invitations/{id}": {
      "delete": {
        "operationId": "delete__team_invitations_id",
        "summary": "Cancel an invitation",
        "description": "Admin scope.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/team/{id}": {
      "delete": {
        "operationId": "delete__team_id",
        "summary": "Remove a member and invalidate their team sessions",
        "description": "Admin scope. Cannot remove the owner.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/workspaces": {
      "get": {
        "operationId": "get__workspaces",
        "summary": "List workspaces for your email identity",
        "description": "",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        }
      }
    },
    "/api/v1/workspaces/{id}/switch": {
      "post": {
        "operationId": "post__workspaces_id_switch",
        "summary": "Switch browser session to a workspace you belong to",
        "description": "",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/team-invitations": {
      "get": {
        "operationId": "get__team-invitations",
        "summary": "List invitations addressed to your verified email",
        "description": "",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        }
      }
    },
    "/api/v1/team-invitations/{id}/accept": {
      "post": {
        "operationId": "post__team-invitations_id_accept",
        "summary": "Accept your invitation",
        "description": "Requires an email-authenticated identity. Creates a team session; API keys cannot impersonate recipients.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "alerts": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "alerts"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/api/v1/alert-preferences": {
      "put": {
        "operationId": "put__alert-preferences",
        "summary": "Set your down/up email preference in this workspace",
        "description": "",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "401": {
            "description": "Authentication required"
          },
          "403": {
            "description": "Scope or origin denied"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict or limit"
          },
          "429": {
            "description": "Rate limited"
          },
          "500": {
            "description": "Server error"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "enabled": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "enabled"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      }
    },
    "/api/v1/billing": {
      "get": {
        "summary": "Read billing",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          },
          "400": {
            "description": "Invalid input"
          },
          "403": {
            "description": "Insufficient permission"
          },
          "409": {
            "description": "Capacity or state conflict"
          }
        }
      }
    },
    "/api/v1/billing/checkout": {
      "post": {
        "summary": "Create checkout",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          },
          "400": {
            "description": "Invalid input"
          },
          "403": {
            "description": "Insufficient permission"
          },
          "409": {
            "description": "Capacity or state conflict"
          }
        },
        "description": "Signed-in workspace owner or installation-owner key only. First purchase returns Stripe Checkout URL. Existing subscription changes may charge the saved payment method immediately with prorations. Obtain explicit purchase authorization; never invoke speculatively. Pending payment returns invoice URL without granting extra capacity.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "monitor_packs",
                  "extra_pages"
                ],
                "properties": {
                  "monitor_packs": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 100
                  },
                  "extra_pages": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 100
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/billing/portal": {
      "post": {
        "summary": "Create portal",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          },
          "400": {
            "description": "Invalid input"
          },
          "403": {
            "description": "Insufficient permission"
          },
          "409": {
            "description": "Capacity or state conflict"
          }
        },
        "description": "Signed-in workspace owner only; returns a short-lived Stripe portal URL for invoices, payment methods and cancellation at renewal."
      }
    },
    "/api/v1/pages": {
      "get": {
        "summary": "Read pages",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          },
          "400": {
            "description": "Invalid input"
          },
          "403": {
            "description": "Insufficient permission"
          },
          "409": {
            "description": "Capacity or state conflict"
          }
        }
      },
      "post": {
        "summary": "Create pages",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          },
          "400": {
            "description": "Invalid input"
          },
          "403": {
            "description": "Insufficient permission"
          },
          "409": {
            "description": "Capacity or state conflict"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name",
                  "slug",
                  "monitor_ids"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "maxLength": 80
                  },
                  "slug": {
                    "type": "string",
                    "pattern": "^[a-z0-9][a-z0-9-]{2,47}$"
                  },
                  "monitor_ids": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Public monitors owned by this workspace"
                  }
                }
              }
            }
          }
        },
        "description": "Admin scope. Extra pages require paid page capacity. The default included page is edited via /workspace."
      }
    },
    "/api/v1/pages/{id}": {
      "put": {
        "summary": "Update {id}",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          },
          "400": {
            "description": "Invalid input"
          },
          "403": {
            "description": "Insufficient permission"
          },
          "409": {
            "description": "Capacity or state conflict"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name",
                  "slug",
                  "monitor_ids"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "maxLength": 80
                  },
                  "slug": {
                    "type": "string",
                    "pattern": "^[a-z0-9][a-z0-9-]{2,47}$"
                  },
                  "monitor_ids": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Public monitors owned by this workspace"
                  }
                }
              }
            }
          }
        },
        "description": "Admin scope. Extra pages require paid page capacity. The default included page is edited via /workspace."
      },
      "delete": {
        "summary": "Delete {id}",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          },
          "400": {
            "description": "Invalid input"
          },
          "403": {
            "description": "Insufficient permission"
          },
          "409": {
            "description": "Capacity or state conflict"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    }
  }
}
