{
  "openapi": "3.0.3",
  "info": {
    "title": "Application Delivery (ADC) API",
    "version": "1.0.0",
    "description": "Application delivery controllers \u2014 virtual servers, pools, monitors, iRules, GTM/DNS, AS3, and config hygiene."
  },
  "servers": [
    {
      "url": "https://versus-demo.com"
    }
  ],
  "paths": {
    "/api/applications/": {
      "get": {
        "operationId": "applications_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": [
          "applications"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedApplicationList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List applications"
      },
      "post": {
        "operationId": "applications_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": [
          "applications"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApplicationRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ApplicationRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ApplicationRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Application"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create application"
      }
    },
    "/api/applications/{id}/": {
      "get": {
        "operationId": "applications_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 application.",
            "required": true
          }
        ],
        "tags": [
          "applications"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApplicationDetail"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve application"
      },
      "put": {
        "operationId": "applications_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 application.",
            "required": true
          }
        ],
        "tags": [
          "applications"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApplicationRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ApplicationRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ApplicationRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Application"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update application"
      },
      "patch": {
        "operationId": "applications_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 application.",
            "required": true
          }
        ],
        "tags": [
          "applications"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedApplicationRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedApplicationRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedApplicationRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Application"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update application"
      },
      "delete": {
        "operationId": "applications_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 application.",
            "required": true
          }
        ],
        "tags": [
          "applications"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete application"
      }
    },
    "/api/applications/{id}/update_canvas/": {
      "patch": {
        "operationId": "applications_update_canvas_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 application.",
            "required": true
          }
        ],
        "tags": [
          "applications"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedApplicationRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedApplicationRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedApplicationRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Application"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update canvas: application"
      }
    },
    "/api/as3-templates/": {
      "get": {
        "operationId": "as3_templates_list",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "required": false,
            "in": "query",
            "description": "A page number within the paginated result set.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "page_size",
            "required": false,
            "in": "query",
            "description": "Number of results to return per page.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "as3-templates"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedAs3TemplateList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List as3 templates"
      },
      "post": {
        "operationId": "as3_templates_create",
        "tags": [
          "as3-templates"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/As3TemplateRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/As3TemplateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/As3TemplateRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/As3Template"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create as3 template"
      }
    },
    "/api/as3-templates/{id}/": {
      "get": {
        "operationId": "as3_templates_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this as3 template.",
            "required": true
          }
        ],
        "tags": [
          "as3-templates"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/As3Template"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve as3 template"
      },
      "put": {
        "operationId": "as3_templates_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this as3 template.",
            "required": true
          }
        ],
        "tags": [
          "as3-templates"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/As3TemplateRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/As3TemplateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/As3TemplateRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/As3Template"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update as3 template"
      },
      "patch": {
        "operationId": "as3_templates_partial_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this as3 template.",
            "required": true
          }
        ],
        "tags": [
          "as3-templates"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAs3TemplateRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAs3TemplateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAs3TemplateRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/As3Template"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update as3 template"
      },
      "delete": {
        "operationId": "as3_templates_destroy",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this as3 template.",
            "required": true
          }
        ],
        "tags": [
          "as3-templates"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete as3 template"
      }
    },
    "/api/datagroups/": {
      "get": {
        "operationId": "datagroups_list",
        "parameters": [
          {
            "in": "query",
            "name": "device",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "dg_type",
            "schema": {
              "type": "string",
              "enum": [
                "integer",
                "ip",
                "string"
              ]
            },
            "description": "* `string` - String\n* `integer` - Integer\n* `ip` - IP"
          },
          {
            "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": "partition",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "datagroups"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedDataGroupList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List datagroups"
      }
    },
    "/api/datagroups/{id}/": {
      "get": {
        "operationId": "datagroups_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this data group.",
            "required": true
          }
        ],
        "tags": [
          "datagroups"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DataGroup"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve datagroup"
      }
    },
    "/api/f5-stale-vs/": {
      "get": {
        "operationId": "f5_stale_vs_list",
        "parameters": [
          {
            "in": "query",
            "name": "device",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "is_enabled",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "partition",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string",
              "enum": [
                "active",
                "disabled",
                "no_traffic"
              ]
            },
            "description": "* `disabled` - Disabled\n* `no_traffic` - No Traffic\n* `active` - Active"
          }
        ],
        "tags": [
          "f5-stale-vs"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/F5StaleVirtualServer"
                  }
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List f5 stale vs"
      }
    },
    "/api/f5-stale-vs/{id}/": {
      "get": {
        "operationId": "f5_stale_vs_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this f5 stale virtual server.",
            "required": true
          }
        ],
        "tags": [
          "f5-stale-vs"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/F5StaleVirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve f5 stale v"
      }
    },
    "/api/f5-stale-vs/criteria/": {
      "get": {
        "operationId": "f5_stale_vs_criteria_retrieve",
        "description": "Current staleness criteria (Settings > Stale Virtual Servers),\nsurfaced on the tab itself so the definition of \"stale\" is visible\nnext to the results it produced, not just buried in Settings.",
        "tags": [
          "f5-stale-vs"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/F5StaleVirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List criterias"
      }
    },
    "/api/f5-stale-vs/reset_status/": {
      "post": {
        "operationId": "f5_stale_vs_reset_status_create",
        "description": "Resets the live F5 traffic counters for the given\nF5StaleVirtualServer rows (tmsh 'reset-stats' equivalent) and\nrecords stats_reset_at as the new zero-traffic window start \u2014\nthis device write is why the endpoint is POST-only and admin-gated\nat the URL/permission layer like every other config-changing action.",
        "tags": [
          "f5-stale-vs"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/F5StaleVirtualServerRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/F5StaleVirtualServerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/F5StaleVirtualServerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/F5StaleVirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create reset statu"
      }
    },
    "/api/f5-stale-vs/trigger_scan/": {
      "post": {
        "operationId": "f5_stale_vs_trigger_scan_create",
        "description": "Trigger an immediate scan for a specific device or all devices.\n\nRuns in a background thread within this process rather than\nspawning a separate `manage.py` subprocess \u2014 Popen() succeeding\nonly proves the process launched, not that it ran correctly, and\ngave zero visibility into failures (no LOGGING config means\nlogger.* calls are silently dropped \u2014 see check_f5_stale_vs.py),\nwhich is why \"Scan Now\" looked like it did nothing on failure.",
        "tags": [
          "f5-stale-vs"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/F5StaleVirtualServerRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/F5StaleVirtualServerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/F5StaleVirtualServerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/F5StaleVirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create trigger scan"
      }
    },
    "/api/f5-stale-wideips/": {
      "get": {
        "operationId": "f5_stale_wideips_list",
        "parameters": [
          {
            "in": "query",
            "name": "device",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "is_enabled",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "partition",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string",
              "enum": [
                "active",
                "disabled",
                "no_healthy_members"
              ]
            },
            "description": "* `disabled` - Disabled\n* `no_healthy_members` - No Healthy Members\n* `active` - Active"
          }
        ],
        "tags": [
          "f5-stale-wideips"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/F5StaleWideIP"
                  }
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List f5 stale wideips"
      }
    },
    "/api/f5-stale-wideips/{id}/": {
      "get": {
        "operationId": "f5_stale_wideips_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this f5 stale wide ip.",
            "required": true
          }
        ],
        "tags": [
          "f5-stale-wideips"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/F5StaleWideIP"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve f5 stale wideip"
      }
    },
    "/api/f5-stale-wideips/criteria/": {
      "get": {
        "operationId": "f5_stale_wideips_criteria_retrieve",
        "description": "Current staleness criteria (Settings > Stale WideIPs).",
        "tags": [
          "f5-stale-wideips"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/F5StaleWideIP"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List criterias"
      }
    },
    "/api/f5-stale-wideips/reset_status/": {
      "post": {
        "operationId": "f5_stale_wideips_reset_status_create",
        "description": "Restarts the no-healthy-members window for the given\nF5StaleWideIP rows. Unlike the VS equivalent, this is a pure local\ntimestamp reset \u2014 GTM Wide IPs carry no traffic counters on the live\ndevice to reset, so no F5Client call is made here.",
        "tags": [
          "f5-stale-wideips"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/F5StaleWideIPRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/F5StaleWideIPRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/F5StaleWideIPRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/F5StaleWideIP"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create reset statu"
      }
    },
    "/api/f5-stale-wideips/trigger_scan/": {
      "post": {
        "operationId": "f5_stale_wideips_trigger_scan_create",
        "description": "Trigger an immediate scan for a specific device or all devices.\nRuns in a background thread, same rationale as F5StaleVirtualServerViewSet.trigger_scan.",
        "tags": [
          "f5-stale-wideips"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/F5StaleWideIPRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/F5StaleWideIPRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/F5StaleWideIPRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/F5StaleWideIP"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create trigger scan"
      }
    },
    "/api/f5-unused-objects/": {
      "get": {
        "operationId": "f5_unused_objects_list",
        "parameters": [
          {
            "in": "query",
            "name": "device",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "object_type",
            "schema": {
              "type": "string",
              "enum": [
                "irule",
                "monitor",
                "pool",
                "ssl_cert",
                "ssl_key",
                "ssl_profile"
              ]
            },
            "description": "* `pool` - Pool\n* `monitor` - Monitor\n* `irule` - iRule\n* `ssl_cert` - SSL Certificate\n* `ssl_key` - SSL Key\n* `ssl_profile` - SSL Profile"
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "partition",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "f5-unused-objects"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/F5UnusedObject"
                  }
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List f5 unused objects"
      }
    },
    "/api/f5-unused-objects/{id}/": {
      "get": {
        "operationId": "f5_unused_objects_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this f5 unused object.",
            "required": true
          }
        ],
        "tags": [
          "f5-unused-objects"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/F5UnusedObject"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve f5 unused object"
      }
    },
    "/api/f5-unused-objects/trigger_scan/": {
      "post": {
        "operationId": "f5_unused_objects_trigger_scan_create",
        "description": "Trigger an immediate unused-object scan (all devices or one device).\nSee F5StaleVirtualServerViewSet.trigger_scan for why this runs as an\nin-process background thread rather than a subprocess.",
        "tags": [
          "f5-unused-objects"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/F5UnusedObjectRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/F5UnusedObjectRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/F5UnusedObjectRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/F5UnusedObject"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create trigger scan"
      }
    },
    "/api/gtm-datacenters/": {
      "get": {
        "operationId": "gtm_datacenters_list",
        "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": "partition",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "gtm-datacenters"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedGTMDatacenterList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List gtm datacenters"
      }
    },
    "/api/gtm-datacenters/{id}/": {
      "get": {
        "operationId": "gtm_datacenters_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this gtm datacenter.",
            "required": true
          }
        ],
        "tags": [
          "gtm-datacenters"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GTMDatacenter"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve gtm datacenter"
      }
    },
    "/api/gtm-monitors/": {
      "get": {
        "operationId": "gtm_monitors_list",
        "parameters": [
          {
            "in": "query",
            "name": "device",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "monitor_type",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "required": false,
            "in": "query",
            "description": "A page number within the paginated result set.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "page_size",
            "required": false,
            "in": "query",
            "description": "Number of results to return per page.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "partition",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "gtm-monitors"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedGTMMonitorList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List gtm monitors"
      }
    },
    "/api/gtm-monitors/{id}/": {
      "get": {
        "operationId": "gtm_monitors_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this gtm monitor.",
            "required": true
          }
        ],
        "tags": [
          "gtm-monitors"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GTMMonitor"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve gtm monitor"
      }
    },
    "/api/gtm-pools/": {
      "get": {
        "operationId": "gtm_pools_list",
        "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": "partition",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "record_type",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "gtm-pools"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedGTMPoolList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List gtm pools"
      }
    },
    "/api/gtm-pools/{id}/": {
      "get": {
        "operationId": "gtm_pools_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this gtm pool.",
            "required": true
          }
        ],
        "tags": [
          "gtm-pools"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GTMPool"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve gtm pool"
      }
    },
    "/api/gtm-servers/": {
      "get": {
        "operationId": "gtm_servers_list",
        "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": "partition",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "gtm-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedGTMServerList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List gtm servers"
      }
    },
    "/api/gtm-servers/{id}/": {
      "get": {
        "operationId": "gtm_servers_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this gtm server.",
            "required": true
          }
        ],
        "tags": [
          "gtm-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GTMServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve gtm server"
      }
    },
    "/api/gtm-wideips/": {
      "get": {
        "operationId": "gtm_wideips_list",
        "parameters": [
          {
            "in": "query",
            "name": "device",
            "schema": {
              "type": "integer"
            }
          },
          {
            "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": "record_type",
            "schema": {
              "type": "string",
              "enum": [
                "a",
                "aaaa",
                "cname",
                "mx",
                "naptr",
                "srv"
              ]
            },
            "description": "* `a` - A\n* `aaaa` - AAAA\n* `cname` - CNAME\n* `mx` - MX\n* `naptr` - NAPTR\n* `srv` - SRV"
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "gtm-wideips"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedGTMWideIPListList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List gtm wideips"
      }
    },
    "/api/gtm-wideips/{id}/": {
      "get": {
        "operationId": "gtm_wideips_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this gtm wide ip.",
            "required": true
          }
        ],
        "tags": [
          "gtm-wideips"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GTMWideIPDetail"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve gtm wideip"
      }
    },
    "/api/gtm-wideips/{id}/f5-raw/": {
      "get": {
        "operationId": "gtm_wideips_f5_raw_retrieve",
        "description": "Fetch the raw F5 API response for this WideIP to diagnose pool linkage.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this gtm wide ip.",
            "required": true
          }
        ],
        "tags": [
          "gtm-wideips"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GTMWideIPList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "F5 raw: gtm wideip"
      }
    },
    "/api/gtm-wideips/{id}/toggle/": {
      "post": {
        "operationId": "gtm_wideips_toggle_create",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this gtm wide ip.",
            "required": true
          }
        ],
        "tags": [
          "gtm-wideips"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GTMWideIPListRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/GTMWideIPListRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/GTMWideIPListRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GTMWideIPList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Toggle: gtm wideip"
      }
    },
    "/api/iapp-virtual-servers/": {
      "get": {
        "operationId": "iapp_virtual_servers_list",
        "description": "Virtual servers currently associated with an F5 iApp (Application\nService) \u2014 surfaced on the F5 Clean-up > Detach iApps tab so they can\nbe detached before independent management/decommission is attempted,\nsince F5 blocks direct edits to iApp-owned objects by default (Strict\nUpdates, AskF5 K51033596).",
        "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": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "iapp-virtual-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/IAppVirtualServer"
                  }
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List iapp virtual servers"
      }
    },
    "/api/iapp-virtual-servers/{id}/": {
      "get": {
        "operationId": "iapp_virtual_servers_retrieve",
        "description": "Virtual servers currently associated with an F5 iApp (Application\nService) \u2014 surfaced on the F5 Clean-up > Detach iApps tab so they can\nbe detached before independent management/decommission is attempted,\nsince F5 blocks direct edits to iApp-owned objects by default (Strict\nUpdates, AskF5 K51033596).",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this virtual server.",
            "required": true
          }
        ],
        "tags": [
          "iapp-virtual-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IAppVirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve iapp virtual server"
      }
    },
    "/api/iapp-virtual-servers/detach/": {
      "post": {
        "operationId": "iapp_virtual_servers_detach_create",
        "description": "Detaches the selected virtual servers from their iApp:\ndisables Strict Updates on the owning Application Service (once\nper service, not once per VS), then clears the VS's own\nappService reference. Never touches the Application Service\nrecord itself or any other object the iApp created \u2014 see\nF5Client.set_iapp_strict_updates / detach_from_iapp for the\nsourcing behind this two-step, non-destructive sequence.",
        "tags": [
          "iapp-virtual-servers"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IAppVirtualServerRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/IAppVirtualServerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/IAppVirtualServerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IAppVirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create detach"
      }
    },
    "/api/irules/": {
      "get": {
        "operationId": "irules_list",
        "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": "partition",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "irules"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedIRuleList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List irules"
      }
    },
    "/api/irules/{id}/": {
      "get": {
        "operationId": "irules_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this i rule.",
            "required": true
          }
        ],
        "tags": [
          "irules"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IRule"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve irule"
      }
    },
    "/api/monitors/": {
      "get": {
        "operationId": "monitors_list",
        "parameters": [
          {
            "in": "query",
            "name": "device",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "monitor_type",
            "schema": {
              "type": "string",
              "enum": [
                "external",
                "gateway-icmp",
                "http",
                "https",
                "icmp",
                "other",
                "tcp",
                "tcp-half-open",
                "udp"
              ]
            },
            "description": "* `http` - HTTP\n* `https` - HTTPS\n* `tcp` - TCP\n* `tcp-half-open` - TCP Half-Open\n* `icmp` - ICMP\n* `gateway-icmp` - Gateway ICMP\n* `udp` - UDP\n* `external` - External\n* `other` - Other"
          },
          {
            "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": "partition",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "monitors"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedMonitorListList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List monitors"
      }
    },
    "/api/monitors/{id}/": {
      "get": {
        "operationId": "monitors_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this monitor.",
            "required": true
          }
        ],
        "tags": [
          "monitors"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MonitorList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve monitor"
      }
    },
    "/api/nodes/": {
      "get": {
        "operationId": "nodes_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": "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": "partition",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string",
              "enum": [
                "disabled",
                "down",
                "unknown",
                "up"
              ]
            },
            "description": "* `up` - Up\n* `down` - Down\n* `unknown` - Unknown\n* `disabled` - Disabled"
          }
        ],
        "tags": [
          "nodes"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedNodeList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List nodes"
      }
    },
    "/api/nodes/{id}/": {
      "get": {
        "operationId": "nodes_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 node.",
            "required": true
          }
        ],
        "tags": [
          "nodes"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Node"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve node"
      }
    },
    "/api/pool-members/": {
      "get": {
        "operationId": "pool_members_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": "pool",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string",
              "enum": [
                "disabled",
                "down",
                "forced_offline",
                "unknown",
                "up"
              ]
            },
            "description": "* `up` - Up\n* `down` - Down\n* `unknown` - Unknown\n* `disabled` - Disabled\n* `forced_offline` - Forced Offline"
          }
        ],
        "tags": [
          "pool-members"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedPoolMemberList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List pool members"
      },
      "post": {
        "operationId": "pool_members_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": [
          "pool-members"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PoolMemberRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PoolMemberRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PoolMemberRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PoolMember"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create pool member"
      }
    },
    "/api/pool-members/{id}/": {
      "get": {
        "operationId": "pool_members_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 pool member.",
            "required": true
          }
        ],
        "tags": [
          "pool-members"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PoolMember"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve pool member"
      },
      "put": {
        "operationId": "pool_members_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 pool member.",
            "required": true
          }
        ],
        "tags": [
          "pool-members"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PoolMemberRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PoolMemberRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PoolMemberRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PoolMember"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update pool member"
      },
      "patch": {
        "operationId": "pool_members_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 pool member.",
            "required": true
          }
        ],
        "tags": [
          "pool-members"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPoolMemberRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPoolMemberRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPoolMemberRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PoolMember"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update pool member"
      },
      "delete": {
        "operationId": "pool_members_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 pool member.",
            "required": true
          }
        ],
        "tags": [
          "pool-members"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete pool member"
      }
    },
    "/api/pool-members/{id}/stats_history/": {
      "get": {
        "operationId": "pool_members_stats_history_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 pool member.",
            "required": true
          }
        ],
        "tags": [
          "pool-members"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PoolMember"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Stats history: pool member"
      }
    },
    "/api/pool-members/{id}/toggle/": {
      "post": {
        "operationId": "pool_members_toggle_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 pool member.",
            "required": true
          }
        ],
        "tags": [
          "pool-members"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PoolMemberRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PoolMemberRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PoolMemberRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PoolMember"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Toggle: pool member"
      }
    },
    "/api/pools/": {
      "get": {
        "operationId": "pools_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"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "virtual_servers",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer"
              }
            },
            "explode": true,
            "style": "form"
          }
        ],
        "tags": [
          "pools"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedPoolList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List pools"
      },
      "post": {
        "operationId": "pools_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": [
          "pools"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PoolRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PoolRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PoolRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Pool"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create pool"
      }
    },
    "/api/pools/{id}/": {
      "get": {
        "operationId": "pools_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 pool.",
            "required": true
          }
        ],
        "tags": [
          "pools"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Pool"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve pool"
      },
      "put": {
        "operationId": "pools_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 pool.",
            "required": true
          }
        ],
        "tags": [
          "pools"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PoolRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PoolRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PoolRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Pool"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update pool"
      },
      "patch": {
        "operationId": "pools_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 pool.",
            "required": true
          }
        ],
        "tags": [
          "pools"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPoolRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPoolRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPoolRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Pool"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update pool"
      },
      "delete": {
        "operationId": "pools_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 pool.",
            "required": true
          }
        ],
        "tags": [
          "pools"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete pool"
      }
    },
    "/api/pools/{id}/references/": {
      "get": {
        "operationId": "pools_references_retrieve",
        "description": "On-demand: which iRules and LTM Policies reference this pool by\nname in their own TCL/JSON config. Not a stored relation \u2014 re-derives\nthe same extraction logic apps.devices.f5_import uses to build the\nPool.virtual_servers M2M, scoped down to just this pool.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this pool.",
            "required": true
          }
        ],
        "tags": [
          "pools"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Pool"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "References: pool"
      }
    },
    "/api/virtual-servers/": {
      "get": {
        "operationId": "virtual_servers_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": "application",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "device",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "device__vendor",
            "schema": {
              "type": "string",
              "enum": [
                "a10",
                "akamai",
                "alteon",
                "arista_router",
                "arista_switch",
                "aruba_cx",
                "avi",
                "aws_alb",
                "aws_cloud_wan",
                "aws_cloudfront",
                "aws_direct_connect",
                "aws_elb",
                "aws_fw_manager",
                "aws_global_accel",
                "aws_gwlb",
                "aws_inet_gw",
                "aws_nacl",
                "aws_nat_gw",
                "aws_net_firewall",
                "aws_nlb",
                "aws_privatelink",
                "aws_route53",
                "aws_route_table",
                "aws_sg",
                "aws_shield",
                "aws_transit_gw",
                "aws_vpc",
                "aws_vpc_peering",
                "aws_vpn_gw",
                "aws_waf",
                "azure_alb",
                "azure_bastion",
                "azure_cdn",
                "azure_ddos",
                "azure_dns",
                "azure_expressroute",
                "azure_firewall",
                "azure_front_door",
                "azure_lb",
                "azure_nat_gw",
                "azure_nsg",
                "azure_priv_link",
                "azure_route_svr",
                "azure_route_tbl",
                "azure_traffic_mgr",
                "azure_vnet",
                "azure_vnet_peer",
                "azure_vpn_gw",
                "azure_vwan",
                "azure_waf",
                "barracuda_fw",
                "barracuda_waf",
                "bluecat",
                "checkpoint_gw",
                "checkpoint_sms",
                "cisco_aci_leaf",
                "cisco_aci_spine",
                "cisco_apic",
                "cisco_asa",
                "cisco_ftd",
                "cisco_iosxr",
                "cisco_nxos",
                "cisco_router",
                "cisco_switch",
                "cloudflare",
                "efficientip",
                "f5_bigip",
                "f5_xc",
                "f5_xc_waf",
                "f5os",
                "forcepoint",
                "fortigate",
                "fortimanager",
                "gcp_cloud_armor",
                "gcp_cloud_cdn",
                "gcp_cloud_dns",
                "gcp_cloud_ids",
                "gcp_cloud_nat",
                "gcp_cloud_router",
                "gcp_cloud_vpn",
                "gcp_firewall",
                "gcp_fw_policy",
                "gcp_interconnect",
                "gcp_lb_ext",
                "gcp_lb_int",
                "gcp_lb_network",
                "gcp_ncc",
                "gcp_psc",
                "gcp_vpc",
                "gcp_vpc_peering",
                "imperva",
                "infoblox",
                "juniper_router",
                "juniper_srx",
                "juniper_switch",
                "kemp",
                "keysight",
                "meraki_mx",
                "netscaler",
                "nginx",
                "nsx_edge",
                "nsx_firewall",
                "nsx_manager",
                "nsx_transport",
                "opnsense",
                "paloalto_fw",
                "pcap_scp_server",
                "pcap_tap",
                "pfsense",
                "radware_cloud",
                "sonicwall",
                "sophos_xg",
                "viprion",
                "watchguard",
                "zscaler"
              ]
            },
            "description": "* `f5_bigip` - F5 BIG-IP\n* `f5os` - F5OS (rSeries / VELOS)\n* `viprion` - F5 VIPRION Chassis\n* `netscaler` - Citrix NetScaler / ADC\n* `kemp` - Kemp LoadMaster\n* `a10` - A10 Networks Thunder\n* `alteon` - Radware Alteon\n* `nginx` - F5 NGINX Plus (ADC)\n* `azure_alb` - Azure Application Gateway / ALB\n* `azure_lb` - Azure Load Balancer (Standard)\n* `aws_alb` - AWS Application Load Balancer\n* `f5_xc` - F5 Distributed Cloud (XC)\n* `nsx_firewall` - VMware NSX Firewall\n* `fortimanager` - Fortinet FortiManager\n* `checkpoint_sms` - Check Point SmartCenter / SMS\n* `cisco_asa` - Cisco ASA Firewall\n* `cisco_ftd` - Cisco Firepower / FTD\n* `fortigate` - Fortinet FortiGate\n* `paloalto_fw` - Palo Alto Firewall (direct)\n* `checkpoint_gw` - Check Point Gateway\n* `sonicwall` - SonicWall Firewall\n* `watchguard` - WatchGuard Firebox\n* `barracuda_fw` - Barracuda CloudGen Firewall\n* `sophos_xg` - Sophos XG / XGS Firewall\n* `juniper_srx` - Juniper SRX Firewall\n* `pfsense` - pfSense Firewall\n* `opnsense` - OPNsense Firewall\n* `meraki_mx` - Cisco Meraki MX\n* `forcepoint` - Forcepoint NGFW\n* `cisco_router` - Cisco Router (IOS/IOS-XE)\n* `cisco_iosxr` - Cisco Router (IOS-XR)\n* `juniper_router` - Juniper Router (MX Series)\n* `arista_router` - Arista Router (EOS)\n* `cisco_switch` - Cisco Switch (Catalyst / IOS-XE)\n* `cisco_nxos` - Cisco Nexus Switch (NX-OS)\n* `juniper_switch` - Juniper Switch (EX / QFX)\n* `arista_switch` - Arista Switch (EOS)\n* `aruba_cx` - HPE Aruba Switch (AOS-CX)\n* `cisco_apic` - Cisco APIC Controller\n* `cisco_aci_spine` - Cisco ACI Spine Switch\n* `cisco_aci_leaf` - Cisco ACI Leaf Switch\n* `nsx_edge` - VMware NSX-T Edge Node\n* `nsx_transport` - VMware NSX-T Transport Node\n* `avi` - VMware NSX ALB / AVI Controller\n* `nsx_manager` - VMware NSX-T Manager\n* `infoblox` - Infoblox NIOS\n* `bluecat` - BlueCat Address Manager\n* `efficientip` - EfficientIP SOLIDserver\n* `zscaler` - Zscaler ZIA / ZPA\n* `cloudflare` - Cloudflare WAF / CDN\n* `imperva` - Imperva WAF / DDoS / CDN\n* `akamai` - Akamai Edge / WAF / CDN\n* `f5_xc_waf` - F5 Distributed Cloud (XC) WAF\n* `barracuda_waf` - Barracuda WAF\n* `radware_cloud` - Radware Cloud WAF (Cloud WAAP)\n* `azure_front_door` - Azure Front Door (WAF / CDN)\n* `aws_nlb` - AWS Network Load Balancer\n* `aws_gwlb` - AWS Gateway Load Balancer\n* `aws_elb` - AWS Classic Load Balancer (ELB)\n* `aws_global_accel` - AWS Global Accelerator\n* `aws_net_firewall` - AWS Network Firewall\n* `aws_sg` - AWS Security Group\n* `aws_nacl` - AWS Network ACL\n* `aws_waf` - AWS WAF\n* `aws_shield` - AWS Shield (DDoS)\n* `aws_fw_manager` - AWS Firewall Manager\n* `aws_vpc` - AWS VPC\n* `aws_transit_gw` - AWS Transit Gateway\n* `aws_vpn_gw` - AWS Site-to-Site VPN\n* `aws_direct_connect` - AWS Direct Connect\n* `aws_nat_gw` - AWS NAT Gateway\n* `aws_inet_gw` - AWS Internet Gateway\n* `aws_route_table` - AWS Route Table\n* `aws_vpc_peering` - AWS VPC Peering\n* `aws_privatelink` - AWS PrivateLink / VPC Endpoint\n* `aws_cloud_wan` - AWS Cloud WAN\n* `aws_route53` - AWS Route 53 (DNS)\n* `aws_cloudfront` - AWS CloudFront (CDN)\n* `azure_traffic_mgr` - Azure Traffic Manager\n* `azure_firewall` - Azure Firewall\n* `azure_nsg` - Azure Network Security Group\n* `azure_waf` - Azure WAF\n* `azure_ddos` - Azure DDoS Protection\n* `azure_vnet` - Azure Virtual Network (VNet)\n* `azure_vnet_peer` - Azure VNet Peering\n* `azure_vpn_gw` - Azure VPN Gateway\n* `azure_expressroute` - Azure ExpressRoute\n* `azure_route_tbl` - Azure Route Table (UDR)\n* `azure_nat_gw` - Azure NAT Gateway\n* `azure_vwan` - Azure Virtual WAN\n* `azure_priv_link` - Azure Private Link / Endpoint\n* `azure_bastion` - Azure Bastion\n* `azure_route_svr` - Azure Route Server\n* `azure_dns` - Azure DNS\n* `azure_cdn` - Azure CDN\n* `gcp_lb_ext` - GCP External Load Balancer\n* `gcp_lb_int` - GCP Internal Load Balancer\n* `gcp_lb_network` - GCP Network (Passthrough) LB\n* `gcp_cloud_armor` - GCP Cloud Armor (WAF)\n* `gcp_firewall` - GCP VPC Firewall Rules\n* `gcp_fw_policy` - GCP Hierarchical Firewall Policy\n* `gcp_cloud_ids` - GCP Cloud IDS\n* `gcp_vpc` - GCP VPC Network\n* `gcp_cloud_router` - GCP Cloud Router\n* `gcp_cloud_vpn` - GCP Cloud VPN\n* `gcp_interconnect` - GCP Cloud Interconnect\n* `gcp_cloud_nat` - GCP Cloud NAT\n* `gcp_vpc_peering` - GCP VPC Peering\n* `gcp_ncc` - GCP Network Connectivity Center\n* `gcp_psc` - GCP Private Service Connect\n* `gcp_cloud_dns` - GCP Cloud DNS\n* `gcp_cloud_cdn` - GCP Cloud CDN\n* `pcap_scp_server` - PCAP SCP / SFTP Server\n* `pcap_tap` - PCAP Network Tap\n* `keysight` - Keysight Technologies (Ixia)"
          },
          {
            "in": "query",
            "name": "device__vendor__in",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Multiple values may be separated by commas.",
            "explode": false,
            "style": "form"
          },
          {
            "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": "partition",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string",
              "enum": [
                "available",
                "disabled",
                "offline",
                "unknown"
              ]
            },
            "description": "* `available` - Available\n* `offline` - Offline\n* `unknown` - Unknown\n* `disabled` - Disabled"
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedVirtualServerListList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List virtual servers"
      },
      "post": {
        "operationId": "virtual_servers_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": [
          "virtual-servers"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create virtual server"
      }
    },
    "/api/virtual-servers/{id}/": {
      "get": {
        "operationId": "virtual_servers_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 virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve virtual server"
      },
      "put": {
        "operationId": "virtual_servers_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 virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update virtual server"
      },
      "patch": {
        "operationId": "virtual_servers_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 virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedVirtualServerRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedVirtualServerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedVirtualServerRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update virtual server"
      },
      "delete": {
        "operationId": "virtual_servers_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 virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete virtual server"
      }
    },
    "/api/virtual-servers/{id}/analyze_capture/": {
      "post": {
        "operationId": "virtual_servers_analyze_capture_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 virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Analyze capture: virtual server"
      }
    },
    "/api/virtual-servers/{id}/capture/": {
      "post": {
        "operationId": "virtual_servers_capture_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 virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Capture: virtual server"
      }
    },
    "/api/virtual-servers/{id}/confirm_waf_link/": {
      "post": {
        "operationId": "virtual_servers_confirm_waf_link_create",
        "description": "Human confirms a candidate WafLink. This records the match in\nVersus's own DB (the WafLink row itself) \u2014 it does NOT touch the\nlive F5 device's virtual server config. Use push_waf_link for that,\nas a separate explicit step.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Confirm waf link: virtual server"
      }
    },
    "/api/virtual-servers/{id}/discover_fqdn/": {
      "post": {
        "operationId": "virtual_servers_discover_fqdn_create",
        "description": "Single-VS reverse-DNS (PTR) lookup \u2014 same logic as\nDeviceViewSet.discover_vs_fqdns, scoped to just this VS so it can be\ntriggered from the fleet-wide Virtual Servers list without re-running\ndiscovery for every other VS on the same device.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Discover fqdn: virtual server"
      }
    },
    "/api/virtual-servers/{id}/guess_environment/": {
      "post": {
        "operationId": "virtual_servers_guess_environment_create",
        "description": "Infer the Environment from the VS name (e.g. 'app01-prod-vs') and\nassign it. Explicit user action, so it's fine to overwrite.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Guess environment: virtual server"
      }
    },
    "/api/virtual-servers/{id}/live_stats/": {
      "get": {
        "operationId": "virtual_servers_live_stats_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 virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Live stats: virtual server"
      }
    },
    "/api/virtual-servers/{id}/logs/": {
      "get": {
        "operationId": "virtual_servers_logs_retrieve",
        "description": "Return syslog entries relevant to this VS and its pools.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Logs: virtual server"
      }
    },
    "/api/virtual-servers/{id}/pools-with-members/": {
      "get": {
        "operationId": "virtual_servers_pools_with_members_retrieve",
        "description": "All pools and live member stats for this VS \u2014 used by the App Builder pool member editor.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Pools with members: virtual server"
      }
    },
    "/api/virtual-servers/{id}/push_waf_link/": {
      "post": {
        "operationId": "virtual_servers_push_waf_link_create",
        "description": "Explicit, separate step: PATCH the confirmed WAF link's summary\ninto the live F5 virtual server's own description field. Also\nmirrors that text into Versus's local VirtualServer.description\nsince it now matches the device's true state (no clobber risk on\nthe next periodic F5 import, unlike writing there before pushing).",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Push waf link: virtual server"
      }
    },
    "/api/virtual-servers/{id}/reject_waf_link/": {
      "post": {
        "operationId": "virtual_servers_reject_waf_link_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 virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Reject waf link: virtual server"
      }
    },
    "/api/virtual-servers/{id}/siem_events/": {
      "get": {
        "operationId": "virtual_servers_siem_events_retrieve",
        "description": "Return SIEM events matching this VS's VIP and pool member IPs.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Siem events: virtual server"
      }
    },
    "/api/virtual-servers/{id}/stats_history/": {
      "get": {
        "operationId": "virtual_servers_stats_history_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 virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Stats history: virtual server"
      }
    },
    "/api/virtual-servers/{id}/stop_capture/": {
      "post": {
        "operationId": "virtual_servers_stop_capture_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 virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Stop capture: virtual server"
      }
    },
    "/api/virtual-servers/{id}/tmsh_config/": {
      "get": {
        "operationId": "virtual_servers_tmsh_config_retrieve",
        "description": "Generate TMSH stanzas from synced DB data.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Tmsh config: virtual server"
      }
    },
    "/api/virtual-servers/{id}/toggle/": {
      "post": {
        "operationId": "virtual_servers_toggle_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 virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/VirtualServerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Toggle: virtual server"
      }
    },
    "/api/virtual-servers/{id}/waf_candidates/": {
      "get": {
        "operationId": "virtual_servers_waf_candidates_retrieve",
        "description": "Run the DNS/name/NAT-rule heuristic matcher and upsert the\nresults as 'candidate' WafLink rows (never auto-confirmed \u2014 see\nconfirm_waf_link). Existing confirmed/rejected links are left alone.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Waf candidates: virtual server"
      }
    },
    "/api/virtual-servers/{id}/xc_audit_log/": {
      "get": {
        "operationId": "virtual_servers_xc_audit_log_retrieve",
        "description": "Live-fetched config change history for this VS's namespace \u2014\nnot persisted (no audit storage table in this phase), so this hits\nF5XCClient.list_audit_events() on every request. UNVERIFIED\nendpoint \u2014 returns an empty list (not an error) on failure.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Xc audit log: virtual server"
      }
    },
    "/api/virtual-servers/{id}/xc_traffic_stats/": {
      "get": {
        "operationId": "virtual_servers_xc_traffic_stats_retrieve",
        "description": "Historical request-rate/latency/status-code stats for an F5 XC\nload balancer, from apps.applications.stats_collector's periodic\ncollection into XCTrafficStat. Empty until that endpoint is\nconfirmed working against a live tenant \u2014 see f5_xc_client.py.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Xc traffic stats: virtual server"
      }
    },
    "/api/virtual-servers/{id}/xc_violations/": {
      "get": {
        "operationId": "virtual_servers_xc_violations_retrieve",
        "description": "WAF/bot/API violations recorded for an F5 XC load balancer \u2014\npersisted by stats_collector, not live-fetched (unlike xc_audit_log).",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this virtual server.",
            "required": true
          }
        ],
        "tags": [
          "virtual-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Xc violations: virtual server"
      }
    },
    "/api/virtual-servers/expiring_certs/": {
      "get": {
        "operationId": "virtual_servers_expiring_certs_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).",
        "tags": [
          "virtual-servers"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualServer"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List expiring certs"
      }
    },
    "/api/vs-as3/": {
      "get": {
        "operationId": "vs_as3_retrieve",
        "description": "Generate or retrieve AS3 JSON/YAML for a given VS. GET with ?vs=<id>&format=json|yaml",
        "tags": [
          "vs-as3"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List vs as3s"
      }
    },
    "/api/vs-drift/": {
      "get": {
        "operationId": "vs_drift_retrieve",
        "description": "Playbook \u2194 live-config drift for a VS.\n\nGET  ?vs=<id>                     -> { differences: [{field,label,playbook,live}] }\nPOST { virtual_server, fields[] } -> rewrite the playbook so those fields adopt\n                                     the live values, written back via the collector.\nPlaybooks are the desired state; this captures out-of-band GUI/SSH/API changes\nback into the playbook when the user accepts them.",
        "tags": [
          "vs-drift"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List vs drifts"
      },
      "post": {
        "operationId": "vs_drift_create",
        "description": "Playbook \u2194 live-config drift for a VS.\n\nGET  ?vs=<id>                     -> { differences: [{field,label,playbook,live}] }\nPOST { virtual_server, fields[] } -> rewrite the playbook so those fields adopt\n                                     the live values, written back via the collector.\nPlaybooks are the desired state; this captures out-of-band GUI/SSH/API changes\nback into the playbook when the user accepts them.",
        "tags": [
          "vs-drift"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Create vs drift"
      }
    },
    "/api/vs-yml/": {
      "get": {
        "operationId": "vs_yml_retrieve",
        "description": "Generate or retrieve Ansible YML for a given VS. GET with ?vs=<id>",
        "tags": [
          "vs-yml"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List vs ymls"
      }
    }
  },
  "components": {
    "schemas": {
      "PaginatedMonitorListList": {
        "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/MonitorList"
            }
          }
        }
      },
      "GTMWideIPListRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "record_type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RecordType354Enum"
              }
            ],
            "default": "a"
          },
          "pool_lb_mode": {
            "type": "string",
            "maxLength": 50
          },
          "enabled": {
            "type": "boolean"
          },
          "last_synced": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "device": {
            "type": "integer"
          }
        },
        "required": [
          "device",
          "name"
        ]
      },
      "VirtualServer": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "pools": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Pool"
            },
            "readOnly": true
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "device_group_name": {
            "type": "string",
            "readOnly": true
          },
          "client_name": {
            "type": "string",
            "readOnly": true
          },
          "environment_name": {
            "type": "string",
            "readOnly": true
          },
          "tenant_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "name": {
            "type": "string",
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "default": "Common",
            "maxLength": 100
          },
          "destination": {
            "type": "string",
            "maxLength": 200
          },
          "port": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "protocol": {
            "type": "string",
            "maxLength": 20
          },
          "status": {
            "$ref": "#/components/schemas/Status849Enum"
          },
          "enabled": {
            "type": "boolean"
          },
          "description": {
            "type": "string"
          },
          "raw_config": {},
          "canvas_x": {
            "type": "number",
            "format": "double"
          },
          "canvas_y": {
            "type": "number",
            "format": "double"
          },
          "last_synced": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "discovered_fqdn": {
            "type": "string",
            "maxLength": 300
          },
          "discovered_fqdn_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "app_service": {
            "type": "string",
            "maxLength": 300
          },
          "waf_policy_name": {
            "type": "string",
            "maxLength": 300
          },
          "waf_mitigation_mode": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/WafMitigationModeEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              }
            ]
          },
          "application": {
            "type": "integer",
            "nullable": true
          },
          "device": {
            "type": "integer"
          },
          "client": {
            "type": "integer",
            "nullable": true
          },
          "environment": {
            "type": "integer",
            "nullable": true
          }
        },
        "required": [
          "client_name",
          "created_at",
          "destination",
          "device",
          "device_group_name",
          "device_name",
          "environment_name",
          "id",
          "name",
          "pools"
        ]
      },
      "ApplicationRequest": {
        "type": "object",
        "properties": {
          "tenant_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "description": {
            "type": "string"
          },
          "owner": {
            "type": "string",
            "maxLength": 100
          },
          "canvas_layout": {}
        },
        "required": [
          "name"
        ]
      },
      "PatchedPoolMemberRequest": {
        "type": "object",
        "properties": {
          "tenant_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "address": {
            "type": "string",
            "minLength": 1
          },
          "port": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "status": {
            "$ref": "#/components/schemas/PoolMemberStatusEnum"
          },
          "enabled": {
            "type": "boolean"
          },
          "connections": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "bits_in": {
            "type": "integer",
            "maximum": 9223372036854775807,
            "minimum": -9223372036854775808,
            "format": "int64"
          },
          "bits_out": {
            "type": "integer",
            "maximum": 9223372036854775807,
            "minimum": -9223372036854775808,
            "format": "int64"
          },
          "requests": {
            "type": "integer",
            "maximum": 9223372036854775807,
            "minimum": -9223372036854775808,
            "format": "int64"
          },
          "last_updated": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "pool": {
            "type": "integer"
          }
        }
      },
      "PoolMemberRequest": {
        "type": "object",
        "properties": {
          "tenant_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "address": {
            "type": "string",
            "minLength": 1
          },
          "port": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "status": {
            "$ref": "#/components/schemas/PoolMemberStatusEnum"
          },
          "enabled": {
            "type": "boolean"
          },
          "connections": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "bits_in": {
            "type": "integer",
            "maximum": 9223372036854775807,
            "minimum": -9223372036854775808,
            "format": "int64"
          },
          "bits_out": {
            "type": "integer",
            "maximum": 9223372036854775807,
            "minimum": -9223372036854775808,
            "format": "int64"
          },
          "requests": {
            "type": "integer",
            "maximum": 9223372036854775807,
            "minimum": -9223372036854775808,
            "format": "int64"
          },
          "last_updated": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "pool": {
            "type": "integer"
          }
        },
        "required": [
          "address",
          "name",
          "pool",
          "port"
        ]
      },
      "GTMWideIPDetail": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "maxLength": 100
          },
          "record_type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RecordType354Enum"
              }
            ],
            "default": "a"
          },
          "pool_lb_mode": {
            "type": "string",
            "maxLength": 50
          },
          "enabled": {
            "type": "boolean"
          },
          "last_synced": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "raw_config": {},
          "device": {
            "type": "integer"
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "pools": {},
          "pool_count": {
            "type": "string",
            "readOnly": true
          },
          "linkage": {
            "type": "string",
            "readOnly": true
          },
          "pool_details": {
            "type": "string",
            "readOnly": true
          }
        },
        "required": [
          "device",
          "device_name",
          "id",
          "linkage",
          "name",
          "pool_count",
          "pool_details"
        ]
      },
      "PaginatedIRuleList": {
        "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/IRule"
            }
          }
        }
      },
      "Pool": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "members": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PoolMember"
            },
            "readOnly": true
          },
          "monitors_detail": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Monitor"
            },
            "readOnly": true
          },
          "virtual_servers_detail": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PoolVirtualServer"
            },
            "readOnly": true
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "tenant_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "name": {
            "type": "string",
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "default": "Common",
            "maxLength": 100
          },
          "lb_method": {
            "type": "string",
            "maxLength": 100
          },
          "status": {
            "type": "string",
            "maxLength": 20
          },
          "members_available": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "members_total": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "raw_config": {},
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "device": {
            "type": "integer"
          },
          "virtual_servers": {
            "type": "array",
            "items": {
              "type": "integer"
            }
          },
          "monitors": {
            "type": "array",
            "items": {
              "type": "integer"
            }
          }
        },
        "required": [
          "created_at",
          "device",
          "device_name",
          "id",
          "members",
          "monitors_detail",
          "name",
          "virtual_servers_detail"
        ]
      },
      "GTMServer": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "device": {
            "type": "integer"
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "default": "Common",
            "maxLength": 100
          },
          "product": {
            "type": "string",
            "maxLength": 100
          },
          "datacenter": {
            "type": "string",
            "maxLength": 300
          },
          "addresses": {},
          "enabled": {
            "type": "boolean"
          },
          "last_synced": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "device",
          "device_name",
          "id",
          "name"
        ]
      },
      "PoolMember": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "tenant_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "name": {
            "type": "string",
            "maxLength": 300
          },
          "address": {
            "type": "string"
          },
          "port": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "status": {
            "$ref": "#/components/schemas/PoolMemberStatusEnum"
          },
          "enabled": {
            "type": "boolean"
          },
          "connections": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "bits_in": {
            "type": "integer",
            "maximum": 9223372036854775807,
            "minimum": -9223372036854775808,
            "format": "int64"
          },
          "bits_out": {
            "type": "integer",
            "maximum": 9223372036854775807,
            "minimum": -9223372036854775808,
            "format": "int64"
          },
          "requests": {
            "type": "integer",
            "maximum": 9223372036854775807,
            "minimum": -9223372036854775808,
            "format": "int64"
          },
          "last_updated": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "pool": {
            "type": "integer"
          }
        },
        "required": [
          "address",
          "id",
          "name",
          "pool",
          "port"
        ]
      },
      "PatchedAs3TemplateRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "description": {
            "type": "string"
          },
          "template_json": {},
          "version": {
            "type": "string",
            "maxLength": 20
          },
          "created_by": {
            "type": "string",
            "maxLength": 100
          }
        }
      },
      "F5StaleVirtualServerStatusEnum": {
        "enum": [
          "disabled",
          "no_traffic",
          "active"
        ],
        "type": "string",
        "description": "* `disabled` - Disabled\n* `no_traffic` - No Traffic\n* `active` - Active"
      },
      "Status849Enum": {
        "enum": [
          "available",
          "offline",
          "unknown",
          "disabled"
        ],
        "type": "string",
        "description": "* `available` - Available\n* `offline` - Offline\n* `unknown` - Unknown\n* `disabled` - Disabled"
      },
      "PaginatedPoolList": {
        "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/Pool"
            }
          }
        }
      },
      "GTMDatacenter": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "device": {
            "type": "integer"
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "default": "Common",
            "maxLength": 100
          },
          "contact": {
            "type": "string",
            "maxLength": 300
          },
          "location": {
            "type": "string",
            "maxLength": 300
          },
          "enabled": {
            "type": "boolean"
          },
          "last_synced": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "device",
          "device_name",
          "id",
          "name"
        ]
      },
      "F5StaleVirtualServerRequest": {
        "type": "object",
        "properties": {
          "device": {
            "type": "integer"
          },
          "vs_name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          },
          "partition": {
            "type": "string",
            "minLength": 1,
            "default": "Common",
            "maxLength": 200
          },
          "full_path": {
            "type": "string",
            "maxLength": 700
          },
          "destination": {
            "type": "string",
            "maxLength": 200
          },
          "port": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "nullable": true
          },
          "is_enabled": {
            "type": "boolean"
          },
          "availability": {
            "type": "string",
            "maxLength": 50
          },
          "status": {
            "$ref": "#/components/schemas/F5StaleVirtualServerStatusEnum"
          },
          "bits_in": {
            "type": "integer",
            "maximum": 9223372036854775807,
            "minimum": -9223372036854775808,
            "format": "int64"
          },
          "bits_out": {
            "type": "integer",
            "maximum": 9223372036854775807,
            "minimum": -9223372036854775808,
            "format": "int64"
          },
          "cur_conns": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "tot_requests": {
            "type": "integer",
            "maximum": 9223372036854775807,
            "minimum": -9223372036854775808,
            "format": "int64"
          },
          "first_flagged_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "stats_reset_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "last_seen_traffic_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "device",
          "vs_name"
        ]
      },
      "PaginatedGTMMonitorList": {
        "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/GTMMonitor"
            }
          }
        }
      },
      "PaginatedDataGroupList": {
        "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/DataGroup"
            }
          }
        }
      },
      "RecordType354Enum": {
        "enum": [
          "a",
          "aaaa",
          "cname",
          "mx",
          "naptr",
          "srv"
        ],
        "type": "string",
        "description": "* `a` - A\n* `aaaa` - AAAA\n* `cname` - CNAME\n* `mx` - MX\n* `naptr` - NAPTR\n* `srv` - SRV"
      },
      "PaginatedPoolMemberList": {
        "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/PoolMember"
            }
          }
        }
      },
      "BlankEnum": {
        "enum": [
          ""
        ]
      },
      "PaginatedNodeList": {
        "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/Node"
            }
          }
        }
      },
      "F5StaleWideIPRequest": {
        "type": "object",
        "properties": {
          "device": {
            "type": "integer"
          },
          "wideip_name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "record_type": {
            "type": "string",
            "minLength": 1,
            "default": "a",
            "maxLength": 10
          },
          "full_path": {
            "type": "string",
            "maxLength": 500
          },
          "is_enabled": {
            "type": "boolean"
          },
          "pool_count": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "member_count": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "healthy_member_count": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "status": {
            "$ref": "#/components/schemas/F5StaleWideIPStatusEnum"
          },
          "first_flagged_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "status_reset_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "last_seen_healthy_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "device",
          "wideip_name"
        ]
      },
      "PaginatedGTMPoolList": {
        "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/GTMPool"
            }
          }
        }
      },
      "PatchedPoolRequest": {
        "type": "object",
        "properties": {
          "tenant_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "minLength": 1,
            "default": "Common",
            "maxLength": 100
          },
          "lb_method": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "status": {
            "type": "string",
            "minLength": 1,
            "maxLength": 20
          },
          "members_available": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "members_total": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "raw_config": {},
          "device": {
            "type": "integer"
          },
          "virtual_servers": {
            "type": "array",
            "items": {
              "type": "integer"
            }
          },
          "monitors": {
            "type": "array",
            "items": {
              "type": "integer"
            }
          }
        }
      },
      "PoolRequest": {
        "type": "object",
        "properties": {
          "tenant_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "minLength": 1,
            "default": "Common",
            "maxLength": 100
          },
          "lb_method": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "status": {
            "type": "string",
            "minLength": 1,
            "maxLength": 20
          },
          "members_available": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "members_total": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "raw_config": {},
          "device": {
            "type": "integer"
          },
          "virtual_servers": {
            "type": "array",
            "items": {
              "type": "integer"
            }
          },
          "monitors": {
            "type": "array",
            "items": {
              "type": "integer"
            }
          }
        },
        "required": [
          "device",
          "name"
        ]
      },
      "PatchedVirtualServerRequest": {
        "type": "object",
        "properties": {
          "tenant_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "minLength": 1,
            "default": "Common",
            "maxLength": 100
          },
          "destination": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "port": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "protocol": {
            "type": "string",
            "minLength": 1,
            "maxLength": 20
          },
          "status": {
            "$ref": "#/components/schemas/Status849Enum"
          },
          "enabled": {
            "type": "boolean"
          },
          "description": {
            "type": "string"
          },
          "raw_config": {},
          "canvas_x": {
            "type": "number",
            "format": "double"
          },
          "canvas_y": {
            "type": "number",
            "format": "double"
          },
          "last_synced": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "discovered_fqdn": {
            "type": "string",
            "maxLength": 300
          },
          "discovered_fqdn_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "app_service": {
            "type": "string",
            "maxLength": 300
          },
          "waf_policy_name": {
            "type": "string",
            "maxLength": 300
          },
          "waf_mitigation_mode": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/WafMitigationModeEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              }
            ]
          },
          "application": {
            "type": "integer",
            "nullable": true
          },
          "device": {
            "type": "integer"
          },
          "client": {
            "type": "integer",
            "nullable": true
          },
          "environment": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "As3TemplateRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "description": {
            "type": "string"
          },
          "template_json": {},
          "version": {
            "type": "string",
            "maxLength": 20
          },
          "created_by": {
            "type": "string",
            "maxLength": 100
          }
        },
        "required": [
          "name"
        ]
      },
      "DgTypeEnum": {
        "enum": [
          "string",
          "integer",
          "ip"
        ],
        "type": "string",
        "description": "* `string` - String\n* `integer` - Integer\n* `ip` - IP"
      },
      "IAppVirtualServer": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "default": "Common",
            "maxLength": 100
          },
          "destination": {
            "type": "string",
            "maxLength": 200
          },
          "port": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "device": {
            "type": "integer"
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "app_service": {
            "type": "string",
            "maxLength": 300
          },
          "iapp_name": {
            "type": "string",
            "readOnly": true
          },
          "status": {
            "$ref": "#/components/schemas/Status849Enum"
          },
          "enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "destination",
          "device",
          "device_name",
          "iapp_name",
          "id",
          "name"
        ]
      },
      "PoolVirtualServer": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "maxLength": 100
          },
          "destination": {
            "type": "string",
            "maxLength": 200
          },
          "port": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "status": {
            "$ref": "#/components/schemas/Status849Enum"
          }
        },
        "required": [
          "destination",
          "id",
          "name"
        ]
      },
      "GTMPool": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "device": {
            "type": "integer"
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "maxLength": 100
          },
          "record_type": {
            "type": "string",
            "default": "a",
            "maxLength": 10
          },
          "lb_mode": {
            "type": "string",
            "maxLength": 50
          },
          "members": {},
          "member_count": {
            "type": "string",
            "readOnly": true
          },
          "enabled": {
            "type": "boolean"
          },
          "last_synced": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "device",
          "device_name",
          "id",
          "member_count",
          "name"
        ]
      },
      "PaginatedGTMServerList": {
        "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/GTMServer"
            }
          }
        }
      },
      "PaginatedGTMDatacenterList": {
        "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/GTMDatacenter"
            }
          }
        }
      },
      "F5StaleVirtualServer": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "device": {
            "type": "integer"
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "device_ip": {
            "type": "string",
            "readOnly": true
          },
          "vs_name": {
            "type": "string",
            "maxLength": 500
          },
          "partition": {
            "type": "string",
            "default": "Common",
            "maxLength": 200
          },
          "full_path": {
            "type": "string",
            "maxLength": 700
          },
          "destination": {
            "type": "string",
            "maxLength": 200
          },
          "port": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648,
            "nullable": true
          },
          "is_enabled": {
            "type": "boolean"
          },
          "availability": {
            "type": "string",
            "maxLength": 50
          },
          "status": {
            "$ref": "#/components/schemas/F5StaleVirtualServerStatusEnum"
          },
          "bits_in": {
            "type": "integer",
            "maximum": 9223372036854775807,
            "minimum": -9223372036854775808,
            "format": "int64"
          },
          "bits_out": {
            "type": "integer",
            "maximum": 9223372036854775807,
            "minimum": -9223372036854775808,
            "format": "int64"
          },
          "cur_conns": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "tot_requests": {
            "type": "integer",
            "maximum": 9223372036854775807,
            "minimum": -9223372036854775808,
            "format": "int64"
          },
          "first_flagged_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "stats_reset_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "last_seen_traffic_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "scanned_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "days_flagged": {
            "type": "string",
            "readOnly": true
          }
        },
        "required": [
          "days_flagged",
          "device",
          "device_ip",
          "device_name",
          "id",
          "scanned_at",
          "vs_name"
        ]
      },
      "VirtualServerRequest": {
        "type": "object",
        "properties": {
          "tenant_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "minLength": 1,
            "default": "Common",
            "maxLength": 100
          },
          "destination": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "port": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "protocol": {
            "type": "string",
            "minLength": 1,
            "maxLength": 20
          },
          "status": {
            "$ref": "#/components/schemas/Status849Enum"
          },
          "enabled": {
            "type": "boolean"
          },
          "description": {
            "type": "string"
          },
          "raw_config": {},
          "canvas_x": {
            "type": "number",
            "format": "double"
          },
          "canvas_y": {
            "type": "number",
            "format": "double"
          },
          "last_synced": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "discovered_fqdn": {
            "type": "string",
            "maxLength": 300
          },
          "discovered_fqdn_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "app_service": {
            "type": "string",
            "maxLength": 300
          },
          "waf_policy_name": {
            "type": "string",
            "maxLength": 300
          },
          "waf_mitigation_mode": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/WafMitigationModeEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              }
            ]
          },
          "application": {
            "type": "integer",
            "nullable": true
          },
          "device": {
            "type": "integer"
          },
          "client": {
            "type": "integer",
            "nullable": true
          },
          "environment": {
            "type": "integer",
            "nullable": true
          }
        },
        "required": [
          "destination",
          "device",
          "name"
        ]
      },
      "ApplicationDetail": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "virtual_servers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VirtualServer"
            },
            "readOnly": true
          },
          "tenant_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "description": {
            "type": "string"
          },
          "owner": {
            "type": "string",
            "maxLength": 100
          },
          "canvas_layout": {},
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "id",
          "name",
          "updated_at",
          "virtual_servers"
        ]
      },
      "MonitorList": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "referenced_by": {
            "type": "string",
            "readOnly": true
          },
          "is_builtin": {
            "type": "string",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "default": "Common",
            "maxLength": 100
          },
          "monitor_type": {
            "$ref": "#/components/schemas/MonitorTypeEnum"
          },
          "interval": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "timeout": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "send_string": {
            "type": "string"
          },
          "recv_string": {
            "type": "string"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "device": {
            "type": "integer"
          }
        },
        "required": [
          "created_at",
          "device",
          "device_name",
          "id",
          "is_builtin",
          "name",
          "referenced_by"
        ]
      },
      "F5UnusedObjectObjectTypeEnum": {
        "enum": [
          "pool",
          "monitor",
          "irule",
          "ssl_cert",
          "ssl_key",
          "ssl_profile"
        ],
        "type": "string",
        "description": "* `pool` - Pool\n* `monitor` - Monitor\n* `irule` - iRule\n* `ssl_cert` - SSL Certificate\n* `ssl_key` - SSL Key\n* `ssl_profile` - SSL Profile"
      },
      "PoolMemberStatusEnum": {
        "enum": [
          "up",
          "down",
          "unknown",
          "disabled",
          "forced_offline"
        ],
        "type": "string",
        "description": "* `up` - Up\n* `down` - Down\n* `unknown` - Unknown\n* `disabled` - Disabled\n* `forced_offline` - Forced Offline"
      },
      "DataGroup": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "referenced_by": {
            "type": "string",
            "readOnly": true
          },
          "is_builtin": {
            "type": "string",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "default": "Common",
            "maxLength": 100
          },
          "dg_type": {
            "$ref": "#/components/schemas/DgTypeEnum"
          },
          "record_count": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "records": {},
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "device": {
            "type": "integer"
          }
        },
        "required": [
          "created_at",
          "device",
          "device_name",
          "id",
          "is_builtin",
          "name",
          "referenced_by",
          "updated_at"
        ]
      },
      "VirtualServerList": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "default": "Common",
            "maxLength": 100
          },
          "destination": {
            "type": "string",
            "maxLength": 200
          },
          "port": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "protocol": {
            "type": "string",
            "maxLength": 20
          },
          "status": {
            "$ref": "#/components/schemas/Status849Enum"
          },
          "enabled": {
            "type": "boolean"
          },
          "description": {
            "type": "string"
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "device_vendor": {
            "type": "string",
            "readOnly": true
          },
          "device": {
            "type": "integer"
          },
          "client": {
            "type": "integer",
            "nullable": true
          },
          "client_name": {
            "type": "string",
            "readOnly": true
          },
          "environment": {
            "type": "integer",
            "nullable": true
          },
          "environment_name": {
            "type": "string",
            "readOnly": true
          },
          "waf_policy_name": {
            "type": "string",
            "maxLength": 300
          },
          "waf_mitigation_mode": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/WafMitigationModeEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              }
            ]
          },
          "discovered_fqdn": {
            "type": "string",
            "maxLength": 300
          },
          "pool_count": {
            "type": "string",
            "readOnly": true
          },
          "last_synced": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "se_group": {
            "type": "string",
            "readOnly": true
          }
        },
        "required": [
          "client_name",
          "destination",
          "device",
          "device_name",
          "device_vendor",
          "environment_name",
          "id",
          "name",
          "pool_count",
          "se_group"
        ]
      },
      "PatchedApplicationRequest": {
        "type": "object",
        "properties": {
          "tenant_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "description": {
            "type": "string"
          },
          "owner": {
            "type": "string",
            "maxLength": 100
          },
          "canvas_layout": {}
        }
      },
      "F5UnusedObject": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "device": {
            "type": "integer"
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "device_ip": {
            "type": "string",
            "readOnly": true
          },
          "object_type": {
            "$ref": "#/components/schemas/F5UnusedObjectObjectTypeEnum"
          },
          "object_type_label": {
            "type": "string",
            "readOnly": true
          },
          "object_name": {
            "type": "string",
            "maxLength": 500
          },
          "partition": {
            "type": "string",
            "maxLength": 200
          },
          "full_path": {
            "type": "string",
            "maxLength": 700
          },
          "details": {},
          "first_flagged_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "scanned_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "days_flagged": {
            "type": "string",
            "readOnly": true
          }
        },
        "required": [
          "days_flagged",
          "device",
          "device_ip",
          "device_name",
          "full_path",
          "id",
          "object_name",
          "object_type",
          "object_type_label",
          "scanned_at"
        ]
      },
      "PaginatedVirtualServerListList": {
        "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/VirtualServerList"
            }
          }
        }
      },
      "PaginatedApplicationList": {
        "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/Application"
            }
          }
        }
      },
      "PaginatedAs3TemplateList": {
        "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/As3Template"
            }
          }
        }
      },
      "GTMWideIPList": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "maxLength": 100
          },
          "record_type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RecordType354Enum"
              }
            ],
            "default": "a"
          },
          "pool_lb_mode": {
            "type": "string",
            "maxLength": 50
          },
          "enabled": {
            "type": "boolean"
          },
          "last_synced": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "device": {
            "type": "integer"
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "pool_count": {
            "type": "string",
            "readOnly": true
          },
          "vs_count": {
            "type": "string",
            "readOnly": true
          }
        },
        "required": [
          "device",
          "device_name",
          "id",
          "name",
          "pool_count",
          "vs_count"
        ]
      },
      "As3Template": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "description": {
            "type": "string"
          },
          "template_json": {},
          "version": {
            "type": "string",
            "maxLength": 20
          },
          "created_by": {
            "type": "string",
            "maxLength": 100
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "id",
          "name",
          "updated_at"
        ]
      },
      "IRule": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "line_count": {
            "type": "string",
            "readOnly": true
          },
          "referenced_by": {
            "type": "string",
            "readOnly": true
          },
          "is_builtin": {
            "type": "string",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "default": "Common",
            "maxLength": 100
          },
          "definition": {
            "type": "string"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "device": {
            "type": "integer"
          }
        },
        "required": [
          "created_at",
          "device",
          "device_name",
          "id",
          "is_builtin",
          "line_count",
          "name",
          "referenced_by",
          "updated_at"
        ]
      },
      "GTMMonitor": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "device": {
            "type": "integer"
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "default": "Common",
            "maxLength": 100
          },
          "monitor_type": {
            "type": "string",
            "default": "http",
            "maxLength": 30
          },
          "interval": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "timeout": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "send_string": {
            "type": "string"
          },
          "recv_string": {
            "type": "string"
          },
          "last_synced": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "device",
          "device_name",
          "id",
          "name"
        ]
      },
      "IAppVirtualServerRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "minLength": 1,
            "default": "Common",
            "maxLength": 100
          },
          "destination": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "port": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "device": {
            "type": "integer"
          },
          "app_service": {
            "type": "string",
            "maxLength": 300
          },
          "status": {
            "$ref": "#/components/schemas/Status849Enum"
          },
          "enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "destination",
          "device",
          "name"
        ]
      },
      "F5StaleWideIPStatusEnum": {
        "enum": [
          "disabled",
          "no_healthy_members",
          "active"
        ],
        "type": "string",
        "description": "* `disabled` - Disabled\n* `no_healthy_members` - No Healthy Members\n* `active` - Active"
      },
      "Node": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "referenced_by": {
            "type": "string",
            "readOnly": true
          },
          "is_builtin": {
            "type": "string",
            "readOnly": true
          },
          "tenant_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "name": {
            "type": "string",
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "default": "Common",
            "maxLength": 100
          },
          "address": {
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/NodeStatusEnum"
          },
          "enabled": {
            "type": "boolean"
          },
          "ratio": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "description": {
            "type": "string"
          },
          "monitor": {
            "type": "string",
            "maxLength": 200
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "device": {
            "type": "integer"
          }
        },
        "required": [
          "address",
          "created_at",
          "device",
          "device_name",
          "id",
          "is_builtin",
          "name",
          "referenced_by"
        ]
      },
      "F5UnusedObjectRequest": {
        "type": "object",
        "properties": {
          "device": {
            "type": "integer"
          },
          "object_type": {
            "$ref": "#/components/schemas/F5UnusedObjectObjectTypeEnum"
          },
          "object_name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          },
          "partition": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "full_path": {
            "type": "string",
            "maxLength": 700
          },
          "details": {},
          "first_flagged_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "device",
          "full_path",
          "object_name",
          "object_type"
        ]
      },
      "Application": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "virtual_server_count": {
            "type": "string",
            "readOnly": true
          },
          "tenant_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "description": {
            "type": "string"
          },
          "owner": {
            "type": "string",
            "maxLength": 100
          },
          "canvas_layout": {},
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "id",
          "name",
          "updated_at",
          "virtual_server_count"
        ]
      },
      "NodeStatusEnum": {
        "enum": [
          "up",
          "down",
          "unknown",
          "disabled"
        ],
        "type": "string",
        "description": "* `up` - Up\n* `down` - Down\n* `unknown` - Unknown\n* `disabled` - Disabled"
      },
      "PaginatedGTMWideIPListList": {
        "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/GTMWideIPList"
            }
          }
        }
      },
      "Monitor": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "maxLength": 100
          },
          "monitor_type": {
            "$ref": "#/components/schemas/MonitorTypeEnum"
          },
          "interval": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "timeout": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          }
        },
        "required": [
          "id",
          "name"
        ]
      },
      "MonitorTypeEnum": {
        "enum": [
          "http",
          "https",
          "tcp",
          "tcp-half-open",
          "icmp",
          "gateway-icmp",
          "udp",
          "external",
          "other"
        ],
        "type": "string",
        "description": "* `http` - HTTP\n* `https` - HTTPS\n* `tcp` - TCP\n* `tcp-half-open` - TCP Half-Open\n* `icmp` - ICMP\n* `gateway-icmp` - Gateway ICMP\n* `udp` - UDP\n* `external` - External\n* `other` - Other"
      },
      "WafMitigationModeEnum": {
        "enum": [
          "monitoring",
          "blocking"
        ],
        "type": "string",
        "description": "* `monitoring` - Monitoring\n* `blocking` - Blocking"
      },
      "F5StaleWideIP": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "device": {
            "type": "integer"
          },
          "device_name": {
            "type": "string",
            "readOnly": true
          },
          "device_ip": {
            "type": "string",
            "readOnly": true
          },
          "wideip_name": {
            "type": "string",
            "maxLength": 300
          },
          "partition": {
            "type": "string",
            "maxLength": 200
          },
          "record_type": {
            "type": "string",
            "default": "a",
            "maxLength": 10
          },
          "full_path": {
            "type": "string",
            "maxLength": 500
          },
          "is_enabled": {
            "type": "boolean"
          },
          "pool_count": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "member_count": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "healthy_member_count": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "status": {
            "$ref": "#/components/schemas/F5StaleWideIPStatusEnum"
          },
          "first_flagged_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "status_reset_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "last_seen_healthy_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "scanned_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "days_flagged": {
            "type": "string",
            "readOnly": true
          }
        },
        "required": [
          "days_flagged",
          "device",
          "device_ip",
          "device_name",
          "id",
          "scanned_at",
          "wideip_name"
        ]
      }
    }
  }
}