{
  "openapi": "3.0.3",
  "info": {
    "title": "Vulnerabilities API",
    "version": "1.0.0",
    "description": "Vulnerability management \u2014 scanners, feeds, matches, results, and AI-assisted remediation."
  },
  "servers": [
    {
      "url": "https://versus-demo.com"
    }
  ],
  "paths": {
    "/api/feed-sync-runs/": {
      "get": {
        "operationId": "feed_sync_runs_list",
        "parameters": [
          {
            "in": "query",
            "name": "feed",
            "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"
            }
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string",
              "enum": [
                "error",
                "ok",
                "partial",
                "running"
              ]
            },
            "description": "* `running` - Running\n* `ok` - OK\n* `partial` - Partial\n* `error` - Error"
          }
        ],
        "tags": [
          "feed-sync-runs"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedFeedSyncRunList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List feed sync runs"
      }
    },
    "/api/feed-sync-runs/{id}/": {
      "get": {
        "operationId": "feed_sync_runs_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this feed sync run.",
            "required": true
          }
        ],
        "tags": [
          "feed-sync-runs"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FeedSyncRun"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve feed sync run"
      }
    },
    "/api/scanner/assets/": {
      "get": {
        "operationId": "scanner_assets_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": "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": [
          "scanner"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedScannerAssetList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List assets"
      }
    },
    "/api/scanner/assets/{id}/": {
      "get": {
        "operationId": "scanner_assets_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 scanner asset.",
            "required": true
          }
        ],
        "tags": [
          "scanner"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScannerAsset"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve asset"
      }
    },
    "/api/scanner/connections/": {
      "get": {
        "operationId": "scanner_connections_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": [
          {
            "in": "query",
            "name": "enabled",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "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"
            }
          },
          {
            "in": "query",
            "name": "provider_kind",
            "schema": {
              "type": "string",
              "enum": [
                "qualys",
                "rapid7_v3",
                "rapid7_v4",
                "tenable_io",
                "tenable_sc"
              ]
            },
            "description": "* `rapid7_v4` - Rapid7 InsightVM Cloud (API v4)\n* `rapid7_v3` - Rapid7 InsightVM / Nexpose Console (API v3)\n* `qualys` - Qualys VMDR / Cloud Platform\n* `tenable_io` - Tenable Vulnerability Management (Tenable.io)\n* `tenable_sc` - Tenable Security Center (on-prem)"
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "scanner"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedScannerConnectionList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List connections"
      },
      "post": {
        "operationId": "scanner_connections_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": [
          "scanner"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScannerConnectionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ScannerConnectionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ScannerConnectionRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScannerConnection"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create connection"
      }
    },
    "/api/scanner/connections/{id}/": {
      "get": {
        "operationId": "scanner_connections_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 scanner connection.",
            "required": true
          }
        ],
        "tags": [
          "scanner"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScannerConnection"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve connection"
      },
      "put": {
        "operationId": "scanner_connections_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 scanner connection.",
            "required": true
          }
        ],
        "tags": [
          "scanner"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScannerConnectionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ScannerConnectionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ScannerConnectionRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScannerConnection"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update connection"
      },
      "patch": {
        "operationId": "scanner_connections_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 scanner connection.",
            "required": true
          }
        ],
        "tags": [
          "scanner"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedScannerConnectionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedScannerConnectionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedScannerConnectionRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScannerConnection"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update connection"
      },
      "delete": {
        "operationId": "scanner_connections_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 scanner connection.",
            "required": true
          }
        ],
        "tags": [
          "scanner"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete connection"
      }
    },
    "/api/scanner/connections/{id}/assess_ips/": {
      "post": {
        "operationId": "scanner_connections_assess_ips_create",
        "description": "POST {ips: ['10.0.0.1', ...]} \u2014 run a risk assessment against this connection.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this scanner connection.",
            "required": true
          }
        ],
        "tags": [
          "scanner"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScannerConnectionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ScannerConnectionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ScannerConnectionRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScannerConnection"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Assess ips: connection"
      }
    },
    "/api/scanner/connections/{id}/summary/": {
      "get": {
        "operationId": "scanner_connections_summary_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 scanner connection.",
            "required": true
          }
        ],
        "tags": [
          "scanner"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScannerConnection"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Summary: connection"
      }
    },
    "/api/scanner/connections/{id}/sync_now/": {
      "post": {
        "operationId": "scanner_connections_sync_now_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": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this scanner connection.",
            "required": true
          }
        ],
        "tags": [
          "scanner"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScannerConnectionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ScannerConnectionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ScannerConnectionRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScannerConnection"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Sync now: connection"
      }
    },
    "/api/scanner/connections/{id}/test_connection/": {
      "post": {
        "operationId": "scanner_connections_test_connection_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": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this scanner connection.",
            "required": true
          }
        ],
        "tags": [
          "scanner"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScannerConnectionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ScannerConnectionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ScannerConnectionRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScannerConnection"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Test connection: connection"
      }
    },
    "/api/scanner/findings/": {
      "get": {
        "operationId": "scanner_findings_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": "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": [
          "scanner"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedScannerFindingList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List findings"
      }
    },
    "/api/scanner/findings/{id}/": {
      "get": {
        "operationId": "scanner_findings_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 scanner finding.",
            "required": true
          }
        ],
        "tags": [
          "scanner"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScannerFinding"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve finding"
      }
    },
    "/api/scanner/risk-assessments/": {
      "get": {
        "operationId": "scanner_risk_assessments_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": [
          {
            "in": "query",
            "name": "connection",
            "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": "subject",
            "schema": {
              "type": "string",
              "enum": [
                "access_request",
                "manual"
              ]
            },
            "description": "* `access_request` - Firewall Access Request\n* `manual` - Manual Query"
          },
          {
            "in": "query",
            "name": "verdict",
            "schema": {
              "type": "string",
              "enum": [
                "error",
                "fail",
                "not_scannable",
                "pass",
                "stale"
              ]
            },
            "description": "* `pass` - Pass \u2014 no findings above threshold\n* `fail` - Fail \u2014 findings above threshold\n* `not_scannable` - Not Scannable \u2014 IPs outside scannable ranges\n* `stale` - Stale \u2014 last scan older than threshold\n* `error` - Error \u2014 scanner unreachable"
          }
        ],
        "tags": [
          "scanner"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedRiskAssessmentList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List risk assessments"
      }
    },
    "/api/scanner/risk-assessments/{id}/": {
      "get": {
        "operationId": "scanner_risk_assessments_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 risk assessment.",
            "required": true
          }
        ],
        "tags": [
          "scanner"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RiskAssessment"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve risk assessment"
      }
    },
    "/api/scanner/risk-assessments/{id}/report/": {
      "get": {
        "operationId": "scanner_risk_assessments_report_retrieve",
        "description": "Return the rendered HTML report for download/display.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this risk assessment.",
            "required": true
          }
        ],
        "tags": [
          "scanner"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RiskAssessment"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Report: risk assessment"
      }
    },
    "/api/scanner/scan-jobs/": {
      "get": {
        "operationId": "scanner_scan_jobs_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": [
          {
            "in": "query",
            "name": "connection",
            "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": "state",
            "schema": {
              "type": "string",
              "enum": [
                "failed",
                "queued",
                "running",
                "succeeded",
                "timeout"
              ]
            },
            "description": "* `queued` - Queued\n* `running` - Running\n* `succeeded` - Succeeded\n* `failed` - Failed\n* `timeout` - Timed Out"
          }
        ],
        "tags": [
          "scanner"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedScanJobList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List scan jobs"
      }
    },
    "/api/scanner/scan-jobs/{id}/": {
      "get": {
        "operationId": "scanner_scan_jobs_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 scan job.",
            "required": true
          }
        ],
        "tags": [
          "scanner"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScanJob"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve scan job"
      }
    },
    "/api/scanner/scan-jobs/{id}/poll/": {
      "post": {
        "operationId": "scanner_scan_jobs_poll_create",
        "description": "Poll the scanner for the current status of an active scan job.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this scan job.",
            "required": true
          }
        ],
        "tags": [
          "scanner"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScanJobRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ScanJobRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ScanJobRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScanJob"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Poll: scan job"
      }
    },
    "/api/vuln-ai-analyses/": {
      "get": {
        "operationId": "vuln_ai_analyses_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": [
          {
            "in": "query",
            "name": "cve_id",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "invocation",
            "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"
            }
          }
        ],
        "tags": [
          "vuln-ai-analyses"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedVulnAIAnalysisList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List vuln ai analyses"
      }
    },
    "/api/vuln-ai-analyses/{id}/": {
      "get": {
        "operationId": "vuln_ai_analyses_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 vuln ai analysis.",
            "required": true
          }
        ],
        "tags": [
          "vuln-ai-analyses"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VulnAIAnalysis"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve vuln ai analyse"
      }
    },
    "/api/vuln-feeds/": {
      "get": {
        "operationId": "vuln_feeds_list",
        "description": "CRUD + on-demand fetch for vulnerability feed sources.",
        "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": [
          "vuln-feeds"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedVulnFeedSourceList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List vuln feeds"
      },
      "post": {
        "operationId": "vuln_feeds_create",
        "description": "CRUD + on-demand fetch for vulnerability feed sources.",
        "tags": [
          "vuln-feeds"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VulnFeedSourceRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VulnFeedSourceRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VulnFeedSourceRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VulnFeedSource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create vuln feed"
      }
    },
    "/api/vuln-feeds/{id}/": {
      "get": {
        "operationId": "vuln_feeds_retrieve",
        "description": "CRUD + on-demand fetch for vulnerability feed sources.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this vuln feed source.",
            "required": true
          }
        ],
        "tags": [
          "vuln-feeds"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VulnFeedSource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve vuln feed"
      },
      "put": {
        "operationId": "vuln_feeds_update",
        "description": "CRUD + on-demand fetch for vulnerability feed sources.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this vuln feed source.",
            "required": true
          }
        ],
        "tags": [
          "vuln-feeds"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VulnFeedSourceRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VulnFeedSourceRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VulnFeedSourceRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VulnFeedSource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update vuln feed"
      },
      "patch": {
        "operationId": "vuln_feeds_partial_update",
        "description": "CRUD + on-demand fetch for vulnerability feed sources.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this vuln feed source.",
            "required": true
          }
        ],
        "tags": [
          "vuln-feeds"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedVulnFeedSourceRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedVulnFeedSourceRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedVulnFeedSourceRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VulnFeedSource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update vuln feed"
      },
      "delete": {
        "operationId": "vuln_feeds_destroy",
        "description": "CRUD + on-demand fetch for vulnerability feed sources.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this vuln feed source.",
            "required": true
          }
        ],
        "tags": [
          "vuln-feeds"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete vuln feed"
      }
    },
    "/api/vuln-feeds/{id}/fetch/": {
      "post": {
        "operationId": "vuln_feeds_fetch_create",
        "description": "Trigger a background fetch for this specific feed source.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this vuln feed source.",
            "required": true
          }
        ],
        "tags": [
          "vuln-feeds"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VulnFeedSourceRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VulnFeedSourceRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VulnFeedSourceRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VulnFeedSource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Fetch: vuln feed"
      }
    },
    "/api/vuln-feeds/{id}/sync_runs/": {
      "get": {
        "operationId": "vuln_feeds_sync_runs_retrieve",
        "description": "Last 20 FeedSyncRun rows for this feed.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this vuln feed source.",
            "required": true
          }
        ],
        "tags": [
          "vuln-feeds"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VulnFeedSource"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Sync runs: vuln feed"
      }
    },
    "/api/vuln-invocations/": {
      "get": {
        "operationId": "vuln_invocations_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": "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"
            }
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string",
              "enum": [
                "cancelled",
                "failed",
                "partial",
                "running",
                "succeeded"
              ]
            },
            "description": "* `running` - Running\n* `partial` - Partial\n* `succeeded` - Succeeded\n* `failed` - Failed\n* `cancelled` - Cancelled"
          },
          {
            "in": "query",
            "name": "trigger",
            "schema": {
              "type": "string",
              "enum": [
                "feed_sync",
                "manual"
              ]
            },
            "description": "* `feed_sync` - Feed Sync\n* `manual` - Manual"
          },
          {
            "in": "query",
            "name": "workflow_name",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "vuln-invocations"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedWorkflowInvocationListList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List vuln invocations"
      }
    },
    "/api/vuln-invocations/{id}/": {
      "get": {
        "operationId": "vuln_invocations_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 workflow invocation.",
            "required": true
          }
        ],
        "tags": [
          "vuln-invocations"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowInvocationDetail"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve vuln invocation"
      }
    },
    "/api/vuln-invocations/{id}/cancel/": {
      "post": {
        "operationId": "vuln_invocations_cancel_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": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this workflow invocation.",
            "required": true
          }
        ],
        "tags": [
          "vuln-invocations"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowInvocationListRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowInvocationListRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowInvocationListRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowInvocationList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Cancel: vuln invocation"
      }
    },
    "/api/vuln-invocations/manual_invoke/": {
      "post": {
        "operationId": "vuln_invocations_manual_invoke_create",
        "description": "Assemble a batch from supplied CVE IDs and trigger\nprocess_new_vulnerabilities (respects dedup key).",
        "tags": [
          "vuln-invocations"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowInvocationListRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowInvocationListRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowInvocationListRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowInvocationList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create manual invoke"
      }
    },
    "/api/vuln-matches/": {
      "get": {
        "operationId": "vuln_matches_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": [
          {
            "in": "query",
            "name": "device",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "in_range",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "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"
            }
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string",
              "enum": [
                "active",
                "not_applicable",
                "remediated",
                "suppressed"
              ]
            },
            "description": "* `active` - Active\n* `remediated` - Remediated\n* `suppressed` - Suppressed\n* `not_applicable` - Not Applicable"
          },
          {
            "in": "query",
            "name": "vendor_type",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "vulnerability",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "tags": [
          "vuln-matches"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedVulnerabilityMatchList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List vuln matchs"
      }
    },
    "/api/vuln-matches/{id}/": {
      "get": {
        "operationId": "vuln_matches_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 vulnerability match.",
            "required": true
          }
        ],
        "tags": [
          "vuln-matches"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VulnerabilityMatch"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve vuln match"
      }
    },
    "/api/vuln-matches/{id}/mark_not_applicable/": {
      "post": {
        "operationId": "vuln_matches_mark_not_applicable_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": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this vulnerability match.",
            "required": true
          }
        ],
        "tags": [
          "vuln-matches"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityMatchRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityMatchRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityMatchRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VulnerabilityMatch"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Mark not applicable: vuln match"
      }
    },
    "/api/vuln-matches/{id}/suppress/": {
      "post": {
        "operationId": "vuln_matches_suppress_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": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this vulnerability match.",
            "required": true
          }
        ],
        "tags": [
          "vuln-matches"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityMatchRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityMatchRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityMatchRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VulnerabilityMatch"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Suppress: vuln match"
      }
    },
    "/api/vuln-remediation-runs/": {
      "get": {
        "operationId": "vuln_remediation_runs_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": [
          {
            "in": "query",
            "name": "cve_id",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "invocation",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "mode",
            "schema": {
              "type": "string",
              "enum": [
                "script",
                "upgrade_handoff"
              ]
            },
            "description": "* `script` - AI Script\n* `upgrade_handoff` - Upgrade Workflow"
          },
          {
            "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"
            }
          },
          {
            "in": "query",
            "name": "state",
            "schema": {
              "type": "string",
              "enum": [
                "awaiting_approval",
                "cancelled",
                "failed",
                "generating",
                "implement",
                "post_validate",
                "pre_validate",
                "rolled_back",
                "succeeded"
              ]
            },
            "description": "* `awaiting_approval` - Awaiting Approval\n* `generating` - Generating Script\n* `pre_validate` - Pre-Validation\n* `implement` - Implementing\n* `post_validate` - Post-Validation\n* `succeeded` - Succeeded\n* `failed` - Failed\n* `cancelled` - Cancelled\n* `rolled_back` - Rolled Back"
          },
          {
            "in": "query",
            "name": "vendor_type",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "vuln-remediation-runs"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedRemediationRunList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List vuln remediation runs"
      }
    },
    "/api/vuln-remediation-runs/{id}/": {
      "get": {
        "operationId": "vuln_remediation_runs_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 remediation run.",
            "required": true
          }
        ],
        "tags": [
          "vuln-remediation-runs"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RemediationRun"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve vuln remediation run"
      }
    },
    "/api/vuln-remediation-runs/{id}/cancel/": {
      "post": {
        "operationId": "vuln_remediation_runs_cancel_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": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this remediation run.",
            "required": true
          }
        ],
        "tags": [
          "vuln-remediation-runs"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RemediationRunRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/RemediationRunRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/RemediationRunRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RemediationRun"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Cancel: vuln remediation run"
      }
    },
    "/api/vuln-results/": {
      "get": {
        "operationId": "vuln_results_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": [
          {
            "in": "query",
            "name": "device",
            "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"
            }
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string",
              "enum": [
                "confirmed",
                "not_affected",
                "patched",
                "potentially_affected"
              ]
            },
            "description": "* `potentially_affected` - Potentially Affected\n* `confirmed` - Confirmed Affected\n* `patched` - Patched\n* `not_affected` - Not Affected"
          },
          {
            "in": "query",
            "name": "vulnerability",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "vulnerability__in_kev",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "vulnerability__severity",
            "schema": {
              "type": "string",
              "enum": [
                "critical",
                "high",
                "informational",
                "low",
                "medium"
              ]
            },
            "description": "* `critical` - Critical\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `informational` - Informational"
          }
        ],
        "tags": [
          "vuln-results"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedDeviceVulnerabilityResultList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List vuln results"
      },
      "post": {
        "operationId": "vuln_results_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": [
          "vuln-results"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceVulnerabilityResultRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DeviceVulnerabilityResultRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DeviceVulnerabilityResultRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeviceVulnerabilityResult"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create vuln result"
      }
    },
    "/api/vuln-results/{id}/": {
      "get": {
        "operationId": "vuln_results_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 device vulnerability result.",
            "required": true
          }
        ],
        "tags": [
          "vuln-results"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeviceVulnerabilityResult"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve vuln result"
      },
      "put": {
        "operationId": "vuln_results_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 device vulnerability result.",
            "required": true
          }
        ],
        "tags": [
          "vuln-results"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceVulnerabilityResultRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DeviceVulnerabilityResultRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DeviceVulnerabilityResultRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeviceVulnerabilityResult"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update vuln result"
      },
      "patch": {
        "operationId": "vuln_results_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 device vulnerability result.",
            "required": true
          }
        ],
        "tags": [
          "vuln-results"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedDeviceVulnerabilityResultRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedDeviceVulnerabilityResultRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedDeviceVulnerabilityResultRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeviceVulnerabilityResult"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update vuln result"
      },
      "delete": {
        "operationId": "vuln_results_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 device vulnerability result.",
            "required": true
          }
        ],
        "tags": [
          "vuln-results"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete vuln result"
      }
    },
    "/api/vuln-results/{id}/mark_not_affected/": {
      "post": {
        "operationId": "vuln_results_mark_not_affected_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": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this device vulnerability result.",
            "required": true
          }
        ],
        "tags": [
          "vuln-results"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceVulnerabilityResultRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DeviceVulnerabilityResultRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DeviceVulnerabilityResultRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeviceVulnerabilityResult"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Mark not affected: vuln result"
      }
    },
    "/api/vuln-results/{id}/mark_patched/": {
      "post": {
        "operationId": "vuln_results_mark_patched_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": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this device vulnerability result.",
            "required": true
          }
        ],
        "tags": [
          "vuln-results"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceVulnerabilityResultRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DeviceVulnerabilityResultRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DeviceVulnerabilityResultRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeviceVulnerabilityResult"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Mark patched: vuln result"
      }
    },
    "/api/vulnerabilities/": {
      "get": {
        "operationId": "vulnerabilities_list",
        "parameters": [
          {
            "in": "query",
            "name": "in_kev",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "kev_ransomware",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "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",
                "informational",
                "low",
                "medium"
              ]
            },
            "description": "* `critical` - Critical\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `informational` - Informational"
          },
          {
            "in": "query",
            "name": "source",
            "schema": {
              "type": "string",
              "enum": [
                "cisa_kev",
                "citrix",
                "f5_psirt",
                "kemp",
                "manual",
                "nvd",
                "palo_alto"
              ]
            },
            "description": "* `nvd` - NVD\n* `cisa_kev` - CISA KEV\n* `f5_psirt` - F5 PSIRT\n* `citrix` - Citrix\n* `palo_alto` - Palo Alto\n* `kemp` - Kemp\n* `manual` - Manual"
          }
        ],
        "tags": [
          "vulnerabilities"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedVulnerabilityListList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List vulnerabilitys"
      },
      "post": {
        "operationId": "vulnerabilities_create",
        "tags": [
          "vulnerabilities"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Vulnerability"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create vulnerability"
      }
    },
    "/api/vulnerabilities/{id}/": {
      "get": {
        "operationId": "vulnerabilities_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this vulnerability.",
            "required": true
          }
        ],
        "tags": [
          "vulnerabilities"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Vulnerability"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve vulnerability"
      },
      "put": {
        "operationId": "vulnerabilities_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this vulnerability.",
            "required": true
          }
        ],
        "tags": [
          "vulnerabilities"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Vulnerability"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update vulnerability"
      },
      "patch": {
        "operationId": "vulnerabilities_partial_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this vulnerability.",
            "required": true
          }
        ],
        "tags": [
          "vulnerabilities"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedVulnerabilityRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedVulnerabilityRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedVulnerabilityRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Vulnerability"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update vulnerability"
      },
      "delete": {
        "operationId": "vulnerabilities_destroy",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this vulnerability.",
            "required": true
          }
        ],
        "tags": [
          "vulnerabilities"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete vulnerability"
      }
    },
    "/api/vulnerabilities/built_in_feeds/": {
      "get": {
        "operationId": "vulnerabilities_built_in_feeds_retrieve",
        "tags": [
          "vulnerabilities"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Vulnerability"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List built in feeds"
      }
    },
    "/api/vulnerabilities/ingest_feeds/": {
      "post": {
        "operationId": "vulnerabilities_ingest_feeds_create",
        "description": "Phase 0+ ingestion path: sync feeds via the new pipeline,\ncompute VulnerabilityMatch rows, and trigger process_new_vulnerabilities.\nOptional body params:\n  feed_id  <int>  \u2014 run a single feed instead of all\n  reprocess true  \u2014 skip fetch, recompute matches on existing vulns (demo mode)",
        "tags": [
          "vulnerabilities"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Vulnerability"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create ingest feed"
      }
    },
    "/api/vulnerabilities/scan_devices/": {
      "post": {
        "operationId": "vulnerabilities_scan_devices_create",
        "tags": [
          "vulnerabilities"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Vulnerability"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create scan device"
      }
    },
    "/api/vulnerabilities/summary/": {
      "get": {
        "operationId": "vulnerabilities_summary_retrieve",
        "tags": [
          "vulnerabilities"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Vulnerability"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List summarys"
      }
    },
    "/api/vulnerabilities/sync_feeds/": {
      "post": {
        "operationId": "vulnerabilities_sync_feeds_create",
        "description": "Trigger a full feed sync in the background (legacy path).",
        "tags": [
          "vulnerabilities"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Vulnerability"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create sync feed"
      }
    },
    "/api/vulnerabilities/sync_logs/": {
      "get": {
        "operationId": "vulnerabilities_sync_logs_retrieve",
        "tags": [
          "vulnerabilities"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Vulnerability"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List sync logs"
      }
    },
    "/api/vulnerabilities/toggle_built_in_feed/": {
      "post": {
        "operationId": "vulnerabilities_toggle_built_in_feed_create",
        "tags": [
          "vulnerabilities"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VulnerabilityRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Vulnerability"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create toggle built in feed"
      }
    }
  },
  "components": {
    "schemas": {
      "PaginatedVulnFeedSourceList": {
        "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/VulnFeedSource"
            }
          }
        }
      },
      "ScannerConnection": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 100
          },
          "provider_kind": {
            "$ref": "#/components/schemas/ProviderKindEnum"
          },
          "region": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RegionEnum"
              }
            ],
            "description": "Data residency region (v4 Cloud only)\n\n* `us` - US (us.api.insight.rapid7.com)\n* `us2` - US2 (us2.api.insight.rapid7.com)\n* `us3` - US3 (us3.api.insight.rapid7.com)\n* `eu` - EU (eu.api.insight.rapid7.com)\n* `ca` - CA (ca.api.insight.rapid7.com)\n* `au` - AU (au.api.insight.rapid7.com)\n* `ap` - AP (ap.api.insight.rapid7.com)"
          },
          "console_url": {
            "type": "string",
            "description": "Base URL. Rapid7 v3: https://hostname:3780. Qualys: your API server, e.g. https://qualysapi.qg3.apps.qualys.com. Tenable.sc: https://securitycenter.example.com",
            "maxLength": 500
          },
          "username": {
            "type": "string",
            "description": "Username (Rapid7 v3 / Qualys basic auth)",
            "maxLength": 200
          },
          "default_site_id": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "nullable": true,
            "description": "Default site ID for triggered scans (Rapid7 v3 only)"
          },
          "access_key": {
            "type": "string",
            "description": "API access key (Tenable.io / Tenable.sc)",
            "maxLength": 200
          },
          "verify_ssl": {
            "type": "boolean"
          },
          "scannable_networks": {
            "description": "CIDR allowlist \u2014 IPs outside these ranges return NOT_SCANNABLE"
          },
          "severity_threshold": {
            "allOf": [
              {
                "$ref": "#/components/schemas/SeverityThresholdEnum"
              }
            ],
            "description": "Minimum severity to trigger a FAIL verdict\n\n* `critical` - Critical only\n* `high_exploitable` - High + exploitable\n* `high` - High and above\n* `medium` - Medium and above"
          },
          "staleness_days": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "description": "Findings older than N days produce a STALE verdict"
          },
          "enabled": {
            "type": "boolean"
          },
          "status": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Status0aeEnum"
              }
            ],
            "readOnly": true
          },
          "status_msg": {
            "type": "string",
            "readOnly": true
          },
          "last_tested": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "last_synced": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "metadata": {
            "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_synced",
          "last_tested",
          "metadata",
          "name",
          "status",
          "status_msg",
          "updated_at"
        ]
      },
      "Trigger738Enum": {
        "enum": [
          "feed_sync",
          "manual"
        ],
        "type": "string",
        "description": "* `feed_sync` - Feed Sync\n* `manual` - Manual"
      },
      "RemediationRunModeEnum": {
        "enum": [
          "script",
          "upgrade_handoff"
        ],
        "type": "string",
        "description": "* `script` - AI Script\n* `upgrade_handoff` - Upgrade Workflow"
      },
      "RemediationRun": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "cve_id": {
            "type": "string",
            "maxLength": 50
          },
          "vendor_type": {
            "type": "string",
            "maxLength": 50
          },
          "mode": {
            "$ref": "#/components/schemas/RemediationRunModeEnum"
          },
          "state": {
            "$ref": "#/components/schemas/RemediationRunStateEnum"
          },
          "change_number": {
            "type": "string",
            "maxLength": 50
          },
          "upgrade_workflow_run_id": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "nullable": true
          },
          "script_text": {
            "type": "string"
          },
          "prevalidation_output": {},
          "postvalidation_output": {},
          "started_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "finished_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "error_detail": {
            "type": "string"
          },
          "finding_summary": {
            "type": "string",
            "readOnly": true
          }
        },
        "required": [
          "cve_id",
          "finding_summary",
          "id",
          "started_at",
          "vendor_type"
        ]
      },
      "WorkflowInvocationListRequest": {
        "type": "object",
        "properties": {
          "workflow_name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "trigger": {
            "$ref": "#/components/schemas/Trigger738Enum"
          },
          "batch_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "cve_ids": {},
          "status": {
            "$ref": "#/components/schemas/StatusFabEnum"
          },
          "finished_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "dedup_key": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          }
        },
        "required": [
          "batch_id",
          "dedup_key"
        ]
      },
      "PatchedVulnerabilityRequest": {
        "type": "object",
        "properties": {
          "cve_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 50
          },
          "advisory_id": {
            "type": "string",
            "maxLength": 100
          },
          "title": {
            "type": "string",
            "minLength": 1
          },
          "description": {
            "type": "string"
          },
          "cvss_score": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "cvss_vector": {
            "type": "string",
            "maxLength": 300
          },
          "severity": {
            "$ref": "#/components/schemas/SeverityC93Enum"
          },
          "affected_vendors": {},
          "affected_products": {},
          "affected_versions": {},
          "published_date": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "last_modified": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "in_kev": {
            "type": "boolean"
          },
          "kev_due_date": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "kev_ransomware": {
            "type": "boolean"
          },
          "source": {
            "allOf": [
              {
                "$ref": "#/components/schemas/SourceAe8Enum"
              }
            ],
            "default": "nvd"
          },
          "source_url": {
            "type": "string",
            "format": "uri",
            "maxLength": 500
          },
          "patch_url": {
            "type": "string",
            "format": "uri",
            "maxLength": 500
          },
          "is_active": {
            "type": "boolean"
          },
          "content_hash": {
            "type": "string",
            "description": "SHA-256 of key fields; change triggers re-match",
            "maxLength": 64
          },
          "first_seen_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "source_feed": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "SubjectEnum": {
        "enum": [
          "access_request",
          "manual"
        ],
        "type": "string",
        "description": "* `access_request` - Firewall Access Request\n* `manual` - Manual Query"
      },
      "VulnerabilityMatchRequest": {
        "type": "object",
        "properties": {
          "vulnerability": {
            "type": "integer"
          },
          "device": {
            "type": "integer"
          },
          "vendor_type": {
            "type": "string",
            "minLength": 1,
            "maxLength": 50
          },
          "running_version": {
            "type": "string",
            "maxLength": 100
          },
          "in_range": {
            "type": "boolean"
          },
          "status": {
            "$ref": "#/components/schemas/VulnerabilityMatchStatusEnum"
          },
          "resolved_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "device",
          "vendor_type",
          "vulnerability"
        ]
      },
      "PaginatedVulnAIAnalysisList": {
        "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/VulnAIAnalysis"
            }
          }
        }
      },
      "ScannerAsset": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "connection": {
            "type": "integer"
          },
          "external_id": {
            "type": "string",
            "description": "Scanner-side asset ID (string for portability)",
            "maxLength": 100
          },
          "ips": {
            "description": "All known IP addresses"
          },
          "hostnames": {},
          "os_name": {
            "type": "string",
            "maxLength": 300
          },
          "risk_score": {
            "type": "number",
            "format": "double"
          },
          "criticality": {
            "type": "string",
            "description": "Asset criticality tag from scanner",
            "maxLength": 50
          },
          "last_scan_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "synced_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "device": {
            "type": "integer",
            "nullable": true
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "finding_count": {
            "type": "string",
            "readOnly": true
          },
          "critical_count": {
            "type": "string",
            "readOnly": true
          }
        },
        "required": [
          "connection",
          "critical_count",
          "device_name",
          "external_id",
          "finding_count",
          "id",
          "synced_at"
        ]
      },
      "StatusFabEnum": {
        "enum": [
          "running",
          "partial",
          "succeeded",
          "failed",
          "cancelled"
        ],
        "type": "string",
        "description": "* `running` - Running\n* `partial` - Partial\n* `succeeded` - Succeeded\n* `failed` - Failed\n* `cancelled` - Cancelled"
      },
      "VulnerabilityRequest": {
        "type": "object",
        "properties": {
          "cve_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 50
          },
          "advisory_id": {
            "type": "string",
            "maxLength": 100
          },
          "title": {
            "type": "string",
            "minLength": 1
          },
          "description": {
            "type": "string"
          },
          "cvss_score": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "cvss_vector": {
            "type": "string",
            "maxLength": 300
          },
          "severity": {
            "$ref": "#/components/schemas/SeverityC93Enum"
          },
          "affected_vendors": {},
          "affected_products": {},
          "affected_versions": {},
          "published_date": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "last_modified": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "in_kev": {
            "type": "boolean"
          },
          "kev_due_date": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "kev_ransomware": {
            "type": "boolean"
          },
          "source": {
            "allOf": [
              {
                "$ref": "#/components/schemas/SourceAe8Enum"
              }
            ],
            "default": "nvd"
          },
          "source_url": {
            "type": "string",
            "format": "uri",
            "maxLength": 500
          },
          "patch_url": {
            "type": "string",
            "format": "uri",
            "maxLength": 500
          },
          "is_active": {
            "type": "boolean"
          },
          "content_hash": {
            "type": "string",
            "description": "SHA-256 of key fields; change triggers re-match",
            "maxLength": 64
          },
          "first_seen_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "source_feed": {
            "type": "integer",
            "nullable": true
          }
        },
        "required": [
          "cve_id",
          "title"
        ]
      },
      "WorkflowInvocationDetail": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "workflow_name": {
            "type": "string",
            "maxLength": 100
          },
          "trigger": {
            "$ref": "#/components/schemas/Trigger738Enum"
          },
          "batch_id": {
            "type": "string",
            "maxLength": 64
          },
          "cve_ids": {},
          "status": {
            "$ref": "#/components/schemas/StatusFabEnum"
          },
          "started_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "finished_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "summary_json": {},
          "dedup_key": {
            "type": "string",
            "maxLength": 64
          },
          "matches": {
            "type": "string",
            "readOnly": true
          },
          "ai_analyses": {
            "type": "string",
            "readOnly": true
          },
          "itsm_links": {
            "type": "string",
            "readOnly": true
          },
          "remediation_runs": {
            "type": "string",
            "readOnly": true
          }
        },
        "required": [
          "ai_analyses",
          "batch_id",
          "dedup_key",
          "id",
          "itsm_links",
          "matches",
          "remediation_runs",
          "started_at"
        ]
      },
      "VulnerabilityMatch": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "vulnerability": {
            "type": "integer"
          },
          "cve_id": {
            "type": "string",
            "readOnly": true
          },
          "severity": {
            "type": "string",
            "readOnly": true
          },
          "device": {
            "type": "integer"
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "device_hostname": {
            "type": "string",
            "readOnly": true
          },
          "device_mgmt_ip": {
            "type": "string",
            "readOnly": true
          },
          "vendor_type": {
            "type": "string",
            "maxLength": 50
          },
          "running_version": {
            "type": "string",
            "maxLength": 100
          },
          "in_range": {
            "type": "boolean"
          },
          "status": {
            "$ref": "#/components/schemas/VulnerabilityMatchStatusEnum"
          },
          "resolved_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "cve_id",
          "device",
          "device_hostname",
          "device_mgmt_ip",
          "device_name",
          "id",
          "severity",
          "updated_at",
          "vendor_type",
          "vulnerability"
        ]
      },
      "VulnerabilityList": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "cve_id": {
            "type": "string",
            "maxLength": 50
          },
          "advisory_id": {
            "type": "string",
            "maxLength": 100
          },
          "title": {
            "type": "string"
          },
          "severity": {
            "$ref": "#/components/schemas/SeverityC93Enum"
          },
          "cvss_score": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "affected_vendors": {},
          "affected_products": {},
          "published_date": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "in_kev": {
            "type": "boolean"
          },
          "kev_due_date": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "kev_ransomware": {
            "type": "boolean"
          },
          "source": {
            "allOf": [
              {
                "$ref": "#/components/schemas/SourceAe8Enum"
              }
            ],
            "default": "nvd"
          },
          "source_url": {
            "type": "string",
            "format": "uri",
            "maxLength": 500
          },
          "patch_url": {
            "type": "string",
            "format": "uri",
            "maxLength": 500
          },
          "is_active": {
            "type": "boolean"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "affected_device_count": {
            "type": "string",
            "readOnly": true
          },
          "content_hash": {
            "type": "string",
            "description": "SHA-256 of key fields; change triggers re-match",
            "maxLength": 64
          },
          "first_seen_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "affected_device_count",
          "cve_id",
          "id",
          "title",
          "updated_at"
        ]
      },
      "ProviderKindEnum": {
        "enum": [
          "rapid7_v4",
          "rapid7_v3",
          "qualys",
          "tenable_io",
          "tenable_sc"
        ],
        "type": "string",
        "description": "* `rapid7_v4` - Rapid7 InsightVM Cloud (API v4)\n* `rapid7_v3` - Rapid7 InsightVM / Nexpose Console (API v3)\n* `qualys` - Qualys VMDR / Cloud Platform\n* `tenable_io` - Tenable Vulnerability Management (Tenable.io)\n* `tenable_sc` - Tenable Security Center (on-prem)"
      },
      "SeverityThresholdEnum": {
        "enum": [
          "critical",
          "high_exploitable",
          "high",
          "medium"
        ],
        "type": "string",
        "description": "* `critical` - Critical only\n* `high_exploitable` - High + exploitable\n* `high` - High and above\n* `medium` - Medium and above"
      },
      "PaginatedDeviceVulnerabilityResultList": {
        "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/DeviceVulnerabilityResult"
            }
          }
        }
      },
      "ScanJobStateEnum": {
        "enum": [
          "queued",
          "running",
          "succeeded",
          "failed",
          "timeout"
        ],
        "type": "string",
        "description": "* `queued` - Queued\n* `running` - Running\n* `succeeded` - Succeeded\n* `failed` - Failed\n* `timeout` - Timed Out"
      },
      "VulnAIAnalysis": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "cve_id": {
            "type": "string",
            "maxLength": 50
          },
          "response_text": {
            "type": "string"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "idempotency_key": {
            "type": "string",
            "maxLength": 64
          },
          "vendor_findings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VulnAIVendorFinding"
            },
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "cve_id",
          "id",
          "idempotency_key",
          "response_text",
          "vendor_findings"
        ]
      },
      "PaginatedRemediationRunList": {
        "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/RemediationRun"
            }
          }
        }
      },
      "SourceAe8Enum": {
        "enum": [
          "nvd",
          "cisa_kev",
          "f5_psirt",
          "citrix",
          "palo_alto",
          "kemp",
          "manual"
        ],
        "type": "string",
        "description": "* `nvd` - NVD\n* `cisa_kev` - CISA KEV\n* `f5_psirt` - F5 PSIRT\n* `citrix` - Citrix\n* `palo_alto` - Palo Alto\n* `kemp` - Kemp\n* `manual` - Manual"
      },
      "PaginatedFeedSyncRunList": {
        "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/FeedSyncRun"
            }
          }
        }
      },
      "PatchedVulnFeedSourceRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "feed_type": {
            "$ref": "#/components/schemas/FeedTypeEnum"
          },
          "url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "maxLength": 1000
          },
          "api_key": {
            "type": "string",
            "maxLength": 500
          },
          "enabled": {
            "type": "boolean"
          },
          "last_fetched": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "last_count": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "last_error": {
            "type": "string"
          },
          "extra_config": {},
          "poll_interval_s": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "description": "Polling interval in seconds"
          },
          "last_status": {
            "type": "string",
            "description": "ok | partial | error from last FeedSyncRun",
            "maxLength": 20
          }
        }
      },
      "PaginatedVulnerabilityMatchList": {
        "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/VulnerabilityMatch"
            }
          }
        }
      },
      "PaginatedScannerAssetList": {
        "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/ScannerAsset"
            }
          }
        }
      },
      "VulnerabilityMatchStatusEnum": {
        "enum": [
          "active",
          "remediated",
          "suppressed",
          "not_applicable"
        ],
        "type": "string",
        "description": "* `active` - Active\n* `remediated` - Remediated\n* `suppressed` - Suppressed\n* `not_applicable` - Not Applicable"
      },
      "FeedTypeEnum": {
        "enum": [
          "nvd_cve",
          "nvd_cpe",
          "cisco_psirt",
          "f5_security",
          "paloalto_unit42",
          "generic_json",
          "generic_csv"
        ],
        "type": "string",
        "description": "* `nvd_cve` - NVD CVE JSON Feed\n* `nvd_cpe` - NVD CPE Dictionary\n* `cisco_psirt` - Cisco PSIRT openVuln\n* `f5_security` - F5 Security Advisories\n* `paloalto_unit42` - Palo Alto Unit 42\n* `generic_json` - Generic JSON Feed\n* `generic_csv` - Generic CSV Feed"
      },
      "VulnFeedSource": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "feed_type": {
            "$ref": "#/components/schemas/FeedTypeEnum"
          },
          "feed_type_display": {
            "type": "string",
            "readOnly": true
          },
          "url": {
            "type": "string",
            "format": "uri",
            "maxLength": 1000
          },
          "api_key": {
            "type": "string",
            "maxLength": 500
          },
          "enabled": {
            "type": "boolean"
          },
          "last_fetched": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "last_count": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "last_error": {
            "type": "string"
          },
          "extra_config": {},
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "poll_interval_s": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "description": "Polling interval in seconds"
          },
          "last_status": {
            "type": "string",
            "description": "ok | partial | error from last FeedSyncRun",
            "maxLength": 20
          },
          "last_sync_run": {
            "type": "string",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "feed_type",
          "feed_type_display",
          "id",
          "last_sync_run",
          "name",
          "url"
        ]
      },
      "FeedSyncRun": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "feed": {
            "type": "integer"
          },
          "feed_name": {
            "type": "string",
            "readOnly": true
          },
          "started_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "finished_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/FeedSyncRunStatusEnum"
          },
          "cursor_before": {
            "type": "string"
          },
          "cursor_after": {
            "type": "string"
          },
          "new_count": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "changed_count": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "error_detail": {
            "type": "string"
          }
        },
        "required": [
          "feed",
          "feed_name",
          "id",
          "started_at"
        ]
      },
      "PatchedScannerConnectionRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "provider_kind": {
            "$ref": "#/components/schemas/ProviderKindEnum"
          },
          "region": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RegionEnum"
              }
            ],
            "description": "Data residency region (v4 Cloud only)\n\n* `us` - US (us.api.insight.rapid7.com)\n* `us2` - US2 (us2.api.insight.rapid7.com)\n* `us3` - US3 (us3.api.insight.rapid7.com)\n* `eu` - EU (eu.api.insight.rapid7.com)\n* `ca` - CA (ca.api.insight.rapid7.com)\n* `au` - AU (au.api.insight.rapid7.com)\n* `ap` - AP (ap.api.insight.rapid7.com)"
          },
          "api_key": {
            "type": "string",
            "writeOnly": true
          },
          "console_url": {
            "type": "string",
            "description": "Base URL. Rapid7 v3: https://hostname:3780. Qualys: your API server, e.g. https://qualysapi.qg3.apps.qualys.com. Tenable.sc: https://securitycenter.example.com",
            "maxLength": 500
          },
          "username": {
            "type": "string",
            "description": "Username (Rapid7 v3 / Qualys basic auth)",
            "maxLength": 200
          },
          "password": {
            "type": "string",
            "writeOnly": true
          },
          "default_site_id": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "nullable": true,
            "description": "Default site ID for triggered scans (Rapid7 v3 only)"
          },
          "access_key": {
            "type": "string",
            "description": "API access key (Tenable.io / Tenable.sc)",
            "maxLength": 200
          },
          "secret_key": {
            "type": "string",
            "writeOnly": true
          },
          "verify_ssl": {
            "type": "boolean"
          },
          "scannable_networks": {
            "description": "CIDR allowlist \u2014 IPs outside these ranges return NOT_SCANNABLE"
          },
          "severity_threshold": {
            "allOf": [
              {
                "$ref": "#/components/schemas/SeverityThresholdEnum"
              }
            ],
            "description": "Minimum severity to trigger a FAIL verdict\n\n* `critical` - Critical only\n* `high_exploitable` - High + exploitable\n* `high` - High and above\n* `medium` - Medium and above"
          },
          "staleness_days": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "description": "Findings older than N days produce a STALE verdict"
          },
          "enabled": {
            "type": "boolean"
          }
        }
      },
      "PaginatedScannerConnectionList": {
        "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/ScannerConnection"
            }
          }
        }
      },
      "ScannerFinding": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "connection": {
            "type": "integer"
          },
          "asset": {
            "type": "integer"
          },
          "asset_ips": {
            "type": "string",
            "readOnly": true
          },
          "vuln_external_id": {
            "type": "string",
            "description": "Scanner-internal vuln ID (e.g. rapid7-vuln-XXX)",
            "maxLength": 200
          },
          "cve_ids": {
            "description": "Associated CVE IDs"
          },
          "title": {
            "type": "string"
          },
          "severity": {
            "$ref": "#/components/schemas/ScannerFindingSeverityEnum"
          },
          "cvss_v3": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "cvss_v2": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/ScannerFindingStatusEnum"
          },
          "port": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "nullable": true
          },
          "protocol": {
            "type": "string",
            "maxLength": 10
          },
          "exploit_available": {
            "type": "boolean"
          },
          "solution_summary": {
            "type": "string"
          },
          "first_found": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "last_found": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "synced_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "asset",
          "asset_ips",
          "connection",
          "id",
          "severity",
          "synced_at",
          "vuln_external_id"
        ]
      },
      "RemediationRunStateEnum": {
        "enum": [
          "awaiting_approval",
          "generating",
          "pre_validate",
          "implement",
          "post_validate",
          "succeeded",
          "failed",
          "cancelled",
          "rolled_back"
        ],
        "type": "string",
        "description": "* `awaiting_approval` - Awaiting Approval\n* `generating` - Generating Script\n* `pre_validate` - Pre-Validation\n* `implement` - Implementing\n* `post_validate` - Post-Validation\n* `succeeded` - Succeeded\n* `failed` - Failed\n* `cancelled` - Cancelled\n* `rolled_back` - Rolled Back"
      },
      "PaginatedVulnerabilityListList": {
        "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/VulnerabilityList"
            }
          }
        }
      },
      "FixClassEnum": {
        "enum": [
          "upgrade",
          "config_change",
          "mitigation",
          "none"
        ],
        "type": "string",
        "description": "* `upgrade` - Upgrade\n* `config_change` - Config Change\n* `mitigation` - Mitigation\n* `none` - No Published Fix"
      },
      "VulnFeedSourceRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "feed_type": {
            "$ref": "#/components/schemas/FeedTypeEnum"
          },
          "url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "maxLength": 1000
          },
          "api_key": {
            "type": "string",
            "maxLength": 500
          },
          "enabled": {
            "type": "boolean"
          },
          "last_fetched": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "last_count": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "last_error": {
            "type": "string"
          },
          "extra_config": {},
          "poll_interval_s": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "description": "Polling interval in seconds"
          },
          "last_status": {
            "type": "string",
            "description": "ok | partial | error from last FeedSyncRun",
            "maxLength": 20
          }
        },
        "required": [
          "feed_type",
          "name",
          "url"
        ]
      },
      "RiskAssessment": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "connection": {
            "type": "integer"
          },
          "subject": {
            "$ref": "#/components/schemas/SubjectEnum"
          },
          "access_request_id": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "nullable": true
          },
          "verdict": {
            "$ref": "#/components/schemas/VerdictEnum"
          },
          "threshold_used": {
            "type": "string",
            "maxLength": 30
          },
          "findings_summary": {
            "description": "Counts, top findings, scannable partitions"
          },
          "queried_ips": {},
          "created_by": {
            "type": "string",
            "maxLength": 200
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "connection",
          "created_at",
          "id",
          "verdict"
        ]
      },
      "WorkflowInvocationList": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "workflow_name": {
            "type": "string",
            "maxLength": 100
          },
          "trigger": {
            "$ref": "#/components/schemas/Trigger738Enum"
          },
          "batch_id": {
            "type": "string",
            "maxLength": 64
          },
          "cve_ids": {},
          "status": {
            "$ref": "#/components/schemas/StatusFabEnum"
          },
          "started_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "finished_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "dedup_key": {
            "type": "string",
            "maxLength": 64
          }
        },
        "required": [
          "batch_id",
          "dedup_key",
          "id",
          "started_at"
        ]
      },
      "ScanJobRequest": {
        "type": "object",
        "properties": {
          "connection": {
            "type": "integer"
          },
          "targets": {
            "description": "List of IPs/CIDRs scanned"
          },
          "requested_by": {
            "type": "string",
            "maxLength": 200
          },
          "ticket_ref": {
            "type": "string",
            "description": "Access request ID or ticket number that triggered this scan",
            "maxLength": 100
          }
        },
        "required": [
          "connection"
        ]
      },
      "PatchedDeviceVulnerabilityResultRequest": {
        "type": "object",
        "properties": {
          "device": {
            "type": "integer"
          },
          "vulnerability": {
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/DeviceVulnerabilityResultStatusEnum"
          },
          "evidence": {
            "type": "string"
          }
        }
      },
      "DeviceVulnerabilityResultRequest": {
        "type": "object",
        "properties": {
          "device": {
            "type": "integer"
          },
          "vulnerability": {
            "type": "integer"
          },
          "status": {
            "$ref": "#/components/schemas/DeviceVulnerabilityResultStatusEnum"
          },
          "evidence": {
            "type": "string"
          }
        },
        "required": [
          "device",
          "vulnerability"
        ]
      },
      "DeviceVulnerabilityResult": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "device": {
            "type": "integer"
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "device_vendor": {
            "type": "string",
            "readOnly": true
          },
          "device_version": {
            "type": "string",
            "readOnly": true
          },
          "device_mgmt_ip": {
            "type": "string",
            "readOnly": true
          },
          "vulnerability": {
            "type": "integer"
          },
          "cve_id": {
            "type": "string",
            "readOnly": true
          },
          "severity": {
            "type": "string",
            "readOnly": true
          },
          "cvss_score": {
            "type": "number",
            "format": "double",
            "readOnly": true
          },
          "in_kev": {
            "type": "boolean",
            "readOnly": true
          },
          "status": {
            "$ref": "#/components/schemas/DeviceVulnerabilityResultStatusEnum"
          },
          "evidence": {
            "type": "string"
          },
          "checked_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "checked_at",
          "cve_id",
          "cvss_score",
          "device",
          "device_mgmt_ip",
          "device_name",
          "device_vendor",
          "device_version",
          "id",
          "in_kev",
          "severity",
          "vulnerability"
        ]
      },
      "FeedSyncRunStatusEnum": {
        "enum": [
          "running",
          "ok",
          "partial",
          "error"
        ],
        "type": "string",
        "description": "* `running` - Running\n* `ok` - OK\n* `partial` - Partial\n* `error` - Error"
      },
      "SeverityC93Enum": {
        "enum": [
          "critical",
          "high",
          "medium",
          "low",
          "informational"
        ],
        "type": "string",
        "description": "* `critical` - Critical\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `informational` - Informational"
      },
      "Vulnerability": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "affected_device_count": {
            "type": "string",
            "readOnly": true
          },
          "cve_id": {
            "type": "string",
            "maxLength": 50
          },
          "advisory_id": {
            "type": "string",
            "maxLength": 100
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "cvss_score": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "cvss_vector": {
            "type": "string",
            "maxLength": 300
          },
          "severity": {
            "$ref": "#/components/schemas/SeverityC93Enum"
          },
          "affected_vendors": {},
          "affected_products": {},
          "affected_versions": {},
          "published_date": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "last_modified": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "in_kev": {
            "type": "boolean"
          },
          "kev_due_date": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "kev_ransomware": {
            "type": "boolean"
          },
          "source": {
            "allOf": [
              {
                "$ref": "#/components/schemas/SourceAe8Enum"
              }
            ],
            "default": "nvd"
          },
          "source_url": {
            "type": "string",
            "format": "uri",
            "maxLength": 500
          },
          "patch_url": {
            "type": "string",
            "format": "uri",
            "maxLength": 500
          },
          "is_active": {
            "type": "boolean"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "content_hash": {
            "type": "string",
            "description": "SHA-256 of key fields; change triggers re-match",
            "maxLength": 64
          },
          "first_seen_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "source_feed": {
            "type": "integer",
            "nullable": true
          }
        },
        "required": [
          "affected_device_count",
          "created_at",
          "cve_id",
          "id",
          "title",
          "updated_at"
        ]
      },
      "ScannerFindingStatusEnum": {
        "enum": [
          "vulnerable",
          "remediated",
          "exception"
        ],
        "type": "string",
        "description": "* `vulnerable` - Vulnerable\n* `remediated` - Remediated\n* `exception` - Exception"
      },
      "DeviceVulnerabilityResultStatusEnum": {
        "enum": [
          "potentially_affected",
          "confirmed",
          "patched",
          "not_affected"
        ],
        "type": "string",
        "description": "* `potentially_affected` - Potentially Affected\n* `confirmed` - Confirmed Affected\n* `patched` - Patched\n* `not_affected` - Not Affected"
      },
      "ScanJob": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "connection": {
            "type": "integer"
          },
          "targets": {
            "description": "List of IPs/CIDRs scanned"
          },
          "external_scan_id": {
            "type": "string",
            "readOnly": true,
            "description": "Scanner-side scan ID for polling"
          },
          "state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ScanJobStateEnum"
              }
            ],
            "readOnly": true
          },
          "requested_by": {
            "type": "string",
            "maxLength": 200
          },
          "ticket_ref": {
            "type": "string",
            "description": "Access request ID or ticket number that triggered this scan",
            "maxLength": 100
          },
          "started_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "finished_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "error": {
            "type": "string",
            "readOnly": true
          }
        },
        "required": [
          "connection",
          "error",
          "external_scan_id",
          "finished_at",
          "id",
          "started_at",
          "state"
        ]
      },
      "RemediationRunRequest": {
        "type": "object",
        "properties": {
          "cve_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 50
          },
          "vendor_type": {
            "type": "string",
            "minLength": 1,
            "maxLength": 50
          },
          "mode": {
            "$ref": "#/components/schemas/RemediationRunModeEnum"
          },
          "state": {
            "$ref": "#/components/schemas/RemediationRunStateEnum"
          },
          "change_number": {
            "type": "string",
            "maxLength": 50
          },
          "upgrade_workflow_run_id": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "nullable": true
          },
          "script_text": {
            "type": "string"
          },
          "prevalidation_output": {},
          "postvalidation_output": {},
          "finished_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "error_detail": {
            "type": "string"
          }
        },
        "required": [
          "cve_id",
          "vendor_type"
        ]
      },
      "PaginatedRiskAssessmentList": {
        "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/RiskAssessment"
            }
          }
        }
      },
      "VulnAIVendorFinding": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "cve_id": {
            "type": "string",
            "maxLength": 50
          },
          "vendor_type": {
            "type": "string",
            "maxLength": 50
          },
          "fix_class": {
            "$ref": "#/components/schemas/FixClassEnum"
          },
          "fixed_versions": {},
          "cited_vendor_docs": {},
          "notes": {
            "type": "string"
          }
        },
        "required": [
          "cve_id",
          "id",
          "vendor_type"
        ]
      },
      "RegionEnum": {
        "enum": [
          "us",
          "us2",
          "us3",
          "eu",
          "ca",
          "au",
          "ap"
        ],
        "type": "string",
        "description": "* `us` - US (us.api.insight.rapid7.com)\n* `us2` - US2 (us2.api.insight.rapid7.com)\n* `us3` - US3 (us3.api.insight.rapid7.com)\n* `eu` - EU (eu.api.insight.rapid7.com)\n* `ca` - CA (ca.api.insight.rapid7.com)\n* `au` - AU (au.api.insight.rapid7.com)\n* `ap` - AP (ap.api.insight.rapid7.com)"
      },
      "ScannerConnectionRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "provider_kind": {
            "$ref": "#/components/schemas/ProviderKindEnum"
          },
          "region": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RegionEnum"
              }
            ],
            "description": "Data residency region (v4 Cloud only)\n\n* `us` - US (us.api.insight.rapid7.com)\n* `us2` - US2 (us2.api.insight.rapid7.com)\n* `us3` - US3 (us3.api.insight.rapid7.com)\n* `eu` - EU (eu.api.insight.rapid7.com)\n* `ca` - CA (ca.api.insight.rapid7.com)\n* `au` - AU (au.api.insight.rapid7.com)\n* `ap` - AP (ap.api.insight.rapid7.com)"
          },
          "api_key": {
            "type": "string",
            "writeOnly": true
          },
          "console_url": {
            "type": "string",
            "description": "Base URL. Rapid7 v3: https://hostname:3780. Qualys: your API server, e.g. https://qualysapi.qg3.apps.qualys.com. Tenable.sc: https://securitycenter.example.com",
            "maxLength": 500
          },
          "username": {
            "type": "string",
            "description": "Username (Rapid7 v3 / Qualys basic auth)",
            "maxLength": 200
          },
          "password": {
            "type": "string",
            "writeOnly": true
          },
          "default_site_id": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "nullable": true,
            "description": "Default site ID for triggered scans (Rapid7 v3 only)"
          },
          "access_key": {
            "type": "string",
            "description": "API access key (Tenable.io / Tenable.sc)",
            "maxLength": 200
          },
          "secret_key": {
            "type": "string",
            "writeOnly": true
          },
          "verify_ssl": {
            "type": "boolean"
          },
          "scannable_networks": {
            "description": "CIDR allowlist \u2014 IPs outside these ranges return NOT_SCANNABLE"
          },
          "severity_threshold": {
            "allOf": [
              {
                "$ref": "#/components/schemas/SeverityThresholdEnum"
              }
            ],
            "description": "Minimum severity to trigger a FAIL verdict\n\n* `critical` - Critical only\n* `high_exploitable` - High + exploitable\n* `high` - High and above\n* `medium` - Medium and above"
          },
          "staleness_days": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "description": "Findings older than N days produce a STALE verdict"
          },
          "enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "name"
        ]
      },
      "VerdictEnum": {
        "enum": [
          "pass",
          "fail",
          "not_scannable",
          "stale",
          "error"
        ],
        "type": "string",
        "description": "* `pass` - Pass \u2014 no findings above threshold\n* `fail` - Fail \u2014 findings above threshold\n* `not_scannable` - Not Scannable \u2014 IPs outside scannable ranges\n* `stale` - Stale \u2014 last scan older than threshold\n* `error` - Error \u2014 scanner unreachable"
      },
      "PaginatedWorkflowInvocationListList": {
        "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/WorkflowInvocationList"
            }
          }
        }
      },
      "PaginatedScanJobList": {
        "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/ScanJob"
            }
          }
        }
      },
      "Status0aeEnum": {
        "enum": [
          "unchecked",
          "ok",
          "error"
        ],
        "type": "string",
        "description": "* `unchecked` - Not tested\n* `ok` - Connected\n* `error` - Connection error"
      },
      "ScannerFindingSeverityEnum": {
        "enum": [
          "critical",
          "severe",
          "moderate",
          "low",
          "info"
        ],
        "type": "string",
        "description": "* `critical` - Critical\n* `severe` - Severe / High\n* `moderate` - Moderate / Medium\n* `low` - Low\n* `info` - Informational"
      },
      "PaginatedScannerFindingList": {
        "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/ScannerFinding"
            }
          }
        }
      }
    }
  }
}