{
  "openapi": "3.0.3",
  "info": {
    "title": "Predictive & Self-Healing API",
    "version": "1.0.0",
    "description": "Foresight (digital twin), Sentinel (self-healing), Collective Defense (fleet intel), and unauthorized-change detection."
  },
  "servers": [
    {
      "url": "https://versus-demo.com"
    }
  ],
  "paths": {
    "/api/baselines/": {
      "get": {
        "operationId": "baselines_list",
        "parameters": [
          {
            "in": "query",
            "name": "device_group",
            "schema": {
              "type": "integer"
            }
          },
          {
            "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": [
          "baselines"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CustomerBaseline"
                  }
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List baselines"
      },
      "post": {
        "operationId": "baselines_create",
        "tags": [
          "baselines"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerBaselineRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CustomerBaselineRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CustomerBaselineRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerBaseline"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create baseline"
      }
    },
    "/api/baselines/{id}/": {
      "get": {
        "operationId": "baselines_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this customer baseline.",
            "required": true
          }
        ],
        "tags": [
          "baselines"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerBaseline"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve baseline"
      },
      "put": {
        "operationId": "baselines_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this customer baseline.",
            "required": true
          }
        ],
        "tags": [
          "baselines"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerBaselineRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CustomerBaselineRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CustomerBaselineRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerBaseline"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update baseline"
      },
      "patch": {
        "operationId": "baselines_partial_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this customer baseline.",
            "required": true
          }
        ],
        "tags": [
          "baselines"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCustomerBaselineRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCustomerBaselineRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCustomerBaselineRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerBaseline"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update baseline"
      },
      "delete": {
        "operationId": "baselines_destroy",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this customer baseline.",
            "required": true
          }
        ],
        "tags": [
          "baselines"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete baseline"
      }
    },
    "/api/baselines/for_group/{group_id}/": {
      "get": {
        "operationId": "baselines_for_group_retrieve",
        "description": "Get or upsert the first baseline associated with a device group.",
        "parameters": [
          {
            "in": "path",
            "name": "group_id",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "baselines"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerBaseline"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve for group"
      },
      "put": {
        "operationId": "baselines_for_group_update",
        "description": "Get or upsert the first baseline associated with a device group.",
        "parameters": [
          {
            "in": "path",
            "name": "group_id",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "baselines"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerBaselineRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CustomerBaselineRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CustomerBaselineRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerBaseline"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update for group"
      },
      "patch": {
        "operationId": "baselines_for_group_partial_update",
        "description": "Get or upsert the first baseline associated with a device group.",
        "parameters": [
          {
            "in": "path",
            "name": "group_id",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "baselines"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCustomerBaselineRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCustomerBaselineRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCustomerBaselineRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerBaseline"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update for group"
      }
    },
    "/api/fleet-intel/advisories/": {
      "get": {
        "operationId": "fleet_intel_advisories_retrieve",
        "description": "GET  /api/fleet-intel/advisories/ \u2014 fleet CVE/threat advisories matched to\nthis tenant's inventory (consume opt-in honored).\nPOST /api/fleet-intel/advisories/ \u2014 (admin) regenerate advisories from the\nreal CVE catalog.",
        "tags": [
          "fleet-intel"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List advisorys"
      },
      "post": {
        "operationId": "fleet_intel_advisories_create",
        "description": "GET  /api/fleet-intel/advisories/ \u2014 fleet CVE/threat advisories matched to\nthis tenant's inventory (consume opt-in honored).\nPOST /api/fleet-intel/advisories/ \u2014 (admin) regenerate advisories from the\nreal CVE catalog.",
        "tags": [
          "fleet-intel"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Create advisory"
      }
    },
    "/api/fleet-intel/benchmark/": {
      "get": {
        "operationId": "fleet_intel_benchmark_retrieve",
        "description": "GET /api/fleet-intel/benchmark/ \u2014 k-anonymized posture vs the fleet.",
        "tags": [
          "fleet-intel"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List benchmarks"
      }
    },
    "/api/fleet-intel/forecast/": {
      "get": {
        "operationId": "fleet_intel_forecast_retrieve",
        "description": "GET /api/fleet-intel/forecast/ \u2014 predictive risk forecast: the symptoms\nsimilar fleets hit most, matched to this tenant's inventory, with the vetted\nfix to pre-stage. k-anonymized + consume-opt-in honored.",
        "tags": [
          "fleet-intel"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List forecasts"
      }
    },
    "/api/fleet-intel/playbooks/": {
      "get": {
        "operationId": "fleet_intel_playbooks_retrieve",
        "description": "GET /api/fleet-intel/playbooks/?symptom=<class> \u2014 vetted fleet-proven playbooks.\nPOST re-mines them from current signal outcomes (admin).",
        "tags": [
          "fleet-intel"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List playbooks"
      },
      "post": {
        "operationId": "fleet_intel_playbooks_create",
        "description": "GET /api/fleet-intel/playbooks/?symptom=<class> \u2014 vetted fleet-proven playbooks.\nPOST re-mines them from current signal outcomes (admin).",
        "tags": [
          "fleet-intel"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Create playbook"
      }
    },
    "/api/fleet-intel/policy/": {
      "get": {
        "operationId": "fleet_intel_policy_retrieve",
        "description": "GET/PUT /api/fleet-intel/policy/ \u2014 the tenant's opt-in (ships opt-OUT).",
        "tags": [
          "fleet-intel"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List policys"
      },
      "put": {
        "operationId": "fleet_intel_policy_update",
        "description": "GET/PUT /api/fleet-intel/policy/ \u2014 the tenant's opt-in (ships opt-OUT).",
        "tags": [
          "fleet-intel"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Update policy"
      }
    },
    "/api/foresight/gated-run/": {
      "post": {
        "operationId": "foresight_gated_run_create",
        "description": "POST /api/foresight/gated-run/  {workflow_def_id, dry_run?}\nClosed loop (VS-SPEC-DIGITAL-TWIN-001 P5): simulate the workflow, apply its\nChangeGate policy, and only launch the reversible workflow if the gate allows.\n`dry_run=true` returns the decision WITHOUT launching.",
        "tags": [
          "foresight"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Create gated run"
      }
    },
    "/api/foresight/health/": {
      "get": {
        "operationId": "foresight_health_retrieve",
        "description": "GET  /api/foresight/health/ \u2014 current intent health + rolling SLA (read-only)\n   POST /api/foresight/health/ \u2014 run a check now and persist SLA samples\n\nContinuous intent assurance (VS-SPEC-DIGITAL-TWIN-001 P3). Touches no device.",
        "tags": [
          "foresight"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List healths"
      },
      "post": {
        "operationId": "foresight_health_create",
        "description": "GET  /api/foresight/health/ \u2014 current intent health + rolling SLA (read-only)\n   POST /api/foresight/health/ \u2014 run a check now and persist SLA samples\n\nContinuous intent assurance (VS-SPEC-DIGITAL-TWIN-001 P3). Touches no device.",
        "tags": [
          "foresight"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Create health"
      }
    },
    "/api/foresight/intents/": {
      "get": {
        "operationId": "foresight_intents_retrieve",
        "description": "GET/POST /api/foresight/intents/ \u2014 declared reachability intents.",
        "tags": [
          "foresight"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List intents"
      },
      "post": {
        "operationId": "foresight_intents_create",
        "description": "GET/POST /api/foresight/intents/ \u2014 declared reachability intents.",
        "tags": [
          "foresight"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Create intent"
      }
    },
    "/api/foresight/reachability/": {
      "get": {
        "operationId": "foresight_reachability_retrieve",
        "description": "GET /api/foresight/reachability/?src=<ip>&dst=<ip>\n\nTrace src\u2192dst across the digital twin and ground the verdict in live device\nstate (\"reachable but degraded \u2014 bigip1 offline\").",
        "tags": [
          "foresight"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List reachabilitys"
      }
    },
    "/api/foresight/simulate/": {
      "post": {
        "operationId": "foresight_simulate_create",
        "description": "POST /api/foresight/simulate/  {change_kind, devices:[names] | workflow_def_id}\nPre-flight the change against declared intents \u2014 read-only.",
        "tags": [
          "foresight"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Create simulate"
      }
    },
    "/api/foresight/twin/": {
      "get": {
        "operationId": "foresight_twin_retrieve",
        "description": "GET  /api/foresight/twin/   \u2192 latest assembled twin summary\nPOST /api/foresight/twin/   \u2192 (re)assemble the twin now",
        "tags": [
          "foresight"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List twins"
      },
      "post": {
        "operationId": "foresight_twin_create",
        "description": "GET  /api/foresight/twin/   \u2192 latest assembled twin summary\nPOST /api/foresight/twin/   \u2192 (re)assemble the twin now",
        "tags": [
          "foresight"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Create twin"
      }
    },
    "/api/selfheal/bundles/": {
      "get": {
        "operationId": "selfheal_bundles_list",
        "description": "Manual export (spec \u00a76.3): create assembles+signs a bundle, inspect\nshows its manifest (Bundle Inspector), download returns the raw\narchive, transmit seals it and sends it to Support Ingest.",
        "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": [
          "selfheal"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedSupportBundleList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List bundles"
      },
      "post": {
        "operationId": "selfheal_bundles_create",
        "description": "Manual export (spec \u00a76.3): create assembles+signs a bundle, inspect\nshows its manifest (Bundle Inspector), download returns the raw\narchive, transmit seals it and sends it to Support Ingest.",
        "tags": [
          "selfheal"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SupportBundleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/SupportBundleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/SupportBundleRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupportBundle"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create bundle"
      }
    },
    "/api/selfheal/bundles/{id}/": {
      "get": {
        "operationId": "selfheal_bundles_retrieve",
        "description": "Manual export (spec \u00a76.3): create assembles+signs a bundle, inspect\nshows its manifest (Bundle Inspector), download returns the raw\narchive, transmit seals it and sends it to Support Ingest.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this support bundle.",
            "required": true
          }
        ],
        "tags": [
          "selfheal"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupportBundle"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve bundle"
      }
    },
    "/api/selfheal/bundles/{id}/download/": {
      "get": {
        "operationId": "selfheal_bundles_download_retrieve",
        "description": "Manual export (spec \u00a76.3): create assembles+signs a bundle, inspect\nshows its manifest (Bundle Inspector), download returns the raw\narchive, transmit seals it and sends it to Support Ingest.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this support bundle.",
            "required": true
          }
        ],
        "tags": [
          "selfheal"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupportBundle"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Download: bundle"
      }
    },
    "/api/selfheal/bundles/{id}/inspect/": {
      "get": {
        "operationId": "selfheal_bundles_inspect_retrieve",
        "description": "Bundle Inspector (spec \u00a76.3) \u2014 the manifest is already\nhuman-readable JSON; this just serves it directly without the\narchive bytes.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this support bundle.",
            "required": true
          }
        ],
        "tags": [
          "selfheal"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupportBundle"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Inspect: bundle"
      }
    },
    "/api/selfheal/bundles/{id}/transmit/": {
      "post": {
        "operationId": "selfheal_bundles_transmit_create",
        "description": "Manual export (spec \u00a76.3): create assembles+signs a bundle, inspect\nshows its manifest (Bundle Inspector), download returns the raw\narchive, transmit seals it and sends it to Support Ingest.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this support bundle.",
            "required": true
          }
        ],
        "tags": [
          "selfheal"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SupportBundleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/SupportBundleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/SupportBundleRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupportBundle"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Transmit: bundle"
      }
    },
    "/api/selfheal/issues/": {
      "get": {
        "operationId": "selfheal_issues_list",
        "description": "spec \u00a710-equivalent: GET /selfheal/issues \u2014 everything Sentinel has\nfingerprinted, most recent first.",
        "parameters": [
          {
            "in": "query",
            "name": "issue_class",
            "schema": {
              "type": "string",
              "enum": [
                "crash",
                "data_inconsistency",
                "degradation",
                "integration_failure",
                "migration_failure",
                "security"
              ]
            },
            "description": "* `crash` - Crash / Fatal\n* `degradation` - Degradation\n* `integration_failure` - Integration Failure\n* `data_inconsistency` - Data Inconsistency\n* `migration_failure` - Upgrade/Migration Failure\n* `security` - Security-Relevant Fault"
          },
          {
            "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": "severity",
            "schema": {
              "type": "string",
              "enum": [
                "critical",
                "high",
                "low",
                "medium"
              ]
            },
            "description": "* `critical` - Critical\n* `high` - High\n* `medium` - Medium\n* `low` - Low"
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string",
              "enum": [
                "bundled",
                "open",
                "resolved",
                "transmitted"
              ]
            },
            "description": "* `open` - Open\n* `bundled` - Bundle Generated\n* `transmitted` - Transmitted\n* `resolved` - Resolved"
          }
        ],
        "tags": [
          "selfheal"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedDetectedIssueList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List issues"
      }
    },
    "/api/selfheal/issues/{fingerprint}/": {
      "get": {
        "operationId": "selfheal_issues_retrieve",
        "description": "spec \u00a710-equivalent: GET /selfheal/issues \u2014 everything Sentinel has\nfingerprinted, most recent first.",
        "parameters": [
          {
            "in": "path",
            "name": "fingerprint",
            "schema": {
              "type": "string"
            },
            "description": "A unique value identifying this detected issue.",
            "required": true
          }
        ],
        "tags": [
          "selfheal"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DetectedIssue"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve issue"
      }
    },
    "/api/sentinel/fixes/": {
      "get": {
        "operationId": "sentinel_fixes_retrieve",
        "description": "GET /api/sentinel/fixes/ \u2014 fix proposals + their rollout status. Admin only.",
        "tags": [
          "sentinel"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List fixs"
      }
    },
    "/api/sentinel/fixes/{id}/{action}/": {
      "post": {
        "operationId": "sentinel_fixes_create",
        "description": "POST /api/sentinel/fixes/<id>/<approve|reject>/ \u2014 govern the rollout.\nApprove opens a Versus Desk CHANGE carrying the patch (never blind-merge);\nthe fix then flows through change approval + reversible backout. Admin only.",
        "parameters": [
          {
            "in": "path",
            "name": "action",
            "schema": {
              "type": "string"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "required": true
          }
        ],
        "tags": [
          "sentinel"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Create fix"
      }
    },
    "/api/sentinel/glitches/": {
      "get": {
        "operationId": "sentinel_glitches_retrieve",
        "description": "GET /api/sentinel/glitches/ \u2014 operator dashboard of detected glitches.\nAdmin/staff only (platform health, not a tenant surface).",
        "tags": [
          "sentinel"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List glitchs"
      }
    },
    "/api/sentinel/glitches/{id}/diagnose/": {
      "post": {
        "operationId": "sentinel_glitches_diagnose_create",
        "description": "POST /api/sentinel/glitches/<id>/diagnose/ \u2014 AI root-cause-in-code diagnosis\n(read-only). Admin/staff only.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "required": true
          }
        ],
        "tags": [
          "sentinel"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Diagnose: glitch"
      }
    },
    "/api/sentinel/glitches/{id}/propose-fix/": {
      "post": {
        "operationId": "sentinel_glitches_propose_fix_create",
        "description": "POST /api/sentinel/glitches/<id>/propose-fix/ \u2014 generate a candidate code fix\n(unified diff) grounded in the real suspect source. Admin/staff only. The patch is\na PROPOSAL for human review \u2014 Sentinel never applies it.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "required": true
          }
        ],
        "tags": [
          "sentinel"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Propose fix: glitch"
      }
    },
    "/api/sentinel/report/": {
      "post": {
        "operationId": "sentinel_report_create",
        "description": "POST /api/sentinel/report/ \u2014 beacon: a tenant instance or the frontend reports\nan error signature home (de-identified). Any authenticated caller.",
        "tags": [
          "sentinel"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Create report"
      }
    },
    "/api/unauthorized-changes/": {
      "get": {
        "operationId": "unauthorized_changes_list",
        "parameters": [
          {
            "in": "query",
            "name": "device",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "object_type",
            "schema": {
              "type": "string"
            }
          },
          {
            "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": "status",
            "schema": {
              "type": "string",
              "enum": [
                "acknowledged",
                "false_positive",
                "investigating",
                "matched",
                "unauthorized"
              ]
            },
            "description": "* `investigating` - Investigating\n* `matched` - Matched to Change Record\n* `unauthorized` - Unauthorized \u2014 No Change Record\n* `acknowledged` - Acknowledged\n* `false_positive` - False Positive"
          }
        ],
        "tags": [
          "unauthorized-changes"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedUnauthorizedChangeList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List unauthorized changes"
      },
      "post": {
        "operationId": "unauthorized_changes_create",
        "tags": [
          "unauthorized-changes"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UnauthorizedChangeRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/UnauthorizedChangeRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/UnauthorizedChangeRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedChange"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create unauthorized change"
      }
    },
    "/api/unauthorized-changes/{id}/": {
      "get": {
        "operationId": "unauthorized_changes_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this unauthorized change.",
            "required": true
          }
        ],
        "tags": [
          "unauthorized-changes"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedChange"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve unauthorized change"
      },
      "put": {
        "operationId": "unauthorized_changes_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this unauthorized change.",
            "required": true
          }
        ],
        "tags": [
          "unauthorized-changes"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UnauthorizedChangeRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/UnauthorizedChangeRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/UnauthorizedChangeRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedChange"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update unauthorized change"
      },
      "patch": {
        "operationId": "unauthorized_changes_partial_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this unauthorized change.",
            "required": true
          }
        ],
        "tags": [
          "unauthorized-changes"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedUnauthorizedChangeRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedUnauthorizedChangeRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedUnauthorizedChangeRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedChange"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update unauthorized change"
      },
      "delete": {
        "operationId": "unauthorized_changes_destroy",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this unauthorized change.",
            "required": true
          }
        ],
        "tags": [
          "unauthorized-changes"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete unauthorized change"
      }
    },
    "/api/unauthorized-changes/{id}/acknowledge/": {
      "post": {
        "operationId": "unauthorized_changes_acknowledge_create",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this unauthorized change.",
            "required": true
          }
        ],
        "tags": [
          "unauthorized-changes"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UnauthorizedChangeRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/UnauthorizedChangeRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/UnauthorizedChangeRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedChange"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Acknowledge: unauthorized change"
      }
    },
    "/api/unauthorized-changes/{id}/mark_false_positive/": {
      "post": {
        "operationId": "unauthorized_changes_mark_false_positive_create",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this unauthorized change.",
            "required": true
          }
        ],
        "tags": [
          "unauthorized-changes"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UnauthorizedChangeRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/UnauthorizedChangeRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/UnauthorizedChangeRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedChange"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Mark false positive: unauthorized change"
      }
    },
    "/api/unauthorized-changes/run-detection/": {
      "post": {
        "operationId": "unauthorized_changes_run_detection_create",
        "description": "Manually trigger unauthorized change detection for a device.",
        "tags": [
          "unauthorized-changes"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UnauthorizedChangeRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/UnauthorizedChangeRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/UnauthorizedChangeRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnauthorizedChange"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create run detection"
      }
    }
  },
  "components": {
    "schemas": {
      "UnauthorizedChangeStatusEnum": {
        "enum": [
          "investigating",
          "matched",
          "unauthorized",
          "acknowledged",
          "false_positive"
        ],
        "type": "string",
        "description": "* `investigating` - Investigating\n* `matched` - Matched to Change Record\n* `unauthorized` - Unauthorized \u2014 No Change Record\n* `acknowledged` - Acknowledged\n* `false_positive` - False Positive"
      },
      "PatchedUnauthorizedChangeRequest": {
        "type": "object",
        "properties": {
          "device": {
            "type": "integer"
          },
          "detected_at": {
            "type": "string",
            "format": "date-time"
          },
          "object_type": {
            "type": "string",
            "maxLength": 50
          },
          "object_name": {
            "type": "string",
            "maxLength": 200
          },
          "change_summary": {
            "type": "string"
          },
          "config_diff": {},
          "audit_user": {
            "type": "string",
            "maxLength": 200
          },
          "audit_timestamp": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "snow_changes_queried": {},
          "snow_change_number": {
            "type": "string",
            "maxLength": 50
          },
          "ai_analysis": {},
          "snow_incident_number": {
            "type": "string",
            "maxLength": 50
          },
          "status": {
            "$ref": "#/components/schemas/UnauthorizedChangeStatusEnum"
          },
          "acknowledged_by": {
            "type": "integer",
            "nullable": true
          },
          "acknowledged_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "notes": {
            "type": "string"
          }
        }
      },
      "DetectedIssue": {
        "type": "object",
        "properties": {
          "fingerprint": {
            "type": "string",
            "maxLength": 64
          },
          "issue_class": {
            "$ref": "#/components/schemas/IssueClassEnum"
          },
          "component": {
            "type": "string",
            "maxLength": 200
          },
          "signature": {
            "type": "string"
          },
          "severity": {
            "$ref": "#/components/schemas/DetectedIssueSeverityEnum"
          },
          "status": {
            "$ref": "#/components/schemas/DetectedIssueStatusEnum"
          },
          "version": {
            "type": "string",
            "maxLength": 50
          },
          "first_seen_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "last_seen_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "occurrence_count": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "sample_context": {}
        },
        "required": [
          "component",
          "fingerprint",
          "first_seen_at",
          "issue_class",
          "last_seen_at"
        ]
      },
      "UnauthorizedChangeRequest": {
        "type": "object",
        "properties": {
          "device": {
            "type": "integer"
          },
          "detected_at": {
            "type": "string",
            "format": "date-time"
          },
          "object_type": {
            "type": "string",
            "maxLength": 50
          },
          "object_name": {
            "type": "string",
            "maxLength": 200
          },
          "change_summary": {
            "type": "string"
          },
          "config_diff": {},
          "audit_user": {
            "type": "string",
            "maxLength": 200
          },
          "audit_timestamp": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "snow_changes_queried": {},
          "snow_change_number": {
            "type": "string",
            "maxLength": 50
          },
          "ai_analysis": {},
          "snow_incident_number": {
            "type": "string",
            "maxLength": 50
          },
          "status": {
            "$ref": "#/components/schemas/UnauthorizedChangeStatusEnum"
          },
          "acknowledged_by": {
            "type": "integer",
            "nullable": true
          },
          "acknowledged_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "notes": {
            "type": "string"
          }
        },
        "required": [
          "detected_at",
          "device"
        ]
      },
      "PatchedCustomerBaselineRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "dns_servers": {},
          "ntp_servers": {},
          "syslog_servers": {},
          "timezone": {
            "type": "string",
            "maxLength": 100
          },
          "snmp_contact": {
            "type": "string",
            "maxLength": 200
          },
          "snmp_location": {
            "type": "string",
            "maxLength": 200
          },
          "snmp_allowed_ips": {},
          "snmp_v3_only": {
            "type": "boolean"
          },
          "mgmt_allowed_ips": {},
          "ssh_allowed_ips": {},
          "password_min_length": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "idle_timeout_seconds": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "min_tls_version": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10
          },
          "require_security_banner": {
            "type": "boolean"
          },
          "security_banner_text": {
            "type": "string"
          },
          "fail_on_critical": {
            "type": "boolean"
          },
          "device_group": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "UnauthorizedChange": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "device": {
            "type": "integer"
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "device_ip": {
            "type": "string",
            "readOnly": true
          },
          "detected_at": {
            "type": "string",
            "format": "date-time"
          },
          "object_type": {
            "type": "string",
            "maxLength": 50
          },
          "object_name": {
            "type": "string",
            "maxLength": 200
          },
          "change_summary": {
            "type": "string"
          },
          "config_diff": {},
          "audit_user": {
            "type": "string",
            "maxLength": 200
          },
          "audit_timestamp": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "snow_changes_queried": {},
          "snow_change_number": {
            "type": "string",
            "maxLength": 50
          },
          "ai_analysis": {},
          "snow_incident_number": {
            "type": "string",
            "maxLength": 50
          },
          "status": {
            "$ref": "#/components/schemas/UnauthorizedChangeStatusEnum"
          },
          "acknowledged_by": {
            "type": "integer",
            "nullable": true
          },
          "acknowledged_by_name": {
            "type": "string",
            "readOnly": true
          },
          "acknowledged_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "notes": {
            "type": "string"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "acknowledged_by_name",
          "created_at",
          "detected_at",
          "device",
          "device_ip",
          "device_name",
          "id",
          "updated_at"
        ]
      },
      "SupportBundleRequest": {
        "type": "object",
        "properties": {
          "redaction_level": {
            "$ref": "#/components/schemas/RedactionLevelEnum"
          },
          "manifest": {},
          "size_bytes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "transmit_status": {
            "$ref": "#/components/schemas/TransmitStatusEnum"
          },
          "transmitted_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "transmit_error": {
            "type": "string"
          }
        }
      },
      "DetectedIssueStatusEnum": {
        "enum": [
          "open",
          "bundled",
          "transmitted",
          "resolved"
        ],
        "type": "string",
        "description": "* `open` - Open\n* `bundled` - Bundle Generated\n* `transmitted` - Transmitted\n* `resolved` - Resolved"
      },
      "TransmitStatusEnum": {
        "enum": [
          "not_sent",
          "queued",
          "sent",
          "failed"
        ],
        "type": "string",
        "description": "* `not_sent` - Not Sent\n* `queued` - Queued\n* `sent` - Sent\n* `failed` - Failed"
      },
      "SupportBundle": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "issue_fingerprint": {
            "type": "string",
            "readOnly": true
          },
          "redaction_level": {
            "$ref": "#/components/schemas/RedactionLevelEnum"
          },
          "manifest": {},
          "size_bytes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "transmit_status": {
            "$ref": "#/components/schemas/TransmitStatusEnum"
          },
          "transmitted_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "transmit_error": {
            "type": "string"
          },
          "created_by_username": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "created_by_username",
          "id",
          "issue_fingerprint"
        ]
      },
      "RedactionLevelEnum": {
        "enum": [
          "full",
          "sanitized",
          "minimal"
        ],
        "type": "string",
        "description": "* `full` - Full\n* `sanitized` - Sanitized\n* `minimal` - Minimal"
      },
      "PaginatedUnauthorizedChangeList": {
        "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/UnauthorizedChange"
            }
          }
        }
      },
      "CustomerBaselineRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "dns_servers": {},
          "ntp_servers": {},
          "syslog_servers": {},
          "timezone": {
            "type": "string",
            "maxLength": 100
          },
          "snmp_contact": {
            "type": "string",
            "maxLength": 200
          },
          "snmp_location": {
            "type": "string",
            "maxLength": 200
          },
          "snmp_allowed_ips": {},
          "snmp_v3_only": {
            "type": "boolean"
          },
          "mgmt_allowed_ips": {},
          "ssh_allowed_ips": {},
          "password_min_length": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "idle_timeout_seconds": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "min_tls_version": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10
          },
          "require_security_banner": {
            "type": "boolean"
          },
          "security_banner_text": {
            "type": "string"
          },
          "fail_on_critical": {
            "type": "boolean"
          },
          "device_group": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "PaginatedDetectedIssueList": {
        "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/DetectedIssue"
            }
          }
        }
      },
      "CustomerBaseline": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "device_group_name": {
            "type": "string",
            "readOnly": true,
            "nullable": true
          },
          "name": {
            "type": "string",
            "maxLength": 100
          },
          "dns_servers": {},
          "ntp_servers": {},
          "syslog_servers": {},
          "timezone": {
            "type": "string",
            "maxLength": 100
          },
          "snmp_contact": {
            "type": "string",
            "maxLength": 200
          },
          "snmp_location": {
            "type": "string",
            "maxLength": 200
          },
          "snmp_allowed_ips": {},
          "snmp_v3_only": {
            "type": "boolean"
          },
          "mgmt_allowed_ips": {},
          "ssh_allowed_ips": {},
          "password_min_length": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "idle_timeout_seconds": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "min_tls_version": {
            "type": "string",
            "maxLength": 10
          },
          "require_security_banner": {
            "type": "boolean"
          },
          "security_banner_text": {
            "type": "string"
          },
          "fail_on_critical": {
            "type": "boolean"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "device_group": {
            "type": "integer",
            "nullable": true
          }
        },
        "required": [
          "device_group_name",
          "id",
          "updated_at"
        ]
      },
      "PaginatedSupportBundleList": {
        "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/SupportBundle"
            }
          }
        }
      },
      "DetectedIssueSeverityEnum": {
        "enum": [
          "critical",
          "high",
          "medium",
          "low"
        ],
        "type": "string",
        "description": "* `critical` - Critical\n* `high` - High\n* `medium` - Medium\n* `low` - Low"
      },
      "IssueClassEnum": {
        "enum": [
          "crash",
          "degradation",
          "integration_failure",
          "data_inconsistency",
          "migration_failure",
          "security"
        ],
        "type": "string",
        "description": "* `crash` - Crash / Fatal\n* `degradation` - Degradation\n* `integration_failure` - Integration Failure\n* `data_inconsistency` - Data Inconsistency\n* `migration_failure` - Upgrade/Migration Failure\n* `security` - Security-Relevant Fault"
      }
    }
  }
}