{
  "openapi": "3.0.3",
  "info": {
    "title": "Observe API",
    "version": "1.0.0",
    "description": "Observability \u2014 dashboards, widgets, alerts, syslog, and report cards."
  },
  "servers": [
    {
      "url": "https://versus-demo.com"
    }
  ],
  "paths": {
    "/api/alerts/": {
      "get": {
        "operationId": "alerts_list",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "required": false,
            "in": "query",
            "description": "A page number within the paginated result set.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "page_size",
            "required": false,
            "in": "query",
            "description": "Number of results to return per page.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "alerts"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedAlertList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List alerts"
      },
      "post": {
        "operationId": "alerts_create",
        "tags": [
          "alerts"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AlertRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AlertRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AlertRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Alert"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create alert"
      }
    },
    "/api/alerts/{id}/": {
      "get": {
        "operationId": "alerts_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "alerts"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Alert"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve alert"
      },
      "put": {
        "operationId": "alerts_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "alerts"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AlertRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AlertRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AlertRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Alert"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update alert"
      },
      "patch": {
        "operationId": "alerts_partial_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "alerts"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAlertRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAlertRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAlertRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Alert"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update alert"
      },
      "delete": {
        "operationId": "alerts_destroy",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "alerts"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete alert"
      }
    },
    "/api/alerts/mark_all_read/": {
      "post": {
        "operationId": "alerts_mark_all_read_create",
        "tags": [
          "alerts"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AlertRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AlertRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AlertRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Alert"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create mark all read"
      }
    },
    "/api/alerts/unread_count/": {
      "get": {
        "operationId": "alerts_unread_count_retrieve",
        "tags": [
          "alerts"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Alert"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List unread counts"
      }
    },
    "/api/dashboard-widgets/": {
      "get": {
        "operationId": "dashboard_widgets_list",
        "parameters": [
          {
            "in": "query",
            "name": "dashboard",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "required": false,
            "in": "query",
            "description": "A page number within the paginated result set.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "page_size",
            "required": false,
            "in": "query",
            "description": "Number of results to return per page.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "widget_type",
            "schema": {
              "type": "string",
              "enum": [
                "cert_expiry",
                "certificate",
                "config_drift",
                "device_pair",
                "f5_reportcard",
                "observe_dashboard",
                "pool_health",
                "route_delta",
                "unauthorized_changes",
                "virtual_server",
                "wideip",
                "workflow_sla"
              ]
            },
            "description": "* `virtual_server` - Virtual Server\n* `certificate` - Certificate\n* `device_pair` - Device Pair\n* `cert_expiry` - Certificate Expiry Countdown\n* `pool_health` - Pool Member Health Matrix\n* `config_drift` - Config Drift Indicator\n* `workflow_sla` - Workflow SLA Gauge\n* `route_delta` - Route Change Delta\n* `unauthorized_changes` - Unauthorized Changes\n* `observe_dashboard` - Observe Dashboard\n* `f5_reportcard` - F5 Report Card\n* `wideip` - WideIP"
          }
        ],
        "tags": [
          "dashboard-widgets"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedDashboardWidgetList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List dashboard widgets"
      },
      "post": {
        "operationId": "dashboard_widgets_create",
        "tags": [
          "dashboard-widgets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DashboardWidgetRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DashboardWidgetRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DashboardWidgetRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DashboardWidget"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create dashboard widget"
      }
    },
    "/api/dashboard-widgets/{id}/": {
      "get": {
        "operationId": "dashboard_widgets_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this dashboard widget.",
            "required": true
          }
        ],
        "tags": [
          "dashboard-widgets"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DashboardWidget"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve dashboard widget"
      },
      "put": {
        "operationId": "dashboard_widgets_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this dashboard widget.",
            "required": true
          }
        ],
        "tags": [
          "dashboard-widgets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DashboardWidgetRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DashboardWidgetRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DashboardWidgetRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DashboardWidget"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update dashboard widget"
      },
      "patch": {
        "operationId": "dashboard_widgets_partial_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this dashboard widget.",
            "required": true
          }
        ],
        "tags": [
          "dashboard-widgets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedDashboardWidgetRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedDashboardWidgetRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedDashboardWidgetRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DashboardWidget"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update dashboard widget"
      },
      "delete": {
        "operationId": "dashboard_widgets_destroy",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this dashboard widget.",
            "required": true
          }
        ],
        "tags": [
          "dashboard-widgets"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete dashboard widget"
      }
    },
    "/api/dashboard-widgets/cert-expiry-data/": {
      "get": {
        "operationId": "dashboard_widgets_cert_expiry_data_retrieve",
        "tags": [
          "dashboard-widgets"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DashboardWidget"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List cert expiry datas"
      }
    },
    "/api/dashboard-widgets/config-drift-data/": {
      "get": {
        "operationId": "dashboard_widgets_config_drift_data_retrieve",
        "tags": [
          "dashboard-widgets"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DashboardWidget"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List config drift datas"
      }
    },
    "/api/dashboard-widgets/pool-health-data/": {
      "get": {
        "operationId": "dashboard_widgets_pool_health_data_retrieve",
        "tags": [
          "dashboard-widgets"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DashboardWidget"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List pool health datas"
      }
    },
    "/api/dashboard-widgets/route-delta-data/": {
      "get": {
        "operationId": "dashboard_widgets_route_delta_data_retrieve",
        "tags": [
          "dashboard-widgets"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DashboardWidget"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List route delta datas"
      }
    },
    "/api/dashboard-widgets/route-delta-snapshot/": {
      "post": {
        "operationId": "dashboard_widgets_route_delta_snapshot_create",
        "tags": [
          "dashboard-widgets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DashboardWidgetRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DashboardWidgetRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DashboardWidgetRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DashboardWidget"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create route delta snapshot"
      }
    },
    "/api/dashboard-widgets/unauthorized-changes-data/": {
      "get": {
        "operationId": "dashboard_widgets_unauthorized_changes_data_retrieve",
        "tags": [
          "dashboard-widgets"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DashboardWidget"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List unauthorized changes datas"
      }
    },
    "/api/dashboard-widgets/workflow-sla-data/": {
      "get": {
        "operationId": "dashboard_widgets_workflow_sla_data_retrieve",
        "tags": [
          "dashboard-widgets"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DashboardWidget"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List workflow sla datas"
      }
    },
    "/api/dashboards/": {
      "get": {
        "operationId": "dashboards_list",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "required": false,
            "in": "query",
            "description": "A page number within the paginated result set.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "page_size",
            "required": false,
            "in": "query",
            "description": "Number of results to return per page.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "dashboards"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedDashboardList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List dashboards"
      },
      "post": {
        "operationId": "dashboards_create",
        "tags": [
          "dashboards"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DashboardRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DashboardRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DashboardRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dashboard"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create dashboard"
      }
    },
    "/api/dashboards/{id}/": {
      "get": {
        "operationId": "dashboards_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this dashboard.",
            "required": true
          }
        ],
        "tags": [
          "dashboards"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dashboard"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve dashboard"
      },
      "put": {
        "operationId": "dashboards_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this dashboard.",
            "required": true
          }
        ],
        "tags": [
          "dashboards"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DashboardRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DashboardRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DashboardRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dashboard"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update dashboard"
      },
      "patch": {
        "operationId": "dashboards_partial_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this dashboard.",
            "required": true
          }
        ],
        "tags": [
          "dashboards"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedDashboardRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedDashboardRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedDashboardRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dashboard"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update dashboard"
      },
      "delete": {
        "operationId": "dashboards_destroy",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this dashboard.",
            "required": true
          }
        ],
        "tags": [
          "dashboards"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete dashboard"
      }
    },
    "/api/observe/alerting/contact-points/": {
      "get": {
        "operationId": "observe_alerting_contact_points_list",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ContactPoint"
                  }
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List contact points"
      },
      "post": {
        "operationId": "observe_alerting_contact_points_create",
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContactPointRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ContactPointRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ContactPointRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContactPoint"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create contact point"
      }
    },
    "/api/observe/alerting/contact-points/{uid}/": {
      "get": {
        "operationId": "observe_alerting_contact_points_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContactPoint"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve contact point"
      },
      "put": {
        "operationId": "observe_alerting_contact_points_update",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContactPointRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ContactPointRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ContactPointRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContactPoint"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update contact point"
      },
      "patch": {
        "operationId": "observe_alerting_contact_points_partial_update",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedContactPointRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedContactPointRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedContactPointRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContactPoint"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update contact point"
      },
      "delete": {
        "operationId": "observe_alerting_contact_points_destroy",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete contact point"
      }
    },
    "/api/observe/alerting/contact-points/{uid}/test/": {
      "post": {
        "operationId": "observe_alerting_contact_points_test_create",
        "description": "Send a test notification to this contact point.",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContactPointRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ContactPointRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ContactPointRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContactPoint"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Test: contact point"
      }
    },
    "/api/observe/alerting/eval-groups/": {
      "get": {
        "operationId": "observe_alerting_eval_groups_list",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AlertEvalGroup"
                  }
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List eval groups"
      },
      "post": {
        "operationId": "observe_alerting_eval_groups_create",
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AlertEvalGroupRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AlertEvalGroupRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AlertEvalGroupRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertEvalGroup"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create eval group"
      }
    },
    "/api/observe/alerting/eval-groups/{uid}/": {
      "get": {
        "operationId": "observe_alerting_eval_groups_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertEvalGroup"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve eval group"
      },
      "put": {
        "operationId": "observe_alerting_eval_groups_update",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AlertEvalGroupRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AlertEvalGroupRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AlertEvalGroupRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertEvalGroup"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update eval group"
      },
      "patch": {
        "operationId": "observe_alerting_eval_groups_partial_update",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAlertEvalGroupRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAlertEvalGroupRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAlertEvalGroupRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertEvalGroup"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update eval group"
      },
      "delete": {
        "operationId": "observe_alerting_eval_groups_destroy",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete eval group"
      }
    },
    "/api/observe/alerting/eval-groups/{uid}/rules/": {
      "get": {
        "operationId": "observe_alerting_eval_groups_rules_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertEvalGroup"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Rules: eval group"
      }
    },
    "/api/observe/alerting/instances/": {
      "get": {
        "operationId": "observe_alerting_instances_list",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AlertInstance"
                  }
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List instances"
      }
    },
    "/api/observe/alerting/instances/{id}/": {
      "get": {
        "operationId": "observe_alerting_instances_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this alert instance.",
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertInstance"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve instance"
      }
    },
    "/api/observe/alerting/instances/{id}/history/": {
      "get": {
        "operationId": "observe_alerting_instances_history_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this alert instance.",
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertInstance"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "History: instance"
      }
    },
    "/api/observe/alerting/instances/{id}/silence/": {
      "post": {
        "operationId": "observe_alerting_instances_silence_create",
        "description": "Phase A silence: set state to Normal, record transition.\n(Phase B will add a proper Silence model with time windows.)",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this alert instance.",
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertInstance"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Silence: instance"
      }
    },
    "/api/observe/alerting/rules/": {
      "get": {
        "operationId": "observe_alerting_rules_list",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AlertRule"
                  }
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List rules"
      },
      "post": {
        "operationId": "observe_alerting_rules_create",
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AlertRuleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AlertRuleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AlertRuleRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertRule"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create rule"
      }
    },
    "/api/observe/alerting/rules/{uid}/": {
      "get": {
        "operationId": "observe_alerting_rules_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertRule"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve rule"
      },
      "put": {
        "operationId": "observe_alerting_rules_update",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AlertRuleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AlertRuleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AlertRuleRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertRule"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update rule"
      },
      "patch": {
        "operationId": "observe_alerting_rules_partial_update",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAlertRuleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAlertRuleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAlertRuleRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertRule"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update rule"
      },
      "delete": {
        "operationId": "observe_alerting_rules_destroy",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete rule"
      }
    },
    "/api/observe/alerting/rules/{uid}/instances/": {
      "get": {
        "operationId": "observe_alerting_rules_instances_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertRule"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Instances: rule"
      }
    },
    "/api/observe/alerting/rules/{uid}/pause/": {
      "post": {
        "operationId": "observe_alerting_rules_pause_create",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AlertRuleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AlertRuleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AlertRuleRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertRule"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Pause: rule"
      }
    },
    "/api/observe/alerting/rules/{uid}/test/": {
      "post": {
        "operationId": "observe_alerting_rules_test_create",
        "description": "Dry-run: run queries + expression DAG, return condition frames without updating state.",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AlertRuleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AlertRuleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AlertRuleRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertRule"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Test: rule"
      }
    },
    "/api/observe/dashboards/": {
      "get": {
        "operationId": "observe_dashboards_list",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ObserveDashboard"
                  }
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List dashboards"
      },
      "post": {
        "operationId": "observe_dashboards_create",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDashboardRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDashboardRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDashboardRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObserveDashboard"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create dashboard"
      }
    },
    "/api/observe/dashboards/{uid}/": {
      "get": {
        "operationId": "observe_dashboards_retrieve",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObserveDashboard"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve dashboard"
      },
      "put": {
        "operationId": "observe_dashboards_update",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDashboardRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDashboardRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDashboardRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObserveDashboard"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update dashboard"
      },
      "patch": {
        "operationId": "observe_dashboards_partial_update",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedObserveDashboardRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedObserveDashboardRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedObserveDashboardRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObserveDashboard"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update dashboard"
      },
      "delete": {
        "operationId": "observe_dashboards_destroy",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete dashboard"
      }
    },
    "/api/observe/dashboards/{uid}/versions/": {
      "get": {
        "operationId": "observe_dashboards_versions_retrieve",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObserveDashboard"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Versions: dashboard"
      }
    },
    "/api/observe/datasources/": {
      "get": {
        "operationId": "observe_datasources_list",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ObserveDatasource"
                  }
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List datasources"
      },
      "post": {
        "operationId": "observe_datasources_create",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDatasourceRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDatasourceRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDatasourceRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObserveDatasource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create datasource"
      }
    },
    "/api/observe/datasources/{uid}/": {
      "get": {
        "operationId": "observe_datasources_retrieve",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObserveDatasource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve datasource"
      },
      "put": {
        "operationId": "observe_datasources_update",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDatasourceRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDatasourceRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDatasourceRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObserveDatasource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update datasource"
      },
      "patch": {
        "operationId": "observe_datasources_partial_update",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedObserveDatasourceRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedObserveDatasourceRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedObserveDatasourceRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObserveDatasource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update datasource"
      },
      "delete": {
        "operationId": "observe_datasources_destroy",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete datasource"
      }
    },
    "/api/observe/datasources/{uid}/health/": {
      "post": {
        "operationId": "observe_datasources_health_create",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDatasourceRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDatasourceRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDatasourceRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObserveDatasource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Health: datasource"
      }
    },
    "/api/observe/datasources/{uid}/resource/{resource_path}/": {
      "get": {
        "operationId": "observe_datasources_resource_retrieve",
        "description": "Proxy label/metric autocomplete calls to the provider's callResource.",
        "parameters": [
          {
            "in": "path",
            "name": "resource_path",
            "schema": {
              "type": "string",
              "pattern": "^.+$"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObserveDatasource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve resource"
      },
      "post": {
        "operationId": "observe_datasources_resource_create",
        "description": "Proxy label/metric autocomplete calls to the provider's callResource.",
        "parameters": [
          {
            "in": "path",
            "name": "resource_path",
            "schema": {
              "type": "string",
              "pattern": "^.+$"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDatasourceRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDatasourceRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ObserveDatasourceRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObserveDatasource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create resource"
      }
    },
    "/api/observe/datasources/types/": {
      "get": {
        "operationId": "observe_datasources_types_retrieve",
        "description": "Return available provider types.",
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObserveDatasource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List types"
      }
    },
    "/api/observe/folders/": {
      "get": {
        "operationId": "observe_folders_list",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ObserveFolder"
                  }
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List folders"
      },
      "post": {
        "operationId": "observe_folders_create",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ObserveFolderRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ObserveFolderRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ObserveFolderRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObserveFolder"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create folder"
      }
    },
    "/api/observe/folders/{uid}/": {
      "get": {
        "operationId": "observe_folders_retrieve",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObserveFolder"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve folder"
      },
      "put": {
        "operationId": "observe_folders_update",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ObserveFolderRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ObserveFolderRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ObserveFolderRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObserveFolder"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update folder"
      },
      "patch": {
        "operationId": "observe_folders_partial_update",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedObserveFolderRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedObserveFolderRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedObserveFolderRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObserveFolder"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update folder"
      },
      "delete": {
        "operationId": "observe_folders_destroy",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete folder"
      }
    },
    "/api/observe/provisioning/import/grafana/": {
      "post": {
        "operationId": "observe_provisioning_import_grafana_create",
        "description": "Minimal Grafana-compat import: convert Grafana provisioning shapes\nto Versus manifests (as YAML string), ready for plan/apply.\n\nRequest body:\n    {\n      \"datasources\": [ ... Grafana datasource objects ... ],\n      \"dashboards\": [ ... Grafana dashboard JSON blobs ... ],\n      \"folder_uid\": \"infra\"   # optional; assigned to all dashboards\n    }",
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Create grafana"
      }
    },
    "/api/observe/provisioning/sources/": {
      "get": {
        "operationId": "observe_provisioning_sources_list",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ProvisioningSource"
                  }
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List sources"
      },
      "post": {
        "operationId": "observe_provisioning_sources_create",
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProvisioningSourceRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ProvisioningSourceRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ProvisioningSourceRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProvisioningSource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create source"
      }
    },
    "/api/observe/provisioning/sources/{uid}/": {
      "get": {
        "operationId": "observe_provisioning_sources_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProvisioningSource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve source"
      },
      "put": {
        "operationId": "observe_provisioning_sources_update",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProvisioningSourceRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ProvisioningSourceRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ProvisioningSourceRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProvisioningSource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update source"
      },
      "patch": {
        "operationId": "observe_provisioning_sources_partial_update",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedProvisioningSourceRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedProvisioningSourceRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedProvisioningSourceRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProvisioningSource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update source"
      },
      "delete": {
        "operationId": "observe_provisioning_sources_destroy",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete source"
      }
    },
    "/api/observe/provisioning/sources/{uid}/apply/": {
      "post": {
        "operationId": "observe_provisioning_sources_apply_create",
        "description": "Execute a plan.\n\nRequest body:\n    {\n      \"plan\": { ...plan from /plan endpoint... },\n      \"idempotency_key\": \"unique-string\",   # optional; auto-generated if absent\n      \"manifests\": \"<yaml-string>\"           # must match what was planned\n    }",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProvisioningSourceRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ProvisioningSourceRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ProvisioningSourceRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProvisioningSource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Apply: source"
      }
    },
    "/api/observe/provisioning/sources/{uid}/logs/": {
      "get": {
        "operationId": "observe_provisioning_sources_logs_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProvisioningSource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Logs: source"
      }
    },
    "/api/observe/provisioning/sources/{uid}/plan/": {
      "post": {
        "operationId": "observe_provisioning_sources_plan_create",
        "description": "Compute a plan from a YAML manifest stream.\n\nRequest body:\n    { \"manifests\": \"<yaml-string-with-multiple-docs>\" }\nor\n    { \"manifest_list\": [\"<yaml-doc-1>\", \"<yaml-doc-2>\"] }",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProvisioningSourceRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ProvisioningSourceRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ProvisioningSourceRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProvisioningSource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Plan: source"
      }
    },
    "/api/observe/provisioning/sources/{uid}/resources/": {
      "get": {
        "operationId": "observe_provisioning_sources_resources_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProvisioningSource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Resources: source"
      }
    },
    "/api/observe/provisioning/sources/{uid}/resources/{res_kind}/{res_uid}/unlock/": {
      "post": {
        "operationId": "observe_provisioning_sources_resources_unlock_create",
        "description": "Manually unlock a provisioned resource to allow UI edits.",
        "parameters": [
          {
            "in": "path",
            "name": "res_kind",
            "schema": {
              "type": "string"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "res_uid",
            "schema": {
              "type": "string"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "uid",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "observe"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProvisioningSourceRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ProvisioningSourceRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ProvisioningSourceRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProvisioningSource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Unlock: resource"
      }
    },
    "/api/observe/query": {
      "post": {
        "operationId": "observe_query_create",
        "description": "POST /api/observe/query\n\nWire-compatible with Grafana's /api/ds/query contract.\nAccepts a batch of queries (each naming a datasource by uid) and returns\nresults keyed by refId.\n\nSecurity:\n  - Resolves datasource uids server-side (tenant-scoped in future).\n  - Validates egress URL before each provider instantiation.\n  - Per-query errors never leak internal traces to the response.",
        "tags": [
          "observe"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Create query"
      }
    },
    "/api/reportcards/": {
      "get": {
        "operationId": "reportcards_retrieve",
        "description": "GET /api/reportcards/?scope=fleet[&scope_ref_id=] \u2014 latest snapshot\nper card_type. Card types with no snapshot yet (not built in this phase)\nreturn a placeholder shell rather than being omitted.",
        "tags": [
          "reportcards"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List reportcards"
      }
    },
    "/api/reportcards/{card_type}/": {
      "get": {
        "operationId": "reportcards_retrieve_2",
        "description": "GET /api/reportcards/<card_type>/ \u2014 latest snapshot for one card.",
        "parameters": [
          {
            "in": "path",
            "name": "card_type",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "reportcards"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Retrieve reportcard"
      }
    },
    "/api/reportcards/{card_type}/checks/{check_key}/": {
      "get": {
        "operationId": "reportcards_checks_retrieve",
        "description": "GET /api/reportcards/<card_type>/checks/<check_key>/ \u2014 paginated\nfindings for the drill-down ('View Details') modal, most recent\nsnapshot's check only.",
        "parameters": [
          {
            "in": "path",
            "name": "card_type",
            "schema": {
              "type": "string"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "check_key",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "reportcards"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Retrieve check"
      }
    },
    "/api/reportcards/{card_type}/history/": {
      "get": {
        "operationId": "reportcards_history_retrieve",
        "description": "GET /api/reportcards/<card_type>/history/?window=7d \u2014 score time\nseries for the sparkline (future UI); window defaults to 7 days.",
        "parameters": [
          {
            "in": "path",
            "name": "card_type",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "reportcards"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "History: reportcard"
      }
    },
    "/api/reports/": {
      "get": {
        "operationId": "reports_retrieve",
        "description": "Stateless report runner \u2014 no model, all results computed on demand.",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List reports"
      }
    },
    "/api/reports/export/": {
      "get": {
        "operationId": "reports_export_retrieve",
        "description": "Stateless report runner \u2014 no model, all results computed on demand.",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List exports"
      }
    },
    "/api/reports/run/": {
      "post": {
        "operationId": "reports_run_create",
        "description": "Stateless report runner \u2014 no model, all results computed on demand.",
        "tags": [
          "reports"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Create run"
      }
    },
    "/api/syslog/": {
      "get": {
        "operationId": "syslog_retrieve",
        "description": "Query stored syslog entries.",
        "tags": [
          "syslog"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List syslogs"
      }
    },
    "/api/syslog-alert-rules/": {
      "get": {
        "operationId": "syslog_alert_rules_list",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "syslog-alert-rules"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SyslogAlertRule"
                  }
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List syslog alert rules"
      },
      "post": {
        "operationId": "syslog_alert_rules_create",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "tags": [
          "syslog-alert-rules"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SyslogAlertRuleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/SyslogAlertRuleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/SyslogAlertRuleRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SyslogAlertRule"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create syslog alert rule"
      }
    },
    "/api/syslog-alert-rules/{id}/": {
      "get": {
        "operationId": "syslog_alert_rules_retrieve",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this syslog alert rule.",
            "required": true
          }
        ],
        "tags": [
          "syslog-alert-rules"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SyslogAlertRule"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve syslog alert rule"
      },
      "put": {
        "operationId": "syslog_alert_rules_update",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this syslog alert rule.",
            "required": true
          }
        ],
        "tags": [
          "syslog-alert-rules"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SyslogAlertRuleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/SyslogAlertRuleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/SyslogAlertRuleRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SyslogAlertRule"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update syslog alert rule"
      },
      "patch": {
        "operationId": "syslog_alert_rules_partial_update",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this syslog alert rule.",
            "required": true
          }
        ],
        "tags": [
          "syslog-alert-rules"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedSyslogAlertRuleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedSyslogAlertRuleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedSyslogAlertRuleRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SyslogAlertRule"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update syslog alert rule"
      },
      "delete": {
        "operationId": "syslog_alert_rules_destroy",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this syslog alert rule.",
            "required": true
          }
        ],
        "tags": [
          "syslog-alert-rules"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete syslog alert rule"
      }
    },
    "/api/syslog-ingest/": {
      "post": {
        "operationId": "syslog_ingest_create",
        "description": "Receives syslog lines from the lab relay agent and stores them in the DB.",
        "tags": [
          "syslog-ingest"
        ],
        "responses": {
          "201": {
            "description": "No response body"
          }
        },
        "summary": "Create syslog ingest"
      }
    },
    "/api/syslog/{id}/": {
      "get": {
        "operationId": "syslog_retrieve_2",
        "description": "Query stored syslog entries.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this syslog entry.",
            "required": true
          }
        ],
        "tags": [
          "syslog"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Retrieve syslog"
      }
    },
    "/api/widgets/": {
      "get": {
        "operationId": "widgets_retrieve",
        "tags": [
          "widgets"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List widgets"
      }
    }
  },
  "components": {
    "schemas": {
      "AlertEvalGroup": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "uid": {
            "type": "string",
            "readOnly": true
          },
          "folder": {
            "type": "integer",
            "nullable": true
          },
          "name": {
            "type": "string",
            "maxLength": 255
          },
          "interval_seconds": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "rule_count": {
            "type": "integer",
            "readOnly": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "id",
          "name",
          "rule_count",
          "uid",
          "updated_at"
        ]
      },
      "AlertSeverityEnum": {
        "enum": [
          "info",
          "warning",
          "critical"
        ],
        "type": "string",
        "description": "* `info` - Info\n* `warning` - Warning\n* `critical` - Critical"
      },
      "Dashboard": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "description": {
            "type": "string",
            "maxLength": 500
          },
          "owner": {
            "type": "integer",
            "readOnly": true,
            "nullable": true
          },
          "owner_username": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "shared": {
            "type": "boolean"
          },
          "layout": {},
          "gadgets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DashboardGadget"
            },
            "readOnly": true
          },
          "gadget_count": {
            "type": "string",
            "readOnly": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "gadget_count",
          "gadgets",
          "id",
          "name",
          "owner",
          "owner_username",
          "updated_at"
        ]
      },
      "DashboardWidgetRequest": {
        "type": "object",
        "properties": {
          "widget_type": {
            "$ref": "#/components/schemas/WidgetTypeEnum"
          },
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "config": {},
          "position": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "dashboard": {
            "type": "integer"
          }
        },
        "required": [
          "dashboard",
          "widget_type"
        ]
      },
      "ProvisioningSource": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "uid": {
            "type": "string",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 255
          },
          "kind": {
            "$ref": "#/components/schemas/ProvisioningSourceKindEnum"
          },
          "config": {},
          "prune": {
            "type": "boolean",
            "description": "Delete resources absent from desired set (default=orphan-flag only)"
          },
          "drift_policy": {
            "$ref": "#/components/schemas/DriftPolicyEnum"
          },
          "last_applied_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "last_status": {
            "type": "string",
            "readOnly": true
          },
          "last_error": {
            "type": "string",
            "readOnly": true
          },
          "resource_count": {
            "type": "integer",
            "readOnly": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "id",
          "last_applied_at",
          "last_error",
          "last_status",
          "name",
          "resource_count",
          "uid",
          "updated_at"
        ]
      },
      "ObserveDashboardRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "folder": {
            "type": "integer",
            "nullable": true
          },
          "model": {},
          "schema_version": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "tags": {}
        },
        "required": [
          "title"
        ]
      },
      "ProvisioningSourceKindEnum": {
        "enum": [
          "file",
          "api",
          "git"
        ],
        "type": "string",
        "description": "* `file` - File\n* `api` - API\n* `git` - Git"
      },
      "PatchedObserveDashboardRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "folder": {
            "type": "integer",
            "nullable": true
          },
          "model": {},
          "schema_version": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "tags": {}
        }
      },
      "WidgetTypeEnum": {
        "enum": [
          "virtual_server",
          "certificate",
          "device_pair",
          "cert_expiry",
          "pool_health",
          "config_drift",
          "workflow_sla",
          "route_delta",
          "unauthorized_changes",
          "observe_dashboard",
          "f5_reportcard",
          "wideip"
        ],
        "type": "string",
        "description": "* `virtual_server` - Virtual Server\n* `certificate` - Certificate\n* `device_pair` - Device Pair\n* `cert_expiry` - Certificate Expiry Countdown\n* `pool_health` - Pool Member Health Matrix\n* `config_drift` - Config Drift Indicator\n* `workflow_sla` - Workflow SLA Gauge\n* `route_delta` - Route Change Delta\n* `unauthorized_changes` - Unauthorized Changes\n* `observe_dashboard` - Observe Dashboard\n* `f5_reportcard` - F5 Report Card\n* `wideip` - WideIP"
      },
      "ContactPointRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "type": {
            "$ref": "#/components/schemas/ContactPointTypeEnum"
          },
          "json_data": {},
          "secure_json_data": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "writeOnly": true
          }
        },
        "required": [
          "name"
        ]
      },
      "PatchedAlertRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "message": {
            "type": "string",
            "minLength": 1
          },
          "severity": {
            "$ref": "#/components/schemas/AlertSeverityEnum"
          },
          "resource_type": {
            "type": "string",
            "maxLength": 100
          },
          "resource_id": {
            "type": "string",
            "maxLength": 100
          },
          "read": {
            "type": "boolean"
          },
          "user": {
            "type": "integer"
          }
        }
      },
      "ObserveFolderRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "parent": {
            "type": "integer",
            "nullable": true
          }
        },
        "required": [
          "title"
        ]
      },
      "PaginatedDashboardWidgetList": {
        "type": "object",
        "required": [
          "count",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "example": 123
          },
          "next": {
            "type": "string",
            "nullable": true,
            "format": "uri",
            "example": "http://api.example.org/accounts/?page=4"
          },
          "previous": {
            "type": "string",
            "nullable": true,
            "format": "uri",
            "example": "http://api.example.org/accounts/?page=2"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DashboardWidget"
            }
          }
        }
      },
      "ObserveDatasourceRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "provider_type": {
            "$ref": "#/components/schemas/ObserveDatasourceProviderTypeEnum"
          },
          "url": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1000
          },
          "json_data": {},
          "secure_json_data": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "writeOnly": true
          },
          "is_default": {
            "type": "boolean"
          },
          "allow_private_egress": {
            "type": "boolean"
          }
        },
        "required": [
          "name",
          "url"
        ]
      },
      "AlertInstanceStateEnum": {
        "enum": [
          "Normal",
          "Pending",
          "Alerting",
          "NoData",
          "Error"
        ],
        "type": "string",
        "description": "* `Normal` - Normal\n* `Pending` - Pending\n* `Alerting` - Alerting\n* `NoData` - NoData\n* `Error` - Error"
      },
      "ObserveDashboard": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "uid": {
            "type": "string",
            "readOnly": true
          },
          "title": {
            "type": "string",
            "maxLength": 255
          },
          "folder": {
            "type": "integer",
            "nullable": true
          },
          "folder_title": {
            "type": "string",
            "readOnly": true
          },
          "model": {},
          "schema_version": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "current_version": {
            "type": "integer",
            "readOnly": true
          },
          "tags": {},
          "is_provisioned": {
            "type": "boolean",
            "readOnly": true
          },
          "provisioned_locked": {
            "type": "boolean",
            "readOnly": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "current_version",
          "folder_title",
          "id",
          "is_provisioned",
          "provisioned_locked",
          "title",
          "uid",
          "updated_at"
        ]
      },
      "AlertRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "message": {
            "type": "string",
            "minLength": 1
          },
          "severity": {
            "$ref": "#/components/schemas/AlertSeverityEnum"
          },
          "resource_type": {
            "type": "string",
            "maxLength": 100
          },
          "resource_id": {
            "type": "string",
            "maxLength": 100
          },
          "read": {
            "type": "boolean"
          },
          "user": {
            "type": "integer"
          }
        },
        "required": [
          "message",
          "title",
          "user"
        ]
      },
      "DashboardGadget": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "dashboard": {
            "type": "string",
            "format": "uuid"
          },
          "kind": {
            "$ref": "#/components/schemas/DashboardGadgetKindEnum"
          },
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "config": {},
          "position": {},
          "order": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "dashboard",
          "id",
          "kind"
        ]
      },
      "ContactPoint": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "uid": {
            "type": "string",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 255
          },
          "type": {
            "$ref": "#/components/schemas/ContactPointTypeEnum"
          },
          "type_label": {
            "type": "string",
            "readOnly": true
          },
          "json_data": {},
          "has_secrets": {
            "type": "boolean",
            "readOnly": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "has_secrets",
          "id",
          "name",
          "type_label",
          "uid",
          "updated_at"
        ]
      },
      "SeverityAtLeastEnum": {
        "enum": [
          "emergency",
          "alert",
          "critical",
          "error",
          "warning",
          "notice",
          "info",
          "debug"
        ],
        "type": "string",
        "description": "* `emergency` - Emergency\n* `alert` - Alert\n* `critical` - Critical\n* `error` - Error\n* `warning` - Warning\n* `notice` - Notice\n* `info` - Info\n* `debug` - Debug"
      },
      "PatchedDashboardWidgetRequest": {
        "type": "object",
        "properties": {
          "widget_type": {
            "$ref": "#/components/schemas/WidgetTypeEnum"
          },
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "config": {},
          "position": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "dashboard": {
            "type": "integer"
          }
        }
      },
      "PaginatedDashboardList": {
        "type": "object",
        "required": [
          "count",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "example": 123
          },
          "next": {
            "type": "string",
            "nullable": true,
            "format": "uri",
            "example": "http://api.example.org/accounts/?page=4"
          },
          "previous": {
            "type": "string",
            "nullable": true,
            "format": "uri",
            "example": "http://api.example.org/accounts/?page=2"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Dashboard"
            }
          }
        }
      },
      "PatchedDashboardRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "description": {
            "type": "string",
            "maxLength": 500
          },
          "shared": {
            "type": "boolean"
          },
          "layout": {}
        }
      },
      "PatchedAlertEvalGroupRequest": {
        "type": "object",
        "properties": {
          "folder": {
            "type": "integer",
            "nullable": true
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "interval_seconds": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          }
        }
      },
      "DashboardWidget": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "widget_type": {
            "$ref": "#/components/schemas/WidgetTypeEnum"
          },
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "config": {},
          "position": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "dashboard": {
            "type": "integer"
          }
        },
        "required": [
          "created_at",
          "dashboard",
          "id",
          "widget_type"
        ]
      },
      "DashboardGadgetKindEnum": {
        "enum": [
          "filter_count",
          "filter_list",
          "two_dimensional",
          "pie",
          "bar",
          "live_card"
        ],
        "type": "string",
        "description": "* `filter_count` - Filter count\n* `filter_list` - Filter list\n* `two_dimensional` - Two-dimensional\n* `pie` - Pie chart\n* `bar` - Bar chart\n* `live_card` - Live card"
      },
      "ProvisioningSourceRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "kind": {
            "$ref": "#/components/schemas/ProvisioningSourceKindEnum"
          },
          "config": {},
          "prune": {
            "type": "boolean",
            "description": "Delete resources absent from desired set (default=orphan-flag only)"
          },
          "drift_policy": {
            "$ref": "#/components/schemas/DriftPolicyEnum"
          }
        },
        "required": [
          "name"
        ]
      },
      "PatchedAlertRuleRequest": {
        "type": "object",
        "properties": {
          "folder": {
            "type": "integer",
            "nullable": true
          },
          "eval_group": {
            "type": "integer"
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "data": {},
          "condition_refid": {
            "type": "string",
            "minLength": 1,
            "maxLength": 50
          },
          "pending_period_seconds": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "description": "Seconds the condition must hold before Alerting"
          },
          "no_data_state": {
            "$ref": "#/components/schemas/NoDataStateEnum"
          },
          "exec_err_state": {
            "$ref": "#/components/schemas/ExecErrStateEnum"
          },
          "labels": {
            "description": "Static labels attached to every instance (routing keys)"
          },
          "annotations": {
            "description": "summary, description, runbook_url (may reference $labels)"
          },
          "notification": {},
          "is_paused": {
            "type": "boolean"
          }
        }
      },
      "ContactPointTypeEnum": {
        "enum": [
          "email",
          "webhook",
          "servicenow",
          "versus_itsm"
        ],
        "type": "string",
        "description": "* `email` - Email\n* `webhook` - Webhook\n* `servicenow` - ServiceNow\n* `versus_itsm` - Versus Desk"
      },
      "DriftPolicyEnum": {
        "enum": [
          "lock",
          "preserve",
          "enforce"
        ],
        "type": "string",
        "description": "* `lock` - Lock (block UI edits)\n* `preserve` - Preserve (flag only)\n* `enforce` - Enforce (revert drift)"
      },
      "SyslogAlertRule": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "enabled": {
            "type": "boolean"
          },
          "description": {
            "type": "string"
          },
          "message_pattern": {
            "type": "string",
            "description": "Regex tested against the log message. Leave blank to match on severity alone.",
            "maxLength": 500
          },
          "severity_at_least": {
            "allOf": [
              {
                "$ref": "#/components/schemas/SeverityAtLeastEnum"
              }
            ],
            "description": "Matches this severity or anything more severe.\n\n* `emergency` - Emergency\n* `alert` - Alert\n* `critical` - Critical\n* `error` - Error\n* `warning` - Warning\n* `notice` - Notice\n* `info` - Info\n* `debug` - Debug"
          },
          "device_group": {
            "type": "integer",
            "nullable": true,
            "description": "Only match entries from devices in this group. Leave blank to match any device."
          },
          "device_group_name": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "workflow": {
            "type": "integer"
          },
          "workflow_name": {
            "type": "string",
            "readOnly": true
          },
          "context_template": {},
          "cooldown_seconds": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "last_triggered_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "device_group_name",
          "id",
          "last_triggered_at",
          "name",
          "updated_at",
          "workflow",
          "workflow_name"
        ]
      },
      "DashboardRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "description": {
            "type": "string",
            "maxLength": 500
          },
          "shared": {
            "type": "boolean"
          },
          "layout": {}
        },
        "required": [
          "name"
        ]
      },
      "SyslogAlertRuleRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "enabled": {
            "type": "boolean"
          },
          "description": {
            "type": "string"
          },
          "message_pattern": {
            "type": "string",
            "description": "Regex tested against the log message. Leave blank to match on severity alone.",
            "maxLength": 500
          },
          "severity_at_least": {
            "allOf": [
              {
                "$ref": "#/components/schemas/SeverityAtLeastEnum"
              }
            ],
            "description": "Matches this severity or anything more severe.\n\n* `emergency` - Emergency\n* `alert` - Alert\n* `critical` - Critical\n* `error` - Error\n* `warning` - Warning\n* `notice` - Notice\n* `info` - Info\n* `debug` - Debug"
          },
          "device_group": {
            "type": "integer",
            "nullable": true,
            "description": "Only match entries from devices in this group. Leave blank to match any device."
          },
          "workflow": {
            "type": "integer"
          },
          "context_template": {},
          "cooldown_seconds": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          }
        },
        "required": [
          "name",
          "workflow"
        ]
      },
      "NoDataStateEnum": {
        "enum": [
          "NoData",
          "Alerting",
          "Normal",
          "KeepLast"
        ],
        "type": "string",
        "description": "* `NoData` - NoData\n* `Alerting` - Alerting\n* `Normal` - Normal\n* `KeepLast` - Keep Last State"
      },
      "AlertRuleRequest": {
        "type": "object",
        "properties": {
          "folder": {
            "type": "integer",
            "nullable": true
          },
          "eval_group": {
            "type": "integer"
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "data": {},
          "condition_refid": {
            "type": "string",
            "minLength": 1,
            "maxLength": 50
          },
          "pending_period_seconds": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "description": "Seconds the condition must hold before Alerting"
          },
          "no_data_state": {
            "$ref": "#/components/schemas/NoDataStateEnum"
          },
          "exec_err_state": {
            "$ref": "#/components/schemas/ExecErrStateEnum"
          },
          "labels": {
            "description": "Static labels attached to every instance (routing keys)"
          },
          "annotations": {
            "description": "summary, description, runbook_url (may reference $labels)"
          },
          "notification": {},
          "is_paused": {
            "type": "boolean"
          }
        },
        "required": [
          "eval_group",
          "title"
        ]
      },
      "ExecErrStateEnum": {
        "enum": [
          "Error",
          "Alerting",
          "Normal",
          "KeepLast"
        ],
        "type": "string",
        "description": "* `Error` - Error\n* `Alerting` - Alerting\n* `Normal` - Normal\n* `KeepLast` - Keep Last State"
      },
      "PatchedObserveFolderRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "parent": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "PatchedObserveDatasourceRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "provider_type": {
            "$ref": "#/components/schemas/ObserveDatasourceProviderTypeEnum"
          },
          "url": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1000
          },
          "json_data": {},
          "secure_json_data": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "writeOnly": true
          },
          "is_default": {
            "type": "boolean"
          },
          "allow_private_egress": {
            "type": "boolean"
          }
        }
      },
      "StatusFdaEnum": {
        "enum": [
          "unchecked",
          "ok",
          "error"
        ],
        "type": "string",
        "description": "* `unchecked` - Not checked\n* `ok` - Connected\n* `error` - Error"
      },
      "PatchedSyslogAlertRuleRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "enabled": {
            "type": "boolean"
          },
          "description": {
            "type": "string"
          },
          "message_pattern": {
            "type": "string",
            "description": "Regex tested against the log message. Leave blank to match on severity alone.",
            "maxLength": 500
          },
          "severity_at_least": {
            "allOf": [
              {
                "$ref": "#/components/schemas/SeverityAtLeastEnum"
              }
            ],
            "description": "Matches this severity or anything more severe.\n\n* `emergency` - Emergency\n* `alert` - Alert\n* `critical` - Critical\n* `error` - Error\n* `warning` - Warning\n* `notice` - Notice\n* `info` - Info\n* `debug` - Debug"
          },
          "device_group": {
            "type": "integer",
            "nullable": true,
            "description": "Only match entries from devices in this group. Leave blank to match any device."
          },
          "workflow": {
            "type": "integer"
          },
          "context_template": {},
          "cooldown_seconds": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          }
        }
      },
      "ObserveDatasourceProviderTypeEnum": {
        "enum": [
          "prometheus",
          "loki",
          "postgresql",
          "influxdb",
          "elasticsearch",
          "cloudwatch"
        ],
        "type": "string",
        "description": "* `prometheus` - Prometheus\n* `loki` - Loki\n* `postgresql` - PostgreSQL\n* `influxdb` - InfluxDB\n* `elasticsearch` - Elasticsearch / OpenSearch\n* `cloudwatch` - Amazon CloudWatch"
      },
      "AlertInstance": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "rule": {
            "type": "integer",
            "readOnly": true
          },
          "rule_title": {
            "type": "string",
            "readOnly": true
          },
          "labels_hash": {
            "type": "string",
            "readOnly": true
          },
          "labels": {
            "readOnly": true
          },
          "state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AlertInstanceStateEnum"
              }
            ],
            "readOnly": true
          },
          "health": {
            "type": "string",
            "readOnly": true
          },
          "state_reason": {
            "type": "string",
            "readOnly": true
          },
          "active_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true,
            "description": "When condition first became true (start of Pending)"
          },
          "last_eval_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "last_state_change": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "values": {
            "readOnly": true
          }
        },
        "required": [
          "active_at",
          "health",
          "id",
          "labels",
          "labels_hash",
          "last_eval_at",
          "last_state_change",
          "rule",
          "rule_title",
          "state",
          "state_reason",
          "values"
        ]
      },
      "ObserveFolder": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "uid": {
            "type": "string",
            "readOnly": true
          },
          "title": {
            "type": "string",
            "maxLength": 255
          },
          "parent": {
            "type": "integer",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "id",
          "title",
          "uid",
          "updated_at"
        ]
      },
      "AlertEvalGroupRequest": {
        "type": "object",
        "properties": {
          "folder": {
            "type": "integer",
            "nullable": true
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "interval_seconds": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          }
        },
        "required": [
          "name"
        ]
      },
      "ObserveDatasource": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "uid": {
            "type": "string",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 255
          },
          "provider_type": {
            "$ref": "#/components/schemas/ObserveDatasourceProviderTypeEnum"
          },
          "provider_type_label": {
            "type": "string",
            "readOnly": true
          },
          "url": {
            "type": "string",
            "maxLength": 1000
          },
          "json_data": {},
          "has_secrets": {
            "type": "boolean",
            "readOnly": true
          },
          "is_default": {
            "type": "boolean"
          },
          "allow_private_egress": {
            "type": "boolean"
          },
          "status": {
            "allOf": [
              {
                "$ref": "#/components/schemas/StatusFdaEnum"
              }
            ],
            "readOnly": true
          },
          "status_msg": {
            "type": "string",
            "readOnly": true
          },
          "last_tested": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "is_provisioned": {
            "type": "boolean",
            "readOnly": true
          },
          "provisioned_locked": {
            "type": "boolean",
            "readOnly": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "has_secrets",
          "id",
          "is_provisioned",
          "last_tested",
          "name",
          "provider_type_label",
          "provisioned_locked",
          "status",
          "status_msg",
          "uid",
          "updated_at",
          "url"
        ]
      },
      "AlertRule": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "uid": {
            "type": "string",
            "readOnly": true
          },
          "folder": {
            "type": "integer",
            "nullable": true
          },
          "folder_title": {
            "type": "string",
            "readOnly": true
          },
          "eval_group": {
            "type": "integer"
          },
          "eval_group_name": {
            "type": "string",
            "readOnly": true
          },
          "title": {
            "type": "string",
            "maxLength": 255
          },
          "data": {},
          "condition_refid": {
            "type": "string",
            "maxLength": 50
          },
          "pending_period_seconds": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "description": "Seconds the condition must hold before Alerting"
          },
          "no_data_state": {
            "$ref": "#/components/schemas/NoDataStateEnum"
          },
          "exec_err_state": {
            "$ref": "#/components/schemas/ExecErrStateEnum"
          },
          "labels": {
            "description": "Static labels attached to every instance (routing keys)"
          },
          "annotations": {
            "description": "summary, description, runbook_url (may reference $labels)"
          },
          "notification": {},
          "is_paused": {
            "type": "boolean"
          },
          "version": {
            "type": "integer",
            "readOnly": true
          },
          "instance_count": {
            "type": "integer",
            "readOnly": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "eval_group",
          "eval_group_name",
          "folder_title",
          "id",
          "instance_count",
          "title",
          "uid",
          "updated_at",
          "version"
        ]
      },
      "PatchedProvisioningSourceRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "kind": {
            "$ref": "#/components/schemas/ProvisioningSourceKindEnum"
          },
          "config": {},
          "prune": {
            "type": "boolean",
            "description": "Delete resources absent from desired set (default=orphan-flag only)"
          },
          "drift_policy": {
            "$ref": "#/components/schemas/DriftPolicyEnum"
          }
        }
      },
      "Alert": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "message": {
            "type": "string"
          },
          "severity": {
            "$ref": "#/components/schemas/AlertSeverityEnum"
          },
          "resource_type": {
            "type": "string",
            "maxLength": 100
          },
          "resource_id": {
            "type": "string",
            "maxLength": 100
          },
          "read": {
            "type": "boolean"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "user": {
            "type": "integer"
          }
        },
        "required": [
          "created_at",
          "id",
          "message",
          "title",
          "user"
        ]
      },
      "PatchedContactPointRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "type": {
            "$ref": "#/components/schemas/ContactPointTypeEnum"
          },
          "json_data": {},
          "secure_json_data": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "writeOnly": true
          }
        }
      },
      "PaginatedAlertList": {
        "type": "object",
        "required": [
          "count",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "example": 123
          },
          "next": {
            "type": "string",
            "nullable": true,
            "format": "uri",
            "example": "http://api.example.org/accounts/?page=4"
          },
          "previous": {
            "type": "string",
            "nullable": true,
            "format": "uri",
            "example": "http://api.example.org/accounts/?page=2"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Alert"
            }
          }
        }
      }
    }
  }
}