{
  "components": {},
  "info": {
    "title": "Vix API",
    "version": "1.33.0"
  },
  "openapi": "3.0.3",
  "paths": {
    "/": {
      "get": {
        "operationId": "get",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "options": {
        "operationId": "options",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/_meta": {
      "get": {
        "operationId": "get___meta",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "options": {
        "operationId": "options___meta",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/monitors": {
      "get": {
        "operationId": "get__api_monitors",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "options": {
        "operationId": "options__api_monitors",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "post": {
        "operationId": "post__api_monitors",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/monitors/{id}": {
      "delete": {
        "operationId": "delete__api_monitors__id",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "get": {
        "operationId": "get__api_monitors__id",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "options": {
        "operationId": "options__api_monitors__id",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "put": {
        "operationId": "put__api_monitors__id",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/monitors/{id}/pause": {
      "options": {
        "operationId": "options__api_monitors__id__pause",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "post": {
        "operationId": "post__api_monitors__id__pause",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/monitors/{id}/resume": {
      "options": {
        "operationId": "options__api_monitors__id__resume",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "post": {
        "operationId": "post__api_monitors__id__resume",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/status/summary": {
      "get": {
        "operationId": "get__api_status_summary",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "options": {
        "operationId": "options__api_status_summary",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/status/{slug}": {
      "get": {
        "operationId": "get__api_status__slug",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "options": {
        "operationId": "options__api_status__slug",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/bench": {
      "get": {
        "operationId": "get__bench",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/docs": {
      "get": {
        "description": "Swagger UI page that renders /openapi.json (offline assets).",
        "operationId": "get__docs",
        "responses": {
          "200": {
            "description": "HTML page"
          }
        },
        "summary": "Interactive API docs",
        "tags": [
          "docs"
        ]
      }
    },
    "/docs/index.html": {
      "get": {
        "description": "Same as /docs. Convenience path for static-like expectations.",
        "operationId": "get__docs_index_html",
        "responses": {
          "200": {
            "description": "HTML page"
          }
        },
        "summary": "Interactive API docs (index)",
        "tags": [
          "docs"
        ]
      }
    },
    "/docs/swagger-ui-bundle.js": {
      "get": {
        "description": "Embedded Swagger UI JS bundle served locally.",
        "operationId": "get__docs_swagger_ui_bundle_js",
        "responses": {
          "200": {
            "description": "JavaScript"
          }
        },
        "summary": "Swagger UI bundle JS (offline)",
        "tags": [
          "docs"
        ]
      }
    },
    "/docs/swagger-ui.css": {
      "get": {
        "description": "Embedded Swagger UI stylesheet served locally.",
        "operationId": "get__docs_swagger_ui_css",
        "responses": {
          "200": {
            "description": "CSS"
          }
        },
        "summary": "Swagger UI CSS (offline)",
        "tags": [
          "docs"
        ]
      }
    },
    "/health": {
      "get": {
        "operationId": "get__health",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "options": {
        "operationId": "options__health",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/metrics": {
      "get": {
        "description": "Prometheus text metrics for the WebSocket runtime. This endpoint may be served by the main HTTP app or by a dedicated exporter.",
        "operationId": "get__metrics",
        "responses": {
          "200": {
            "description": "Prometheus text format"
          },
          "501": {
            "description": "Not configured in this app"
          }
        },
        "summary": "WebSocket metrics",
        "tags": [
          "ws",
          "metrics"
        ]
      }
    },
    "/openapi.json": {
      "get": {
        "description": "Generated OpenAPI 3.0 document for this Vix HTTP router.",
        "operationId": "get__openapi_json",
        "responses": {
          "200": {
            "description": "OpenAPI JSON"
          }
        },
        "summary": "OpenAPI spec",
        "tags": [
          "docs"
        ]
      }
    },
    "/status/{slug}": {
      "get": {
        "operationId": "get__status__slug",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "options": {
        "operationId": "options__status__slug",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/ws": {
      "get": {
        "description": "WebSocket upgrade endpoint. Connect using a WebSocket client. Swagger UI cannot fully exercise the 101 upgrade, but the route is documented for clients.",
        "operationId": "get__ws",
        "responses": {
          "101": {
            "description": "Switching Protocols (WebSocket upgrade)"
          },
          "426": {
            "description": "Upgrade Required (when called as plain HTTP)"
          }
        },
        "summary": "WebSocket endpoint",
        "tags": [
          "ws"
        ],
        "x-ws-upgrade": true,
        "x-ws-url": "ws://<host>:<ws_port>/"
      }
    },
    "/ws/poll": {
      "get": {
        "description": "HTTP long-polling bridge. Use when WebSocket is not available. Query params: session_id (string), max (int).",
        "operationId": "get__ws_poll",
        "responses": {
          "200": {
            "description": "Array of queued messages"
          },
          "503": {
            "description": "Long-poll bridge not attached"
          }
        },
        "summary": "WebSocket long-poll (pull)",
        "tags": [
          "ws",
          "long-poll"
        ]
      }
    },
    "/ws/send": {
      "post": {
        "description": "HTTP push entrypoint for the long-poll bridge. JSON body: type (string), payload (object), optional room, session_id, id, ts, kind.",
        "operationId": "post__ws_send",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "payload": {
                  "text": "Hello"
                },
                "room": "general",
                "type": "chat.message"
              },
              "schema": {
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "kind": {
                    "type": "string"
                  },
                  "payload": {
                    "type": "object"
                  },
                  "room": {
                    "type": "string"
                  },
                  "session_id": {
                    "type": "string"
                  },
                  "ts": {
                    "type": "string"
                  },
                  "type": {
                    "type": "string"
                  }
                },
                "required": [
                  "type"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "description": "Queued"
          },
          "400": {
            "description": "Invalid JSON body or missing fields"
          },
          "503": {
            "description": "Long-poll bridge not attached"
          }
        },
        "summary": "WebSocket long-poll (push)",
        "tags": [
          "ws",
          "long-poll"
        ]
      }
    }
  }
}