{
  "openapi": "3.0.3",
  "info": {
    "title": "Service Desk API",
    "version": "1.0.0",
    "description": "Versus Service Desk \u2014 incidents, changes, problems, requests, the service catalog, and CMDB import."
  },
  "servers": [
    {
      "url": "https://versus-demo.com"
    }
  ],
  "paths": {
    "/api/catalog-actions/": {
      "get": {
        "operationId": "catalog_actions_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": [
          "catalog-actions"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedCatalogActionList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List catalog actions"
      },
      "post": {
        "operationId": "catalog_actions_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": [
          "catalog-actions"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CatalogActionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CatalogActionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CatalogActionRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogAction"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create catalog action"
      }
    },
    "/api/catalog-actions/{id}/": {
      "get": {
        "operationId": "catalog_actions_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this catalog action.",
            "required": true
          }
        ],
        "tags": [
          "catalog-actions"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogAction"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve catalog action"
      },
      "put": {
        "operationId": "catalog_actions_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this catalog action.",
            "required": true
          }
        ],
        "tags": [
          "catalog-actions"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CatalogActionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CatalogActionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CatalogActionRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogAction"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update catalog action"
      },
      "patch": {
        "operationId": "catalog_actions_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this catalog action.",
            "required": true
          }
        ],
        "tags": [
          "catalog-actions"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCatalogActionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCatalogActionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCatalogActionRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogAction"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update catalog action"
      },
      "delete": {
        "operationId": "catalog_actions_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this catalog action.",
            "required": true
          }
        ],
        "tags": [
          "catalog-actions"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete catalog action"
      }
    },
    "/api/catalog-actions/{id}/execute/": {
      "post": {
        "operationId": "catalog_actions_execute_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this catalog action.",
            "required": true
          }
        ],
        "tags": [
          "catalog-actions"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CatalogActionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CatalogActionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CatalogActionRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogAction"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Execute: catalog action"
      }
    },
    "/api/catalog/request-types/": {
      "get": {
        "operationId": "catalog_request_types_retrieve",
        "tags": [
          "catalog"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List request types"
      }
    },
    "/api/catalog/request-types/{key}/": {
      "get": {
        "operationId": "catalog_request_types_retrieve_2",
        "parameters": [
          {
            "in": "path",
            "name": "key",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "catalog"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Retrieve request type"
      }
    },
    "/api/cmdb-import-jobs/": {
      "get": {
        "operationId": "cmdb_import_jobs_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": [
          "cmdb-import-jobs"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedCmdbImportJobList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List cmdb import jobs"
      }
    },
    "/api/cmdb-import-jobs/{id}/": {
      "get": {
        "operationId": "cmdb_import_jobs_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this cmdb import job.",
            "required": true
          }
        ],
        "tags": [
          "cmdb-import-jobs"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CmdbImportJob"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve cmdb import job"
      }
    },
    "/api/cmdb-import-jobs/{id}/commit/": {
      "post": {
        "operationId": "cmdb_import_jobs_commit_create",
        "description": "Apply the reviewed decisions: create/merge ManagedDevice rows for\nCIs marked import/merge, leave skipped ones untouched. Also chains\nmatched_pool_member -> Pool -> VirtualServer to auto-assign VS App\nOwner from the CI's CMDB company/support-group, when the VS doesn't\nalready have one \u2014 the server CI is the one ServiceNow record that\ncarries a real business-owner signal, and it's only reachable this\nway since PoolMember has no direct FK to VirtualServer.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this cmdb import job.",
            "required": true
          }
        ],
        "tags": [
          "cmdb-import-jobs"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CmdbImportJobRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CmdbImportJobRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CmdbImportJobRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CmdbImportJob"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Commit: cmdb import job"
      }
    },
    "/api/imported-cis/": {
      "get": {
        "operationId": "imported_cis_list",
        "parameters": [
          {
            "in": "query",
            "name": "decision",
            "schema": {
              "type": "string",
              "enum": [
                "import",
                "merge",
                "pending",
                "skip"
              ]
            },
            "description": "* `pending` - Pending\n* `import` - Import as new\n* `merge` - Merge into existing\n* `skip` - Skip"
          },
          {
            "in": "query",
            "name": "job",
            "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": [
          "imported-cis"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ImportedCI"
                  }
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List imported cis"
      }
    },
    "/api/imported-cis/{id}/": {
      "get": {
        "operationId": "imported_cis_retrieve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this imported ci.",
            "required": true
          }
        ],
        "tags": [
          "imported-cis"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportedCI"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve imported ci"
      }
    },
    "/api/imported-cis/{id}/set_decision/": {
      "post": {
        "operationId": "imported_cis_set_decision_create",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this imported ci.",
            "required": true
          }
        ],
        "tags": [
          "imported-cis"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImportedCIRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ImportedCIRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ImportedCIRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportedCI"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Set decision: imported ci"
      }
    },
    "/api/imported-cis/bulk_decision/": {
      "post": {
        "operationId": "imported_cis_bulk_decision_create",
        "tags": [
          "imported-cis"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImportedCIRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ImportedCIRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ImportedCIRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportedCI"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create bulk decision"
      }
    },
    "/api/itsm/approval-rules/": {
      "get": {
        "operationId": "itsm_approval_rules_list",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "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": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedApprovalRuleList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List approval rules"
      },
      "post": {
        "operationId": "itsm_approval_rules_create",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApprovalRuleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ApprovalRuleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ApprovalRuleRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApprovalRule"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create approval rule"
      }
    },
    "/api/itsm/approval-rules/{id}/": {
      "get": {
        "operationId": "itsm_approval_rules_retrieve",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this approval rule.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApprovalRule"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve approval rule"
      },
      "put": {
        "operationId": "itsm_approval_rules_update",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this approval rule.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApprovalRuleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ApprovalRuleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ApprovalRuleRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApprovalRule"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update approval rule"
      },
      "patch": {
        "operationId": "itsm_approval_rules_partial_update",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this approval rule.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedApprovalRuleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedApprovalRuleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedApprovalRuleRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApprovalRule"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update approval rule"
      },
      "delete": {
        "operationId": "itsm_approval_rules_destroy",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this approval rule.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete approval rule"
      }
    },
    "/api/itsm/approval-rules/preview/": {
      "get": {
        "operationId": "itsm_approval_rules_preview_retrieve",
        "description": "Which rule would apply to a change with this change_type and\nassignment_group, ignoring risk (not knowable before Assess) \u2014\nlets the creation form show likely approvers before submitting.\nThe rule actually used at Assess time may differ once risk is\nfactored in; this is a preview, not a commitment.",
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApprovalRule"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List previews"
      }
    },
    "/api/itsm/assignment-groups/": {
      "get": {
        "operationId": "itsm_assignment_groups_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": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedAssignmentGroupList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List assignment groups"
      },
      "post": {
        "operationId": "itsm_assignment_groups_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": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssignmentGroupRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AssignmentGroupRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AssignmentGroupRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssignmentGroup"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create assignment group"
      }
    },
    "/api/itsm/assignment-groups/{id}/": {
      "get": {
        "operationId": "itsm_assignment_groups_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 assignment group.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssignmentGroup"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve assignment group"
      },
      "put": {
        "operationId": "itsm_assignment_groups_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 assignment group.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssignmentGroupRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AssignmentGroupRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AssignmentGroupRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssignmentGroup"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update assignment group"
      },
      "patch": {
        "operationId": "itsm_assignment_groups_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 assignment group.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAssignmentGroupRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAssignmentGroupRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAssignmentGroupRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssignmentGroup"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update assignment group"
      },
      "delete": {
        "operationId": "itsm_assignment_groups_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 assignment group.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete assignment group"
      }
    },
    "/api/itsm/assignment-groups/{id}/members/": {
      "post": {
        "operationId": "itsm_assignment_groups_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).",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this assignment group.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssignmentGroupRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AssignmentGroupRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AssignmentGroupRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssignmentGroup"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Members: assignment group"
      }
    },
    "/api/itsm/assignment-groups/{id}/members/{user_id}/": {
      "delete": {
        "operationId": "itsm_assignment_groups_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 assignment group.",
            "required": true
          },
          {
            "in": "path",
            "name": "user_id",
            "schema": {
              "type": "string",
              "pattern": "^\\d+$"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete member"
      }
    },
    "/api/itsm/assignment-groups/{id}/users/": {
      "get": {
        "operationId": "itsm_assignment_groups_users_retrieve",
        "description": "The users who belong to this assignment group \u2014 feeds the\n\"Assigned to\" dropdown once a group is chosen on a ticket/task\nform, so the assignee list is scoped to the selected group's\nmembers rather than every user in the system.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this assignment group.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssignmentGroup"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Users: assignment group"
      }
    },
    "/api/itsm/audit/": {
      "get": {
        "operationId": "itsm_audit_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": "event_type",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "required": false,
            "in": "query",
            "description": "A page number within the paginated result set.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "page_size",
            "required": false,
            "in": "query",
            "description": "Number of results to return per page.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "ticket",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedItsmAuditEventList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List audits"
      }
    },
    "/api/itsm/audit/{seq}/": {
      "get": {
        "operationId": "itsm_audit_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": "seq",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this itsm audit event.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ItsmAuditEvent"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve audit"
      }
    },
    "/api/itsm/audit/verify/": {
      "get": {
        "operationId": "itsm_audit_verify_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": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ItsmAuditEvent"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List verifys"
      }
    },
    "/api/itsm/blackout-windows/": {
      "get": {
        "operationId": "itsm_blackout_windows_list",
        "description": "Enhancement spec \u00a74 \u2014 blackout/freeze windows. Managing when\nchanges must NOT run is a change_manager privilege, the same trust\nbar as overriding a conflict.",
        "parameters": [
          {
            "in": "query",
            "name": "active",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "kind",
            "schema": {
              "type": "string",
              "enum": [
                "blackout",
                "freeze"
              ]
            },
            "description": "* `blackout` - Blackout\n* `freeze` - Freeze"
          },
          {
            "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": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedBlackoutWindowList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List blackout windows"
      },
      "post": {
        "operationId": "itsm_blackout_windows_create",
        "description": "Enhancement spec \u00a74 \u2014 blackout/freeze windows. Managing when\nchanges must NOT run is a change_manager privilege, the same trust\nbar as overriding a conflict.",
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BlackoutWindowRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/BlackoutWindowRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/BlackoutWindowRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BlackoutWindow"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create blackout window"
      }
    },
    "/api/itsm/blackout-windows/{id}/": {
      "get": {
        "operationId": "itsm_blackout_windows_retrieve",
        "description": "Enhancement spec \u00a74 \u2014 blackout/freeze windows. Managing when\nchanges must NOT run is a change_manager privilege, the same trust\nbar as overriding a conflict.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this blackout window.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BlackoutWindow"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve blackout window"
      },
      "put": {
        "operationId": "itsm_blackout_windows_update",
        "description": "Enhancement spec \u00a74 \u2014 blackout/freeze windows. Managing when\nchanges must NOT run is a change_manager privilege, the same trust\nbar as overriding a conflict.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this blackout window.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BlackoutWindowRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/BlackoutWindowRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/BlackoutWindowRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BlackoutWindow"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update blackout window"
      },
      "patch": {
        "operationId": "itsm_blackout_windows_partial_update",
        "description": "Enhancement spec \u00a74 \u2014 blackout/freeze windows. Managing when\nchanges must NOT run is a change_manager privilege, the same trust\nbar as overriding a conflict.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this blackout window.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedBlackoutWindowRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedBlackoutWindowRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedBlackoutWindowRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BlackoutWindow"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update blackout window"
      },
      "delete": {
        "operationId": "itsm_blackout_windows_destroy",
        "description": "Enhancement spec \u00a74 \u2014 blackout/freeze windows. Managing when\nchanges must NOT run is a change_manager privilege, the same trust\nbar as overriding a conflict.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this blackout window.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete blackout window"
      }
    },
    "/api/itsm/cab/": {
      "get": {
        "operationId": "itsm_cab_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": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedCabMeetingList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List cabs"
      },
      "post": {
        "operationId": "itsm_cab_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": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CabMeetingRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CabMeetingRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CabMeetingRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CabMeeting"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create cab"
      }
    },
    "/api/itsm/cab/{id}/": {
      "get": {
        "operationId": "itsm_cab_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this cab meeting.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CabMeeting"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve cab"
      },
      "put": {
        "operationId": "itsm_cab_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this cab meeting.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CabMeetingRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CabMeetingRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CabMeetingRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CabMeeting"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update cab"
      },
      "patch": {
        "operationId": "itsm_cab_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this cab meeting.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCabMeetingRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCabMeetingRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCabMeetingRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CabMeeting"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update cab"
      },
      "delete": {
        "operationId": "itsm_cab_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this cab meeting.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete cab"
      }
    },
    "/api/itsm/cab/pending-changes/": {
      "get": {
        "operationId": "itsm_cab_pending_changes_retrieve",
        "description": "Recent changes offered as CAB agenda candidates, flagging the ones\nthat require CAB, so scheduling a meeting can pull the right agenda.",
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CabMeeting"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List pending changes"
      }
    },
    "/api/itsm/calendars/": {
      "get": {
        "operationId": "itsm_calendars_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": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedBusinessCalendarList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List calendars"
      },
      "post": {
        "operationId": "itsm_calendars_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": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BusinessCalendarRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/BusinessCalendarRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/BusinessCalendarRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BusinessCalendar"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create calendar"
      }
    },
    "/api/itsm/calendars/{id}/": {
      "get": {
        "operationId": "itsm_calendars_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 business calendar.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BusinessCalendar"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve calendar"
      },
      "put": {
        "operationId": "itsm_calendars_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 business calendar.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BusinessCalendarRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/BusinessCalendarRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/BusinessCalendarRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BusinessCalendar"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update calendar"
      },
      "patch": {
        "operationId": "itsm_calendars_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 business calendar.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedBusinessCalendarRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedBusinessCalendarRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedBusinessCalendarRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BusinessCalendar"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update calendar"
      },
      "delete": {
        "operationId": "itsm_calendars_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 business calendar.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete calendar"
      }
    },
    "/api/itsm/catalog/categories/": {
      "get": {
        "operationId": "itsm_catalog_categories_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": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedCatalogCategoryList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List categorys"
      },
      "post": {
        "operationId": "itsm_catalog_categories_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": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CatalogCategoryRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CatalogCategoryRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CatalogCategoryRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogCategory"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create category"
      }
    },
    "/api/itsm/catalog/categories/{id}/": {
      "get": {
        "operationId": "itsm_catalog_categories_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 catalog category.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogCategory"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve category"
      },
      "put": {
        "operationId": "itsm_catalog_categories_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 catalog category.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CatalogCategoryRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CatalogCategoryRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CatalogCategoryRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogCategory"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update category"
      },
      "patch": {
        "operationId": "itsm_catalog_categories_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 catalog category.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCatalogCategoryRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCatalogCategoryRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCatalogCategoryRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogCategory"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update category"
      },
      "delete": {
        "operationId": "itsm_catalog_categories_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 catalog category.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete category"
      }
    },
    "/api/itsm/catalog/items/": {
      "get": {
        "operationId": "itsm_catalog_items_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": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedCatalogItemList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List items"
      },
      "post": {
        "operationId": "itsm_catalog_items_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": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CatalogItemRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CatalogItemRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CatalogItemRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogItem"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create item"
      }
    },
    "/api/itsm/catalog/items/{id}/": {
      "get": {
        "operationId": "itsm_catalog_items_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this catalog item.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogItem"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve item"
      },
      "put": {
        "operationId": "itsm_catalog_items_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this catalog item.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CatalogItemRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CatalogItemRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CatalogItemRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogItem"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update item"
      },
      "patch": {
        "operationId": "itsm_catalog_items_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this catalog item.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCatalogItemRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCatalogItemRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCatalogItemRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogItem"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update item"
      },
      "delete": {
        "operationId": "itsm_catalog_items_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this catalog item.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete item"
      }
    },
    "/api/itsm/catalog/items/{id}/requests/": {
      "post": {
        "operationId": "itsm_catalog_items_requests_create",
        "description": "Spec \u00a76: turns a submitted App Builder catalog form into a Versus Desk\nrequest. Creates a REQ envelope with one Requested Item (RITM) for this\ncatalog item, and seeds the RITM's fulfillment tasks (SCTASK). The actual\nform submission happens through App Builder's own endpoint (no second form\nengine) \u2014 this consumes the already-created Submission id.\n\n`tasks` (optional list of {short_description, order?, workflow_step_ref?})\noverrides the default single fulfillment task.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this catalog item.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CatalogItemRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CatalogItemRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CatalogItemRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogItem"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Requests: item"
      }
    },
    "/api/itsm/change-gates/": {
      "get": {
        "operationId": "itsm_change_gates_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": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedChangeGateBindingList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List change gates"
      },
      "post": {
        "operationId": "itsm_change_gates_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": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeGateBindingRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ChangeGateBindingRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ChangeGateBindingRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChangeGateBinding"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create change gate"
      }
    },
    "/api/itsm/change-gates/{id}/": {
      "get": {
        "operationId": "itsm_change_gates_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 change gate binding.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChangeGateBinding"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve change gate"
      },
      "put": {
        "operationId": "itsm_change_gates_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 change gate binding.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeGateBindingRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ChangeGateBindingRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ChangeGateBindingRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChangeGateBinding"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update change gate"
      },
      "patch": {
        "operationId": "itsm_change_gates_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 change gate binding.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedChangeGateBindingRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedChangeGateBindingRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedChangeGateBindingRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChangeGateBinding"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update change gate"
      },
      "delete": {
        "operationId": "itsm_change_gates_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 change gate binding.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete change gate"
      }
    },
    "/api/itsm/change-tasks/": {
      "get": {
        "operationId": "itsm_change_tasks_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"
            }
          },
          {
            "in": "query",
            "name": "state",
            "schema": {
              "type": "string",
              "enum": [
                "closed_complete",
                "closed_incomplete",
                "closed_skipped",
                "in_progress",
                "open"
              ]
            },
            "description": "* `open` - Open\n* `in_progress` - In Progress\n* `closed_complete` - Closed Complete\n* `closed_incomplete` - Closed Incomplete\n* `closed_skipped` - Closed Skipped"
          },
          {
            "in": "query",
            "name": "ticket",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedChangeTaskList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List change tasks"
      },
      "post": {
        "operationId": "itsm_change_tasks_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": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeTaskRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ChangeTaskRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ChangeTaskRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChangeTask"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create change task"
      }
    },
    "/api/itsm/change-tasks/{id}/": {
      "get": {
        "operationId": "itsm_change_tasks_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this change task.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChangeTask"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve change task"
      },
      "put": {
        "operationId": "itsm_change_tasks_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this change task.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeTaskRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ChangeTaskRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ChangeTaskRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChangeTask"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update change task"
      },
      "patch": {
        "operationId": "itsm_change_tasks_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this change task.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedChangeTaskRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedChangeTaskRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedChangeTaskRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChangeTask"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update change task"
      },
      "delete": {
        "operationId": "itsm_change_tasks_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this change task.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete change task"
      }
    },
    "/api/itsm/changes/{number}/approvals/{stage}/decision/": {
      "post": {
        "operationId": "itsm_changes_approvals_decision_create",
        "description": "Spec \u00a711: POST /itsm/changes/{number}/approvals/{stage}/decision",
        "parameters": [
          {
            "in": "path",
            "name": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "stage",
            "schema": {
              "type": "string",
              "pattern": "^\\d+$"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Decision: approval"
      }
    },
    "/api/itsm/ci-options/": {
      "get": {
        "operationId": "itsm_ci_options_retrieve",
        "description": "Dropdown options for the \"Configuration Items\" picker on the Versus\nDesk create forms (Change/Incident/Request/Problem). Returns\n``[{id, label, sublabel}]`` for a given ``ci_type``, sourced live from\ninventory \u2014 there is no separate CMDB; the ci_type taxonomy mirrors\n``CiLink.CI_TYPE_CHOICES`` (device / vip / certificate / rule / service).\n\n``GET /api/itsm/ci-options/?ci_type=device&q=<search>&limit=50``\n\nThe returned ``id`` is the inventory row's PK as a string and ``label``\nis its display name \u2014 exactly the shape the create form already writes\ninto ``CiLink.ci_id`` / ``CiLink.ci_label``.",
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List ci options"
      }
    },
    "/api/itsm/companies/": {
      "get": {
        "operationId": "itsm_companies_list",
        "description": "Enhancement spec \u00a71.2 \u2014 MSP-style client scoping for changes.",
        "parameters": [
          {
            "in": "query",
            "name": "kind",
            "schema": {
              "type": "string",
              "enum": [
                "client",
                "self",
                "vendor"
              ]
            },
            "description": "* `self` - Self\n* `client` - Client\n* `vendor` - Vendor"
          },
          {
            "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": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedCompanyList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List companys"
      },
      "post": {
        "operationId": "itsm_companies_create",
        "description": "Enhancement spec \u00a71.2 \u2014 MSP-style client scoping for changes.",
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompanyRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CompanyRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CompanyRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Company"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create company"
      }
    },
    "/api/itsm/companies/{id}/": {
      "get": {
        "operationId": "itsm_companies_retrieve",
        "description": "Enhancement spec \u00a71.2 \u2014 MSP-style client scoping for changes.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this company.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Company"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve company"
      },
      "put": {
        "operationId": "itsm_companies_update",
        "description": "Enhancement spec \u00a71.2 \u2014 MSP-style client scoping for changes.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this company.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompanyRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CompanyRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CompanyRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Company"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update company"
      },
      "patch": {
        "operationId": "itsm_companies_partial_update",
        "description": "Enhancement spec \u00a71.2 \u2014 MSP-style client scoping for changes.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this company.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCompanyRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCompanyRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCompanyRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Company"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update company"
      },
      "delete": {
        "operationId": "itsm_companies_destroy",
        "description": "Enhancement spec \u00a71.2 \u2014 MSP-style client scoping for changes.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this company.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete company"
      }
    },
    "/api/itsm/conflicts/": {
      "get": {
        "operationId": "itsm_conflicts_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": "conflict_type",
            "schema": {
              "type": "string",
              "enum": [
                "blackout_window",
                "ci_overlap",
                "freeze_period",
                "incident_active",
                "maintenance_required",
                "window_overlap"
              ]
            },
            "description": "* `window_overlap` - Window Overlap\n* `ci_overlap` - CI Overlap\n* `blackout_window` - Blackout Window\n* `freeze_period` - Freeze Period\n* `maintenance_required` - Maintenance Required\n* `incident_active` - Incident Active"
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Which field to use when ordering the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "required": false,
            "in": "query",
            "description": "A page number within the paginated result set.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "page_size",
            "required": false,
            "in": "query",
            "description": "Number of results to return per page.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "severity",
            "schema": {
              "type": "string",
              "enum": [
                "blocking",
                "warning"
              ]
            },
            "description": "* `warning` - Warning\n* `blocking` - Blocking"
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string",
              "enum": [
                "open",
                "overridden",
                "resolved"
              ]
            },
            "description": "* `open` - Open\n* `resolved` - Resolved\n* `overridden` - Overridden"
          },
          {
            "in": "query",
            "name": "ticket",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedChangeConflictList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List conflicts"
      }
    },
    "/api/itsm/conflicts/{id}/": {
      "get": {
        "operationId": "itsm_conflicts_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this change conflict.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChangeConflict"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve conflict"
      }
    },
    "/api/itsm/conflicts/{id}/override/": {
      "post": {
        "operationId": "itsm_conflicts_override_create",
        "description": "RBAC-gated conflict override with a required, audited reason\n(spec \u00a74) \u2014 flips the change's conflict_status via a re-run so\nthe header chip stays truthful.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this change conflict.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChangeConflict"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Override: conflict"
      }
    },
    "/api/itsm/csat/{token}/": {
      "patch": {
        "operationId": "itsm_csat_partial_update",
        "description": "Token-based public respond endpoint \u2014 no auth, matched by an\nunguessable token, same convention as this codebase's other\ntokenized public links (cert reveal, etc.).",
        "parameters": [
          {
            "in": "path",
            "name": "token",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "Update csat"
      }
    },
    "/api/itsm/kb/": {
      "get": {
        "operationId": "itsm_kb_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": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedKbArticleList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List kbs"
      },
      "post": {
        "operationId": "itsm_kb_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": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KbArticleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/KbArticleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/KbArticleRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KbArticle"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create kb"
      }
    },
    "/api/itsm/kb/{id}/": {
      "get": {
        "operationId": "itsm_kb_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this kb article.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KbArticle"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve kb"
      },
      "put": {
        "operationId": "itsm_kb_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this kb article.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KbArticleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/KbArticleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/KbArticleRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KbArticle"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update kb"
      },
      "patch": {
        "operationId": "itsm_kb_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this kb article.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedKbArticleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedKbArticleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedKbArticleRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KbArticle"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update kb"
      },
      "delete": {
        "operationId": "itsm_kb_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this kb article.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete kb"
      }
    },
    "/api/itsm/kb/{id}/feedback/": {
      "post": {
        "operationId": "itsm_kb_feedback_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this kb article.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KbArticleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/KbArticleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/KbArticleRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KbArticle"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Feedback: kb"
      }
    },
    "/api/itsm/kb/{id}/publish/": {
      "post": {
        "operationId": "itsm_kb_publish_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this kb article.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KbArticleRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/KbArticleRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/KbArticleRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KbArticle"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Publish: kb"
      }
    },
    "/api/itsm/parity-matrix/": {
      "get": {
        "operationId": "itsm_parity_matrix_retrieve",
        "description": "ServiceNow \u2192 Versus field-parity coverage matrix (parity spec \u00a78) \u2014 the\nRFP artifact. `?fmt=json` (default) returns the full ledger + summary;\n`?fmt=xlsx` or `?fmt=csv` downloads the matrix (XLSX when openpyxl is\ninstalled, else CSV). (`fmt`, not `format` \u2014 the latter is DRF-reserved.)",
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "No response body"
          }
        },
        "summary": "List parity matrixs"
      }
    },
    "/api/itsm/problem-tasks/": {
      "get": {
        "operationId": "itsm_problem_tasks_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"
            }
          },
          {
            "in": "query",
            "name": "state",
            "schema": {
              "type": "string",
              "enum": [
                "closed_complete",
                "closed_incomplete",
                "closed_skipped",
                "in_progress",
                "open"
              ]
            },
            "description": "* `open` - Open\n* `in_progress` - In Progress\n* `closed_complete` - Closed Complete\n* `closed_incomplete` - Closed Incomplete\n* `closed_skipped` - Closed Skipped"
          },
          {
            "in": "query",
            "name": "ticket",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedProblemTaskList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List problem tasks"
      },
      "post": {
        "operationId": "itsm_problem_tasks_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": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProblemTaskRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ProblemTaskRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ProblemTaskRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemTask"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create problem task"
      }
    },
    "/api/itsm/problem-tasks/{id}/": {
      "get": {
        "operationId": "itsm_problem_tasks_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this problem task.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemTask"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve problem task"
      },
      "put": {
        "operationId": "itsm_problem_tasks_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this problem task.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProblemTaskRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ProblemTaskRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ProblemTaskRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemTask"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update problem task"
      },
      "patch": {
        "operationId": "itsm_problem_tasks_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this problem task.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedProblemTaskRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedProblemTaskRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedProblemTaskRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemTask"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update problem task"
      },
      "delete": {
        "operationId": "itsm_problem_tasks_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this problem task.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete problem task"
      }
    },
    "/api/itsm/request-tasks/": {
      "get": {
        "operationId": "itsm_request_tasks_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"
            }
          },
          {
            "in": "query",
            "name": "state",
            "schema": {
              "type": "string",
              "enum": [
                "closed_complete",
                "closed_incomplete",
                "closed_skipped",
                "in_progress",
                "open"
              ]
            },
            "description": "* `open` - Open\n* `in_progress` - In Progress\n* `closed_complete` - Closed Complete\n* `closed_incomplete` - Closed Incomplete\n* `closed_skipped` - Closed Skipped"
          },
          {
            "in": "query",
            "name": "ticket",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedRequestTaskList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List request tasks"
      },
      "post": {
        "operationId": "itsm_request_tasks_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": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RequestTaskRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/RequestTaskRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/RequestTaskRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RequestTask"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create request task"
      }
    },
    "/api/itsm/request-tasks/{id}/": {
      "get": {
        "operationId": "itsm_request_tasks_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this request task.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RequestTask"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve request task"
      },
      "put": {
        "operationId": "itsm_request_tasks_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this request task.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RequestTaskRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/RequestTaskRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/RequestTaskRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RequestTask"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update request task"
      },
      "patch": {
        "operationId": "itsm_request_tasks_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this request task.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedRequestTaskRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedRequestTaskRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedRequestTaskRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RequestTask"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update request task"
      },
      "delete": {
        "operationId": "itsm_request_tasks_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this request task.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete request task"
      }
    },
    "/api/itsm/sla-definitions/": {
      "get": {
        "operationId": "itsm_sla_definitions_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": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedSlaDefinitionList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List sla definitions"
      },
      "post": {
        "operationId": "itsm_sla_definitions_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": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SlaDefinitionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/SlaDefinitionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/SlaDefinitionRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SlaDefinition"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create sla definition"
      }
    },
    "/api/itsm/sla-definitions/{id}/": {
      "get": {
        "operationId": "itsm_sla_definitions_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 sla definition.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SlaDefinition"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve sla definition"
      },
      "put": {
        "operationId": "itsm_sla_definitions_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 sla definition.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SlaDefinitionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/SlaDefinitionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/SlaDefinitionRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SlaDefinition"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update sla definition"
      },
      "patch": {
        "operationId": "itsm_sla_definitions_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 sla definition.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedSlaDefinitionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedSlaDefinitionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedSlaDefinitionRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SlaDefinition"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update sla definition"
      },
      "delete": {
        "operationId": "itsm_sla_definitions_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 sla definition.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete sla definition"
      }
    },
    "/api/itsm/snow-migration/": {
      "get": {
        "operationId": "itsm_snow_migration_list",
        "description": "Read-only view of the SN\u2192Versus import audit / reconciliation report.",
        "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"
            }
          },
          {
            "in": "query",
            "name": "sn_table",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string",
              "enum": [
                "ci_unresolved",
                "error",
                "imported",
                "skipped",
                "state_unmapped"
              ]
            },
            "description": "* `imported` - Imported\n* `ci_unresolved` - CI Unresolved\n* `state_unmapped` - State Unmapped\n* `skipped` - Skipped\n* `error` - Error"
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedSnowMigrationMapList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List snow migrations"
      }
    },
    "/api/itsm/snow-migration/{id}/": {
      "get": {
        "operationId": "itsm_snow_migration_retrieve",
        "description": "Read-only view of the SN\u2192Versus import audit / reconciliation report.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this snow migration map.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SnowMigrationMap"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve snow migration"
      }
    },
    "/api/itsm/standard-templates/": {
      "get": {
        "operationId": "itsm_standard_templates_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": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedStandardChangeTemplateList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List standard templates"
      },
      "post": {
        "operationId": "itsm_standard_templates_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": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StandardChangeTemplateRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/StandardChangeTemplateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/StandardChangeTemplateRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StandardChangeTemplate"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create standard template"
      }
    },
    "/api/itsm/standard-templates/{id}/": {
      "get": {
        "operationId": "itsm_standard_templates_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 standard change template.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StandardChangeTemplate"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve standard template"
      },
      "put": {
        "operationId": "itsm_standard_templates_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 standard change template.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StandardChangeTemplateRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/StandardChangeTemplateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/StandardChangeTemplateRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StandardChangeTemplate"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update standard template"
      },
      "patch": {
        "operationId": "itsm_standard_templates_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 standard change template.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedStandardChangeTemplateRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedStandardChangeTemplateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedStandardChangeTemplateRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StandardChangeTemplate"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update standard template"
      },
      "delete": {
        "operationId": "itsm_standard_templates_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 standard change template.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete standard template"
      }
    },
    "/api/itsm/standard-templates/{id}/approve/": {
      "post": {
        "operationId": "itsm_standard_templates_approve_create",
        "description": "Promoting a normal->standard template requires a distinct\napprover from whoever proposed it (spec \u00a74.2, \u00a714 item 5) \u2014\nenforced directly here (see provider.py's docstring on why this\nisn't literally sharing apps.policy's RecertReview model).",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer"
            },
            "description": "A unique integer value identifying this standard change template.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StandardChangeTemplateRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/StandardChangeTemplateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/StandardChangeTemplateRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StandardChangeTemplate"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Approve: standard template"
      }
    },
    "/api/itsm/tickets/": {
      "get": {
        "operationId": "itsm_tickets_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": "assignee",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "assignment_group",
            "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": "priority",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "A search term.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "state",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "ticket_type",
            "schema": {
              "type": "string",
              "enum": [
                "change",
                "incident",
                "problem",
                "request",
                "requested_item"
              ]
            },
            "description": "* `incident` - Incident\n* `problem` - Problem\n* `change` - Change\n* `request` - Request\n* `requested_item` - Requested Item"
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedTicketListList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List tickets"
      },
      "post": {
        "operationId": "itsm_tickets_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": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create ticket"
      }
    },
    "/api/itsm/tickets/{number}/": {
      "get": {
        "operationId": "itsm_tickets_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketDetail"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve ticket"
      },
      "patch": {
        "operationId": "itsm_tickets_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedTicketListRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedTicketListRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedTicketListRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update ticket"
      }
    },
    "/api/itsm/tickets/{number}/alert-check/": {
      "post": {
        "operationId": "itsm_tickets_alert_check_create",
        "description": "The reference form's \"Alert Check\" button \u2014 on-demand conflict\nre-run (spec \u00a74).",
        "parameters": [
          {
            "in": "path",
            "name": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Alert check: ticket"
      }
    },
    "/api/itsm/tickets/{number}/approval-email-log/": {
      "get": {
        "operationId": "itsm_tickets_approval_email_log_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Approval email log: ticket"
      }
    },
    "/api/itsm/tickets/{number}/change-ext/": {
      "patch": {
        "operationId": "itsm_tickets_change_ext_partial_update",
        "description": "Edits the change's extension fields (header + Planning/Client\nTesting/Schedule/Closure tabs). Honors the `locked` flag set\nduring Implementing \u2014 only a change manager can edit through it\n(spec \u00a71.1's Locked semantics).",
        "parameters": [
          {
            "in": "path",
            "name": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedTicketListRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedTicketListRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedTicketListRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Change ext: ticket"
      }
    },
    "/api/itsm/tickets/{number}/ci-links/": {
      "post": {
        "operationId": "itsm_tickets_ci_links_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Ci links: ticket"
      }
    },
    "/api/itsm/tickets/{number}/ci-links-rich/": {
      "get": {
        "operationId": "itsm_tickets_ci_links_rich_retrieve",
        "description": "Affected CIs with inventory columns (spec \u00a76.1) \u2014 CiLink joined\nto the real inventory rows for class/environment/status. No new\nCMDB: this is a projection, computed at read time.",
        "parameters": [
          {
            "in": "path",
            "name": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Ci links rich: ticket"
      }
    },
    "/api/itsm/tickets/{number}/comments/": {
      "post": {
        "operationId": "itsm_tickets_comments_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Comments: ticket"
      }
    },
    "/api/itsm/tickets/{number}/conflicts/": {
      "get": {
        "operationId": "itsm_tickets_conflicts_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Conflicts: ticket"
      }
    },
    "/api/itsm/tickets/{number}/impacted-cis/": {
      "get": {
        "operationId": "itsm_tickets_impacted_cis_retrieve",
        "description": "Topology-computed Impacted Services/CIs (spec \u00a76.2) \u2014 cached;\npass ?refresh=1 after changing Affected CIs.",
        "parameters": [
          {
            "in": "path",
            "name": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Impacted cis: ticket"
      }
    },
    "/api/itsm/tickets/{number}/kb-links/": {
      "get": {
        "operationId": "itsm_tickets_kb_links_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Kb links: ticket"
      },
      "post": {
        "operationId": "itsm_tickets_kb_links_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Kb links: ticket"
      }
    },
    "/api/itsm/tickets/{number}/links/": {
      "post": {
        "operationId": "itsm_tickets_links_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Links: ticket"
      }
    },
    "/api/itsm/tickets/{number}/outages/": {
      "get": {
        "operationId": "itsm_tickets_outages_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Outages: ticket"
      },
      "post": {
        "operationId": "itsm_tickets_outages_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Outages: ticket"
      }
    },
    "/api/itsm/tickets/{number}/override-risk/": {
      "post": {
        "operationId": "itsm_tickets_override_risk_create",
        "description": "Spec \u00a74.3: risk is machine-computed but human-overridable, with\na required, audited reason \u2014 never a silent overwrite. Only\nmeaningful once a risk has actually been computed (post-Assess).",
        "parameters": [
          {
            "in": "path",
            "name": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Override risk: ticket"
      }
    },
    "/api/itsm/tickets/{number}/predictions/": {
      "get": {
        "operationId": "itsm_tickets_predictions_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Predictions: ticket"
      }
    },
    "/api/itsm/tickets/{number}/sla/": {
      "get": {
        "operationId": "itsm_tickets_sla_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Sla: ticket"
      }
    },
    "/api/itsm/tickets/{number}/special-notes/": {
      "get": {
        "operationId": "itsm_tickets_special_notes_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Special notes: ticket"
      },
      "post": {
        "operationId": "itsm_tickets_special_notes_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Special notes: ticket"
      }
    },
    "/api/itsm/tickets/{number}/time-entries/": {
      "get": {
        "operationId": "itsm_tickets_time_entries_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Time entries: ticket"
      },
      "post": {
        "operationId": "itsm_tickets_time_entries_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Time entries: ticket"
      }
    },
    "/api/itsm/tickets/{number}/transition/": {
      "post": {
        "operationId": "itsm_tickets_transition_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": "number",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Transition: ticket"
      }
    },
    "/api/itsm/tickets/change-plan-from-workflow/": {
      "get": {
        "operationId": "itsm_tickets_change_plan_from_workflow_retrieve",
        "description": "Derive a Change's opening Basic-Info + Planning fields from a workflow\n(name/description + its section structure). The New Change wizard calls\nthis when a workflow is selected to pre-fill short description,\ndescription, the plan textareas, and the justification. Nothing is\npersisted here \u2014 it returns a suggestion the wizard applies.",
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List change plan from workflows"
      }
    },
    "/api/itsm/tickets/suggest-change/": {
      "post": {
        "operationId": "itsm_tickets_suggest_change_create",
        "description": "AI-draft a full change (description, plans, tasks, type, risk) from a\nshort description + description. Returns a structured suggestion the New\nChange wizard applies to its fields; nothing is persisted here.",
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TicketListRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create suggest change"
      }
    },
    "/api/itsm/watchers/": {
      "get": {
        "operationId": "itsm_watchers_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"
            }
          },
          {
            "in": "query",
            "name": "ticket",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "user",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedTicketWatcherList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List watchers"
      },
      "post": {
        "operationId": "itsm_watchers_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": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TicketWatcherRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/TicketWatcherRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TicketWatcherRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketWatcher"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create watcher"
      }
    },
    "/api/itsm/watchers/{id}/": {
      "get": {
        "operationId": "itsm_watchers_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this ticket watcher.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketWatcher"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve watcher"
      },
      "put": {
        "operationId": "itsm_watchers_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this ticket watcher.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TicketWatcherRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/TicketWatcherRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TicketWatcherRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketWatcher"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update watcher"
      },
      "patch": {
        "operationId": "itsm_watchers_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this ticket watcher.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedTicketWatcherRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedTicketWatcherRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedTicketWatcherRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TicketWatcher"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update watcher"
      },
      "delete": {
        "operationId": "itsm_watchers_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this ticket watcher.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete watcher"
      }
    },
    "/api/itsm/windows/": {
      "get": {
        "operationId": "itsm_windows_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": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedMaintenanceWindowList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List windows"
      },
      "post": {
        "operationId": "itsm_windows_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": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MaintenanceWindowRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/MaintenanceWindowRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/MaintenanceWindowRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaintenanceWindow"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create window"
      }
    },
    "/api/itsm/windows/{id}/": {
      "get": {
        "operationId": "itsm_windows_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 maintenance window.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaintenanceWindow"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve window"
      },
      "put": {
        "operationId": "itsm_windows_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 maintenance window.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MaintenanceWindowRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/MaintenanceWindowRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/MaintenanceWindowRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaintenanceWindow"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update window"
      },
      "patch": {
        "operationId": "itsm_windows_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 maintenance window.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedMaintenanceWindowRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedMaintenanceWindowRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedMaintenanceWindowRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaintenanceWindow"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update window"
      },
      "delete": {
        "operationId": "itsm_windows_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 maintenance window.",
            "required": true
          }
        ],
        "tags": [
          "itsm"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete window"
      }
    },
    "/api/submissions/": {
      "get": {
        "operationId": "submissions_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": [
          "submissions"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedSubmissionList"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List submissions"
      },
      "post": {
        "operationId": "submissions_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": [
          "submissions"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubmissionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/SubmissionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/SubmissionRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Submission"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create submission"
      }
    },
    "/api/submissions/{id}/": {
      "get": {
        "operationId": "submissions_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this submission.",
            "required": true
          }
        ],
        "tags": [
          "submissions"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Submission"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Retrieve submission"
      },
      "put": {
        "operationId": "submissions_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this submission.",
            "required": true
          }
        ],
        "tags": [
          "submissions"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubmissionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/SubmissionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/SubmissionRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Submission"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update submission"
      },
      "patch": {
        "operationId": "submissions_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this submission.",
            "required": true
          }
        ],
        "tags": [
          "submissions"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedSubmissionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedSubmissionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedSubmissionRequest"
              }
            }
          }
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Submission"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update submission"
      },
      "delete": {
        "operationId": "submissions_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this submission.",
            "required": true
          }
        ],
        "tags": [
          "submissions"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          }
        },
        "summary": "Delete submission"
      }
    },
    "/api/submissions/{id}/advance/": {
      "post": {
        "operationId": "submissions_advance_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this submission.",
            "required": true
          }
        ],
        "tags": [
          "submissions"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubmissionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/SubmissionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/SubmissionRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Submission"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Advance: submission"
      }
    },
    "/api/submissions/{id}/cancel/": {
      "post": {
        "operationId": "submissions_cancel_create",
        "description": "Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated\n(VS-SPEC-TENANT-IDENTITY-001 \u00a714). Use as the FIRST base:\n\n    class DeviceViewSet(TenantScopedModelViewSet, viewsets.ModelViewSet):\n        queryset = Device.objects.select_related(...)\n        ...\n\nUnlike the strict TenantScopedViewSet pilot, this **degrades gracefully**:\nit is INERT unless the tenant_scoped alias is configured\n(TENANT_SCOPED_DATABASE_URL) AND the request carries a tenant_id claim.\nWhen inert it behaves exactly like a plain ModelViewSet \u2014 so the rollout\nlands additively and isolation switches on only once the non-superuser\nPostgres role exists (mirrors tenant_subdomain.py's \"inert unless\nconfigured\" contract). When active: reads route through the RLS-enforcing\nconnection and tenant_id is stamped server-side (never client input).",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this submission.",
            "required": true
          }
        ],
        "tags": [
          "submissions"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubmissionRequest"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/SubmissionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/SubmissionRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Submission"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Cancel: submission"
      }
    },
    "/api/submissions/{id}/events/": {
      "get": {
        "operationId": "submissions_events_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this submission.",
            "required": true
          }
        ],
        "tags": [
          "submissions"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Submission"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Events: submission"
      }
    },
    "/api/submissions/{id}/tracker/": {
      "get": {
        "operationId": "submissions_tracker_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": "string",
              "format": "uuid"
            },
            "description": "A UUID string identifying this submission.",
            "required": true
          }
        ],
        "tags": [
          "submissions"
        ],
        "security": [
          {
            "jwtAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Submission"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Tracker: submission"
      }
    }
  },
  "components": {
    "schemas": {
      "ConflictStatusEnum": {
        "enum": [
          "not_run",
          "no_conflict",
          "conflict",
          "conflict_overridden"
        ],
        "type": "string",
        "description": "* `not_run` - Not Run\n* `no_conflict` - No Conflict\n* `conflict` - Conflict\n* `conflict_overridden` - Conflict Overridden"
      },
      "PaginatedItsmAuditEventList": {
        "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/ItsmAuditEvent"
            }
          }
        }
      },
      "CatalogItemRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "description": {
            "type": "string"
          },
          "icon": {
            "type": "string",
            "maxLength": 50
          },
          "category": {
            "type": "integer",
            "nullable": true
          },
          "app_builder_form_id": {
            "type": "string",
            "format": "uuid"
          },
          "workflow_binding_id": {
            "type": "string",
            "format": "uuid"
          },
          "visibility": {},
          "request_sla_hint": {
            "type": "integer",
            "nullable": true
          },
          "change_gate_mode": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10
          },
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "app_builder_form_id",
          "name",
          "workflow_binding_id"
        ]
      },
      "CiTypeEnum": {
        "enum": [
          "device",
          "vip",
          "certificate",
          "rule",
          "service"
        ],
        "type": "string",
        "description": "* `device` - Device\n* `vip` - Virtual Server\n* `certificate` - Certificate\n* `rule` - Rule\n* `service` - Application"
      },
      "ExecutionModeEnum": {
        "enum": [
          "direct",
          "via_workflow"
        ],
        "type": "string",
        "description": "* `direct` - Direct\n* `via_workflow` - Via Workflow"
      },
      "ProblemTaskRequest": {
        "type": "object",
        "properties": {
          "ticket": {
            "type": "string",
            "format": "uuid"
          },
          "order": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "short_description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "description": {
            "type": "string"
          },
          "task_type": {
            "$ref": "#/components/schemas/ProblemTaskTaskTypeEnum"
          },
          "assignment_group": {
            "type": "integer",
            "nullable": true
          },
          "assignee": {
            "type": "integer",
            "nullable": true
          },
          "state": {
            "$ref": "#/components/schemas/StateBe8Enum"
          }
        },
        "required": [
          "short_description",
          "ticket"
        ]
      },
      "CompanyRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "kind": {
            "$ref": "#/components/schemas/CompanyKindEnum"
          },
          "external_ref": {},
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "name"
        ]
      },
      "PaginatedSubmissionList": {
        "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/Submission"
            }
          }
        }
      },
      "StateBe8Enum": {
        "enum": [
          "open",
          "in_progress",
          "closed_complete",
          "closed_incomplete",
          "closed_skipped"
        ],
        "type": "string",
        "description": "* `open` - Open\n* `in_progress` - In Progress\n* `closed_complete` - Closed Complete\n* `closed_incomplete` - Closed Incomplete\n* `closed_skipped` - Closed Skipped"
      },
      "BusinessCalendarRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "timezone": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "hours": {},
          "holidays": {}
        },
        "required": [
          "name",
          "timezone"
        ]
      },
      "RequesterKindEnum": {
        "enum": [
          "user",
          "portal"
        ],
        "type": "string",
        "description": "* `user` - User\n* `portal` - Portal"
      },
      "SlaDefinitionRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "applies_to": {},
          "precedence": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "metric": {
            "$ref": "#/components/schemas/MetricEnum"
          },
          "target_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "calendar": {
            "type": "integer",
            "nullable": true
          },
          "pause_states": {},
          "warning_threshold_pct": {
            "type": "integer",
            "maximum": 32767,
            "minimum": -32768
          },
          "rearm_on_reopen": {
            "type": "boolean"
          },
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "metric",
          "name",
          "target_minutes"
        ]
      },
      "TicketTransition": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "from_state": {
            "type": "string",
            "maxLength": 30
          },
          "to_state": {
            "type": "string",
            "maxLength": 30
          },
          "event": {
            "type": "string",
            "maxLength": 50
          },
          "actor_username": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "actor_kind": {
            "type": "string",
            "maxLength": 20
          },
          "note": {
            "type": "string"
          },
          "at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "actor_username",
          "at",
          "event",
          "from_state",
          "id",
          "to_state"
        ]
      },
      "PaginatedMaintenanceWindowList": {
        "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/MaintenanceWindow"
            }
          }
        }
      },
      "PaginatedBlackoutWindowList": {
        "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/BlackoutWindow"
            }
          }
        }
      },
      "BlackoutWindowRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "recurrence_rrule": {
            "type": "string",
            "maxLength": 500
          },
          "start_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "end_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "duration_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "ci_scope": {},
          "kind": {
            "$ref": "#/components/schemas/BlackoutWindowKindEnum"
          },
          "timezone": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "active": {
            "type": "boolean"
          }
        },
        "required": [
          "name"
        ]
      },
      "PatchedBusinessCalendarRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "timezone": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "hours": {},
          "holidays": {}
        }
      },
      "ChangeTask": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "ticket": {
            "type": "string",
            "format": "uuid"
          },
          "number": {
            "type": "string",
            "readOnly": true,
            "nullable": true
          },
          "order": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "short_description": {
            "type": "string",
            "maxLength": 300
          },
          "description": {
            "type": "string"
          },
          "task_type": {
            "$ref": "#/components/schemas/ChangeTaskTaskTypeEnum"
          },
          "assignment_group": {
            "type": "integer",
            "nullable": true
          },
          "assignment_group_name": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "assignee": {
            "type": "integer",
            "nullable": true
          },
          "assignee_username": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "workflow_step_ref": {
            "type": "string",
            "maxLength": 100
          },
          "state": {
            "$ref": "#/components/schemas/StateBe8Enum"
          },
          "planned_start": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "planned_end": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "closed_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "closed_by": {
            "type": "integer",
            "readOnly": true,
            "nullable": true
          },
          "closed_by_username": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "assignee_username",
          "assignment_group_name",
          "closed_at",
          "closed_by",
          "closed_by_username",
          "created_at",
          "id",
          "number",
          "short_description",
          "ticket"
        ]
      },
      "PatchedSlaDefinitionRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "applies_to": {},
          "precedence": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "metric": {
            "$ref": "#/components/schemas/MetricEnum"
          },
          "target_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "calendar": {
            "type": "integer",
            "nullable": true
          },
          "pause_states": {},
          "warning_threshold_pct": {
            "type": "integer",
            "maximum": 32767,
            "minimum": -32768
          },
          "rearm_on_reopen": {
            "type": "boolean"
          },
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "PaginatedSlaDefinitionList": {
        "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/SlaDefinition"
            }
          }
        }
      },
      "PaginatedProblemTaskList": {
        "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/ProblemTask"
            }
          }
        }
      },
      "StandardChangeTemplateRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "scope_matcher": {},
          "implementation_plan": {
            "type": "string"
          },
          "rollback_plan": {
            "type": "string"
          },
          "version": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "proposed_by": {
            "type": "integer",
            "nullable": true
          },
          "approved_by": {
            "type": "integer",
            "nullable": true
          },
          "approved_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "name"
        ]
      },
      "AiFailurePredictionEnum": {
        "enum": [
          "low",
          "medium",
          "high",
          "unknown"
        ],
        "type": "string",
        "description": "* `low` - Low\n* `medium` - Medium\n* `high` - High\n* `unknown` - Unknown"
      },
      "ImportedCIRequest": {
        "type": "object",
        "properties": {
          "decision": {
            "$ref": "#/components/schemas/DecisionEnum"
          }
        }
      },
      "OriginEnum": {
        "enum": [
          "manual",
          "observe_alert",
          "workflow",
          "catalog",
          "email",
          "api",
          "sync"
        ],
        "type": "string",
        "description": "* `manual` - Manual\n* `observe_alert` - Observe Alert\n* `workflow` - Workflow\n* `catalog` - Catalog\n* `email` - Email\n* `api` - API\n* `sync` - Sync"
      },
      "RiskEnum": {
        "enum": [
          "low",
          "medium",
          "high"
        ],
        "type": "string",
        "description": "* `low` - Low\n* `medium` - Medium\n* `high` - High"
      },
      "PaginatedCatalogItemList": {
        "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/CatalogItem"
            }
          }
        }
      },
      "Company": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "kind": {
            "$ref": "#/components/schemas/CompanyKindEnum"
          },
          "external_ref": {},
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "id",
          "name"
        ]
      },
      "DecisionEnum": {
        "enum": [
          "pending",
          "import",
          "merge",
          "skip"
        ],
        "type": "string",
        "description": "* `pending` - Pending\n* `import` - Import as new\n* `merge` - Merge into existing\n* `skip` - Skip"
      },
      "PaginatedSnowMigrationMapList": {
        "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/SnowMigrationMap"
            }
          }
        }
      },
      "CatalogActionRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "key": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "pattern": "^[-a-zA-Z0-9_]+$"
          },
          "description": {
            "type": "string"
          },
          "operation_ref": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "fixed_params": {},
          "user_params_schema": {},
          "execution_mode": {
            "$ref": "#/components/schemas/ExecutionModeEnum"
          },
          "workflow_ref": {
            "type": "string",
            "maxLength": 300
          },
          "approval_chain": {},
          "audit_category": {
            "type": "string",
            "maxLength": 100
          },
          "is_reversible": {
            "type": "boolean"
          },
          "tags": {},
          "enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "key",
          "name",
          "operation_ref"
        ]
      },
      "CabMeetingRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "scheduled_at": {
            "type": "string",
            "format": "date-time"
          },
          "duration_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "recurrence": {
            "$ref": "#/components/schemas/RecurrenceEnum"
          },
          "location": {
            "type": "string",
            "maxLength": 300
          },
          "status": {
            "$ref": "#/components/schemas/CabMeetingStatusEnum"
          },
          "attendees": {},
          "agenda_notes": {
            "type": "string"
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "minutes": {
            "type": "string"
          },
          "dispositions": {},
          "chaired_by": {
            "type": "integer",
            "nullable": true
          }
        },
        "required": [
          "scheduled_at"
        ]
      },
      "TicketWatcher": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "ticket": {
            "type": "string",
            "format": "uuid"
          },
          "user": {
            "type": "integer"
          },
          "username": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "id",
          "ticket",
          "user",
          "username"
        ]
      },
      "CabMeeting": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "scheduled_at": {
            "type": "string",
            "format": "date-time"
          },
          "duration_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "recurrence": {
            "$ref": "#/components/schemas/RecurrenceEnum"
          },
          "location": {
            "type": "string",
            "maxLength": 300
          },
          "status": {
            "$ref": "#/components/schemas/CabMeetingStatusEnum"
          },
          "attendees": {},
          "agenda_notes": {
            "type": "string"
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "change_numbers": {
            "type": "string",
            "readOnly": true
          },
          "minutes": {
            "type": "string"
          },
          "dispositions": {},
          "chaired_by": {
            "type": "integer",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "change_numbers",
          "created_at",
          "id",
          "scheduled_at"
        ]
      },
      "ProblemTaskTaskTypeEnum": {
        "enum": [
          "investigation",
          "root_cause",
          "fix",
          "test",
          "review"
        ],
        "type": "string",
        "description": "* `investigation` - Investigation\n* `root_cause` - Root Cause\n* `fix` - Fix\n* `test` - Test\n* `review` - Review"
      },
      "IncidentExt": {
        "type": "object",
        "properties": {
          "reopen_count": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "major_incident": {
            "type": "boolean"
          },
          "problem": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "caused_by_change": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "resolution_code": {
            "type": "string",
            "maxLength": 100
          },
          "resolution_notes": {
            "type": "string"
          }
        }
      },
      "PaginatedKbArticleList": {
        "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/KbArticle"
            }
          }
        }
      },
      "ConflictTypeEnum": {
        "enum": [
          "window_overlap",
          "ci_overlap",
          "blackout_window",
          "freeze_period",
          "maintenance_required",
          "incident_active"
        ],
        "type": "string",
        "description": "* `window_overlap` - Window Overlap\n* `ci_overlap` - CI Overlap\n* `blackout_window` - Blackout Window\n* `freeze_period` - Freeze Period\n* `maintenance_required` - Maintenance Required\n* `incident_active` - Incident Active"
      },
      "ApprovalRule": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "matcher": {},
          "precedence": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "stages": {},
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "id",
          "name"
        ]
      },
      "CatalogCategory": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "sort": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          }
        },
        "required": [
          "id",
          "name"
        ]
      },
      "PaginatedCatalogActionList": {
        "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/CatalogAction"
            }
          }
        }
      },
      "PatchedSubmissionRequest": {
        "type": "object",
        "properties": {
          "form_definition": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "app_version": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "request_type_key": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "resolved_inputs": {},
          "binding_snapshot": {},
          "notes": {
            "type": "string"
          },
          "submitted_by": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "ItsmAuditEvent": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "seq": {
            "type": "integer",
            "readOnly": true
          },
          "event_type": {
            "type": "string",
            "maxLength": 50
          },
          "ticket": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "ticket_number": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "actor": {
            "type": "string",
            "maxLength": 200
          },
          "payload": {},
          "prev_hash": {
            "type": "string",
            "maxLength": 64
          },
          "hash": {
            "type": "string",
            "maxLength": 64
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "event_type",
          "hash",
          "id",
          "seq",
          "ticket_number"
        ]
      },
      "AssignmentGroup": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "routing_policy": {
            "$ref": "#/components/schemas/RoutingPolicyEnum"
          },
          "escalation_group": {
            "type": "integer",
            "nullable": true
          },
          "rr_cursor": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "members": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GroupMember"
            },
            "readOnly": true
          },
          "member_count": {
            "type": "integer",
            "readOnly": true
          }
        },
        "required": [
          "id",
          "member_count",
          "members",
          "name"
        ]
      },
      "ChangeTaskTaskTypeEnum": {
        "enum": [
          "planning",
          "implementation",
          "testing",
          "review",
          "manual",
          "automated"
        ],
        "type": "string",
        "description": "* `planning` - Planning\n* `implementation` - Implementation\n* `testing` - Testing\n* `review` - Review\n* `manual` - Manual\n* `automated` - Automated"
      },
      "ChangeConflict": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "ticket": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "conflict_type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ConflictTypeEnum"
              }
            ],
            "readOnly": true
          },
          "conflicting_ref": {
            "readOnly": true
          },
          "severity": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ChangeConflictSeverityEnum"
              }
            ],
            "readOnly": true
          },
          "detail": {
            "type": "string",
            "readOnly": true
          },
          "status": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ChangeConflictStatusEnum"
              }
            ],
            "readOnly": true
          },
          "overridden_by": {
            "type": "integer",
            "readOnly": true,
            "nullable": true
          },
          "overridden_by_username": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "override_reason": {
            "type": "string",
            "readOnly": true
          },
          "overridden_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "detected_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "conflict_type",
          "conflicting_ref",
          "detail",
          "detected_at",
          "id",
          "overridden_at",
          "overridden_by",
          "overridden_by_username",
          "override_reason",
          "severity",
          "status",
          "ticket"
        ]
      },
      "AssignmentGroupRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "routing_policy": {
            "$ref": "#/components/schemas/RoutingPolicyEnum"
          },
          "escalation_group": {
            "type": "integer",
            "nullable": true
          },
          "rr_cursor": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          }
        },
        "required": [
          "name"
        ]
      },
      "VisibilityEnum": {
        "enum": [
          "public",
          "internal"
        ],
        "type": "string",
        "description": "* `public` - Public\n* `internal` - Internal"
      },
      "SubmissionRequest": {
        "type": "object",
        "properties": {
          "form_definition": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "app_version": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "request_type_key": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "resolved_inputs": {},
          "binding_snapshot": {},
          "notes": {
            "type": "string"
          },
          "submitted_by": {
            "type": "integer",
            "nullable": true
          }
        },
        "required": [
          "request_type_key"
        ]
      },
      "PatchedCatalogCategoryRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "sort": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          }
        }
      },
      "PirOutcomeEnum": {
        "enum": [
          "successful",
          "successful_with_issues",
          "failed",
          "rolled_back"
        ],
        "type": "string",
        "description": "* `successful` - Successful\n* `successful_with_issues` - Successful with Issues\n* `failed` - Failed\n* `rolled_back` - Rolled Back"
      },
      "MaintenanceWindow": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "recurrence_rrule": {
            "type": "string",
            "maxLength": 500
          },
          "start_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "end_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "duration_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "ci_scope": {},
          "timezone": {
            "type": "string",
            "maxLength": 64
          }
        },
        "required": [
          "id",
          "name"
        ]
      },
      "CiLink": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "ci_type": {
            "$ref": "#/components/schemas/CiTypeEnum"
          },
          "ci_id": {
            "type": "string",
            "maxLength": 64
          },
          "ci_label": {
            "type": "string",
            "maxLength": 255
          }
        },
        "required": [
          "ci_id",
          "ci_type",
          "id"
        ]
      },
      "PatchedProblemTaskRequest": {
        "type": "object",
        "properties": {
          "ticket": {
            "type": "string",
            "format": "uuid"
          },
          "order": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "short_description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "description": {
            "type": "string"
          },
          "task_type": {
            "$ref": "#/components/schemas/ProblemTaskTaskTypeEnum"
          },
          "assignment_group": {
            "type": "integer",
            "nullable": true
          },
          "assignee": {
            "type": "integer",
            "nullable": true
          },
          "state": {
            "$ref": "#/components/schemas/StateBe8Enum"
          }
        }
      },
      "ProblemExt": {
        "type": "object",
        "properties": {
          "known_error": {
            "type": "boolean"
          },
          "workaround": {
            "type": "string"
          },
          "rca_summary": {
            "type": "string"
          },
          "rca_confirmed_by": {
            "type": "integer",
            "nullable": true
          },
          "throughline_analysis_id": {
            "type": "string",
            "maxLength": 100
          },
          "fix_change": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        }
      },
      "TicketList": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "ticket_type": {
            "$ref": "#/components/schemas/TicketTypeEnum"
          },
          "number": {
            "type": "string",
            "maxLength": 20
          },
          "short_description": {
            "type": "string",
            "maxLength": 500
          },
          "state": {
            "type": "string",
            "maxLength": 30
          },
          "priority": {
            "type": "integer",
            "maximum": 32767,
            "minimum": -32768
          },
          "impact": {
            "type": "integer",
            "maximum": 32767,
            "minimum": -32768
          },
          "urgency": {
            "type": "integer",
            "maximum": 32767,
            "minimum": -32768
          },
          "assignment_group": {
            "type": "integer",
            "nullable": true
          },
          "assignment_group_name": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "assignee": {
            "type": "integer",
            "nullable": true
          },
          "assignee_username": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "requester_kind": {
            "$ref": "#/components/schemas/RequesterKindEnum"
          },
          "opened_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "resolved_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "closed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "origin": {
            "$ref": "#/components/schemas/OriginEnum"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "assignee_username",
          "assignment_group_name",
          "created_at",
          "id",
          "number",
          "opened_at",
          "priority",
          "short_description",
          "state",
          "ticket_type",
          "updated_at"
        ]
      },
      "CatalogAction": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "key": {
            "type": "string",
            "maxLength": 100,
            "pattern": "^[-a-zA-Z0-9_]+$"
          },
          "description": {
            "type": "string"
          },
          "operation_ref": {
            "type": "string",
            "maxLength": 300
          },
          "fixed_params": {},
          "user_params_schema": {},
          "execution_mode": {
            "$ref": "#/components/schemas/ExecutionModeEnum"
          },
          "workflow_ref": {
            "type": "string",
            "maxLength": 300
          },
          "approval_chain": {},
          "audit_category": {
            "type": "string",
            "maxLength": 100
          },
          "is_reversible": {
            "type": "boolean"
          },
          "tags": {},
          "enabled": {
            "type": "boolean"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "id",
          "key",
          "name",
          "operation_ref",
          "updated_at"
        ]
      },
      "BlackoutWindow": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "recurrence_rrule": {
            "type": "string",
            "maxLength": 500
          },
          "start_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "end_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "duration_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "ci_scope": {},
          "kind": {
            "$ref": "#/components/schemas/BlackoutWindowKindEnum"
          },
          "timezone": {
            "type": "string",
            "maxLength": 64
          },
          "active": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "name"
        ]
      },
      "PaginatedAssignmentGroupList": {
        "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/AssignmentGroup"
            }
          }
        }
      },
      "TicketListRequest": {
        "type": "object",
        "properties": {
          "ticket_type": {
            "$ref": "#/components/schemas/TicketTypeEnum"
          },
          "number": {
            "type": "string",
            "minLength": 1,
            "maxLength": 20
          },
          "short_description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          },
          "state": {
            "type": "string",
            "minLength": 1,
            "maxLength": 30
          },
          "priority": {
            "type": "integer",
            "maximum": 32767,
            "minimum": -32768
          },
          "impact": {
            "type": "integer",
            "maximum": 32767,
            "minimum": -32768
          },
          "urgency": {
            "type": "integer",
            "maximum": 32767,
            "minimum": -32768
          },
          "assignment_group": {
            "type": "integer",
            "nullable": true
          },
          "assignee": {
            "type": "integer",
            "nullable": true
          },
          "requester_kind": {
            "$ref": "#/components/schemas/RequesterKindEnum"
          },
          "resolved_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "closed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "origin": {
            "$ref": "#/components/schemas/OriginEnum"
          }
        },
        "required": [
          "number",
          "priority",
          "short_description",
          "state",
          "ticket_type"
        ]
      },
      "KbArticleStateEnum": {
        "enum": [
          "draft",
          "published",
          "retired"
        ],
        "type": "string",
        "description": "* `draft` - Draft\n* `published` - Published\n* `retired` - Retired"
      },
      "PaginatedCabMeetingList": {
        "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/CabMeeting"
            }
          }
        }
      },
      "ChangeExtChangeTypeEnum": {
        "enum": [
          "normal",
          "standard",
          "emergency"
        ],
        "type": "string",
        "description": "* `normal` - Normal\n* `standard` - Standard\n* `emergency` - Emergency"
      },
      "ChangeExt": {
        "type": "object",
        "properties": {
          "change_type": {
            "$ref": "#/components/schemas/ChangeExtChangeTypeEnum"
          },
          "risk": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/RiskEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              }
            ]
          },
          "risk_score": {
            "type": "string",
            "format": "decimal",
            "pattern": "^-?\\d{0,4}(?:\\.\\d{0,2})?$",
            "readOnly": true,
            "nullable": true
          },
          "risk_factors": {
            "readOnly": true
          },
          "risk_override_by": {
            "type": "integer",
            "nullable": true
          },
          "risk_override_reason": {
            "type": "string"
          },
          "standard_template": {
            "type": "integer",
            "nullable": true
          },
          "planned_start": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "planned_end": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "maintenance_window": {
            "type": "integer",
            "nullable": true
          },
          "implementation_plan": {
            "type": "string"
          },
          "rollback_plan": {
            "type": "string"
          },
          "test_plan": {
            "type": "string"
          },
          "workflow_run_id": {
            "type": "string",
            "maxLength": 64
          },
          "plan_artifact": {},
          "pir_outcome": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PirOutcomeEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              }
            ]
          },
          "pir_notes": {
            "type": "string"
          },
          "pir_verification_ref": {
            "type": "string",
            "maxLength": 100
          },
          "company": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "company_name": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "requested_by": {
            "type": "integer",
            "nullable": true
          },
          "requested_by_username": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "category": {
            "type": "string",
            "maxLength": 50
          },
          "client_number": {
            "type": "string",
            "maxLength": 100
          },
          "client_ticket_ref": {
            "type": "string",
            "maxLength": 100
          },
          "vendor_ticket_ref": {
            "type": "string",
            "maxLength": 100
          },
          "conflict_status": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ConflictStatusEnum"
              }
            ],
            "readOnly": true
          },
          "conflict_last_run": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "ai_failure_prediction": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AiFailurePredictionEnum"
              }
            ],
            "readOnly": true
          },
          "ai_prediction_score": {
            "type": "string",
            "format": "decimal",
            "pattern": "^-?\\d{0,3}(?:\\.\\d{0,2})?$",
            "readOnly": true,
            "nullable": true
          },
          "ai_prediction_factors": {
            "readOnly": true
          },
          "send_blackout_on_implement": {
            "type": "boolean"
          },
          "locked": {
            "type": "boolean",
            "readOnly": true
          },
          "time_worked_seconds": {
            "type": "integer",
            "readOnly": true
          },
          "justification": {
            "type": "string"
          },
          "pre_change_checks": {
            "type": "string"
          },
          "implementation_plan_detail": {
            "type": "string"
          },
          "risk_and_impact_analysis": {
            "type": "string"
          },
          "backout_plan": {
            "type": "string"
          },
          "post_validation_plan": {
            "type": "string"
          },
          "client_testing_required": {
            "type": "boolean"
          },
          "client_testing_plan": {
            "type": "string"
          },
          "client_testing_result": {
            "type": "string"
          },
          "client_testing_signoff_by": {
            "type": "string",
            "maxLength": 200
          },
          "client_testing_signoff_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "requested_by_date": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "actual_start": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "actual_end": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "cab_required": {
            "type": "boolean"
          },
          "cab_date": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "closure_code": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ClosureCodeEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              }
            ]
          },
          "closure_notes": {
            "type": "string"
          },
          "rollback_used": {
            "type": "boolean",
            "nullable": true
          }
        },
        "required": [
          "actual_end",
          "actual_start",
          "ai_failure_prediction",
          "ai_prediction_factors",
          "ai_prediction_score",
          "company_name",
          "conflict_last_run",
          "conflict_status",
          "locked",
          "requested_by_username",
          "risk_factors",
          "risk_score",
          "time_worked_seconds"
        ]
      },
      "SnowMigrationMap": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "sn_table": {
            "type": "string",
            "readOnly": true
          },
          "sn_sys_id": {
            "type": "string",
            "readOnly": true
          },
          "sn_number": {
            "type": "string",
            "readOnly": true
          },
          "versus_ticket": {
            "type": "string",
            "format": "uuid",
            "readOnly": true,
            "nullable": true
          },
          "status": {
            "allOf": [
              {
                "$ref": "#/components/schemas/SnowMigrationMapStatusEnum"
              }
            ],
            "readOnly": true
          },
          "detail": {
            "readOnly": true
          },
          "imported_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "detail",
          "id",
          "imported_at",
          "sn_number",
          "sn_sys_id",
          "sn_table",
          "status",
          "versus_ticket"
        ]
      },
      "PatchedCompanyRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "kind": {
            "$ref": "#/components/schemas/CompanyKindEnum"
          },
          "external_ref": {},
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "CmdbImportJob": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "snow_instance": {
            "type": "integer"
          },
          "snow_instance_name": {
            "type": "string",
            "readOnly": true
          },
          "status": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Status92bEnum"
              }
            ],
            "readOnly": true
          },
          "progress": {
            "type": "integer",
            "readOnly": true
          },
          "current_step": {
            "type": "string",
            "readOnly": true
          },
          "log": {
            "type": "string",
            "readOnly": true
          },
          "error": {
            "type": "string",
            "readOnly": true
          },
          "ci_count": {
            "type": "integer",
            "readOnly": true
          },
          "matched_count": {
            "type": "integer",
            "readOnly": true
          },
          "started_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "finished_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "ci_count",
          "created_at",
          "current_step",
          "error",
          "finished_at",
          "id",
          "log",
          "matched_count",
          "progress",
          "snow_instance",
          "snow_instance_name",
          "started_at",
          "status"
        ]
      },
      "RequestTaskRequest": {
        "type": "object",
        "properties": {
          "ticket": {
            "type": "string",
            "format": "uuid"
          },
          "order": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "short_description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "description": {
            "type": "string"
          },
          "assignment_group": {
            "type": "integer",
            "nullable": true
          },
          "assignee": {
            "type": "integer",
            "nullable": true
          },
          "state": {
            "$ref": "#/components/schemas/StateBe8Enum"
          },
          "workflow_step_ref": {
            "type": "string",
            "maxLength": 100
          }
        },
        "required": [
          "short_description",
          "ticket"
        ]
      },
      "BusinessCalendar": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "timezone": {
            "type": "string",
            "maxLength": 64
          },
          "hours": {},
          "holidays": {}
        },
        "required": [
          "id",
          "name",
          "timezone"
        ]
      },
      "ClosureCodeEnum": {
        "enum": [
          "successful",
          "successful_with_issues",
          "unsuccessful",
          "backed_out"
        ],
        "type": "string",
        "description": "* `successful` - Successful\n* `successful_with_issues` - Successful with Issues\n* `unsuccessful` - Unsuccessful\n* `backed_out` - Backed Out"
      },
      "PaginatedChangeTaskList": {
        "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/ChangeTask"
            }
          }
        }
      },
      "ChangeSpecialNote": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "ticket": {
            "type": "string",
            "format": "uuid"
          },
          "short_description": {
            "type": "string",
            "maxLength": 300
          },
          "body": {
            "type": "string"
          },
          "priority": {
            "type": "integer",
            "maximum": 32767,
            "minimum": -32768,
            "nullable": true
          },
          "expires_on": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "applies_to": {
            "type": "string",
            "maxLength": 200
          },
          "created_by": {
            "type": "integer",
            "readOnly": true,
            "nullable": true
          },
          "created_by_username": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "created_by",
          "created_by_username",
          "id",
          "short_description",
          "ticket"
        ]
      },
      "ChangeTaskRequest": {
        "type": "object",
        "properties": {
          "ticket": {
            "type": "string",
            "format": "uuid"
          },
          "order": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "short_description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "description": {
            "type": "string"
          },
          "task_type": {
            "$ref": "#/components/schemas/ChangeTaskTaskTypeEnum"
          },
          "assignment_group": {
            "type": "integer",
            "nullable": true
          },
          "assignee": {
            "type": "integer",
            "nullable": true
          },
          "workflow_step_ref": {
            "type": "string",
            "maxLength": 100
          },
          "state": {
            "$ref": "#/components/schemas/StateBe8Enum"
          },
          "planned_start": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "planned_end": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "short_description",
          "ticket"
        ]
      },
      "SubmissionStatusEnum": {
        "enum": [
          "SUBMITTED",
          "QUEUED",
          "PENDING_VERSUS_APPROVAL",
          "VERSUS_APPROVED",
          "VERSUS_REJECTED",
          "PENDING_SNOW_REQUEST_APPROVAL",
          "SNOW_REQUEST_APPROVED",
          "SNOW_REQUEST_REJECTED",
          "PENDING_SNOW_CHANGE_APPROVAL",
          "SNOW_CHANGE_APPROVED",
          "SNOW_CHANGE_REJECTED",
          "IMPLEMENTING",
          "IMPL_FAILED",
          "VERIFYING",
          "VERIFY_FAILED",
          "COMPLETED",
          "FAILED",
          "ROLLED_BACK",
          "CANCELLED",
          "TIMED_OUT"
        ],
        "type": "string",
        "description": "* `SUBMITTED` - Submitted\n* `QUEUED` - Queued\n* `PENDING_VERSUS_APPROVAL` - Pending Versus Approval\n* `VERSUS_APPROVED` - Versus Approved\n* `VERSUS_REJECTED` - Versus Rejected\n* `PENDING_SNOW_REQUEST_APPROVAL` - Pending SNOW Request Approval\n* `SNOW_REQUEST_APPROVED` - SNOW Request Approved\n* `SNOW_REQUEST_REJECTED` - SNOW Request Rejected\n* `PENDING_SNOW_CHANGE_APPROVAL` - Pending SNOW Change Approval\n* `SNOW_CHANGE_APPROVED` - SNOW Change Approved\n* `SNOW_CHANGE_REJECTED` - SNOW Change Rejected\n* `IMPLEMENTING` - Implementing\n* `IMPL_FAILED` - Implementation Failed\n* `VERIFYING` - Verifying\n* `VERIFY_FAILED` - Verification Failed\n* `COMPLETED` - Completed\n* `FAILED` - Failed\n* `ROLLED_BACK` - Rolled Back\n* `CANCELLED` - Cancelled\n* `TIMED_OUT` - Timed Out"
      },
      "ApprovalRuleRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "matcher": {},
          "precedence": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "stages": {},
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "name"
        ]
      },
      "PatchedKbArticleRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "body": {
            "type": "string",
            "minLength": 1
          },
          "state": {
            "$ref": "#/components/schemas/KbArticleStateEnum"
          },
          "tags": {},
          "source_problem": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "view_count": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "helpful": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "not_helpful": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "author": {
            "type": "integer",
            "nullable": true
          },
          "published_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "TicketDetail": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "ticket_type": {
            "$ref": "#/components/schemas/TicketTypeEnum"
          },
          "number": {
            "type": "string",
            "maxLength": 20
          },
          "short_description": {
            "type": "string",
            "maxLength": 500
          },
          "state": {
            "type": "string",
            "maxLength": 30
          },
          "priority": {
            "type": "integer",
            "maximum": 32767,
            "minimum": -32768
          },
          "impact": {
            "type": "integer",
            "maximum": 32767,
            "minimum": -32768
          },
          "urgency": {
            "type": "integer",
            "maximum": 32767,
            "minimum": -32768
          },
          "assignment_group": {
            "type": "integer",
            "nullable": true
          },
          "assignment_group_name": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "assignee": {
            "type": "integer",
            "nullable": true
          },
          "assignee_username": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "requester_kind": {
            "$ref": "#/components/schemas/RequesterKindEnum"
          },
          "opened_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "resolved_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "closed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "origin": {
            "$ref": "#/components/schemas/OriginEnum"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "description": {
            "type": "string"
          },
          "origin_ref": {},
          "external_ref": {},
          "incident_ext": {
            "allOf": [
              {
                "$ref": "#/components/schemas/IncidentExt"
              }
            ],
            "readOnly": true
          },
          "problem_ext": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ProblemExt"
              }
            ],
            "readOnly": true
          },
          "change_ext": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ChangeExt"
              }
            ],
            "readOnly": true
          },
          "request_ext": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RequestExt"
              }
            ],
            "readOnly": true
          },
          "ci_links": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CiLink"
            },
            "readOnly": true
          },
          "comments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TicketComment"
            },
            "readOnly": true
          },
          "transitions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TicketTransition"
            },
            "readOnly": true
          },
          "change_tasks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChangeTask"
            },
            "readOnly": true
          },
          "problem_tasks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProblemTask"
            },
            "readOnly": true
          },
          "request_tasks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RequestTask"
            },
            "readOnly": true
          },
          "requested_items": {
            "type": "string",
            "readOnly": true
          },
          "special_notes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChangeSpecialNote"
            },
            "readOnly": true
          },
          "approval_instances": {
            "type": "string",
            "readOnly": true
          },
          "available_events": {
            "type": "string",
            "readOnly": true
          }
        },
        "required": [
          "approval_instances",
          "assignee_username",
          "assignment_group_name",
          "available_events",
          "change_ext",
          "change_tasks",
          "ci_links",
          "comments",
          "created_at",
          "id",
          "incident_ext",
          "number",
          "opened_at",
          "priority",
          "problem_ext",
          "problem_tasks",
          "request_ext",
          "request_tasks",
          "requested_items",
          "short_description",
          "special_notes",
          "state",
          "ticket_type",
          "transitions",
          "updated_at"
        ]
      },
      "PatchedApprovalRuleRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "matcher": {},
          "precedence": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "stages": {},
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "KbArticle": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "title": {
            "type": "string",
            "maxLength": 300
          },
          "body": {
            "type": "string"
          },
          "state": {
            "$ref": "#/components/schemas/KbArticleStateEnum"
          },
          "tags": {},
          "source_problem": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "view_count": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "helpful": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "not_helpful": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "author": {
            "type": "integer",
            "nullable": true
          },
          "author_username": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "published_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "author_username",
          "body",
          "created_at",
          "id",
          "title"
        ]
      },
      "CompanyKindEnum": {
        "enum": [
          "self",
          "client",
          "vendor"
        ],
        "type": "string",
        "description": "* `self` - Self\n* `client` - Client\n* `vendor` - Vendor"
      },
      "PatchedTicketWatcherRequest": {
        "type": "object",
        "properties": {
          "ticket": {
            "type": "string",
            "format": "uuid"
          },
          "user": {
            "type": "integer"
          }
        }
      },
      "ChangeConflictStatusEnum": {
        "enum": [
          "open",
          "resolved",
          "overridden"
        ],
        "type": "string",
        "description": "* `open` - Open\n* `resolved` - Resolved\n* `overridden` - Overridden"
      },
      "CatalogCategoryRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "sort": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          }
        },
        "required": [
          "name"
        ]
      },
      "PaginatedChangeGateBindingList": {
        "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/ChangeGateBinding"
            }
          }
        }
      },
      "RequestExt": {
        "type": "object",
        "properties": {
          "catalog_item": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "catalog_item_name": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "app_builder_submission_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "fulfillment_state": {},
          "quantity": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "parent_request": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        },
        "required": [
          "catalog_item_name"
        ]
      },
      "BlackoutWindowKindEnum": {
        "enum": [
          "blackout",
          "freeze"
        ],
        "type": "string",
        "description": "* `blackout` - Blackout\n* `freeze` - Freeze"
      },
      "PatchedAssignmentGroupRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "routing_policy": {
            "$ref": "#/components/schemas/RoutingPolicyEnum"
          },
          "escalation_group": {
            "type": "integer",
            "nullable": true
          },
          "rr_cursor": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          }
        }
      },
      "Submission": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "form_definition": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "app_version": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "request_type_key": {
            "type": "string",
            "maxLength": 100
          },
          "resolved_inputs": {},
          "binding_snapshot": {},
          "idempotency_key": {
            "type": "string",
            "readOnly": true
          },
          "status": {
            "allOf": [
              {
                "$ref": "#/components/schemas/SubmissionStatusEnum"
              }
            ],
            "readOnly": true
          },
          "current_stage": {
            "type": "string",
            "readOnly": true
          },
          "notes": {
            "type": "string"
          },
          "submitted_by": {
            "type": "integer",
            "nullable": true
          },
          "submitted_by_name": {
            "type": "string",
            "readOnly": true
          },
          "runtime": {
            "type": "string",
            "readOnly": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "current_stage",
          "id",
          "idempotency_key",
          "request_type_key",
          "runtime",
          "status",
          "submitted_by_name",
          "updated_at"
        ]
      },
      "MaintenanceWindowRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "recurrence_rrule": {
            "type": "string",
            "maxLength": 500
          },
          "start_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "end_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "duration_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "ci_scope": {},
          "timezone": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          }
        },
        "required": [
          "name"
        ]
      },
      "ChangeConflictSeverityEnum": {
        "enum": [
          "warning",
          "blocking"
        ],
        "type": "string",
        "description": "* `warning` - Warning\n* `blocking` - Blocking"
      },
      "ProblemTask": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "ticket": {
            "type": "string",
            "format": "uuid"
          },
          "number": {
            "type": "string",
            "readOnly": true,
            "nullable": true
          },
          "order": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "short_description": {
            "type": "string",
            "maxLength": 300
          },
          "description": {
            "type": "string"
          },
          "task_type": {
            "$ref": "#/components/schemas/ProblemTaskTaskTypeEnum"
          },
          "assignment_group": {
            "type": "integer",
            "nullable": true
          },
          "assignment_group_name": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "assignee": {
            "type": "integer",
            "nullable": true
          },
          "assignee_username": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "state": {
            "$ref": "#/components/schemas/StateBe8Enum"
          },
          "closed_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "assignee_username",
          "assignment_group_name",
          "closed_at",
          "created_at",
          "id",
          "number",
          "short_description",
          "ticket"
        ]
      },
      "PaginatedTicketListList": {
        "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/TicketList"
            }
          }
        }
      },
      "PaginatedCatalogCategoryList": {
        "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/CatalogCategory"
            }
          }
        }
      },
      "Status92bEnum": {
        "enum": [
          "pending",
          "running",
          "completed",
          "failed"
        ],
        "type": "string",
        "description": "* `pending` - Pending\n* `running` - Running\n* `completed` - Completed\n* `failed` - Failed"
      },
      "PaginatedChangeConflictList": {
        "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/ChangeConflict"
            }
          }
        }
      },
      "PatchedCatalogItemRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "description": {
            "type": "string"
          },
          "icon": {
            "type": "string",
            "maxLength": 50
          },
          "category": {
            "type": "integer",
            "nullable": true
          },
          "app_builder_form_id": {
            "type": "string",
            "format": "uuid"
          },
          "workflow_binding_id": {
            "type": "string",
            "format": "uuid"
          },
          "visibility": {},
          "request_sla_hint": {
            "type": "integer",
            "nullable": true
          },
          "change_gate_mode": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10
          },
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "RecurrenceEnum": {
        "enum": [
          "none",
          "weekly",
          "biweekly",
          "monthly"
        ],
        "type": "string",
        "description": "* `none` - One-off\n* `weekly` - Weekly\n* `biweekly` - Bi-weekly\n* `monthly` - Monthly"
      },
      "TicketWatcherRequest": {
        "type": "object",
        "properties": {
          "ticket": {
            "type": "string",
            "format": "uuid"
          },
          "user": {
            "type": "integer"
          }
        },
        "required": [
          "ticket",
          "user"
        ]
      },
      "BlankEnum": {
        "enum": [
          ""
        ]
      },
      "PaginatedCompanyList": {
        "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/Company"
            }
          }
        }
      },
      "RequestTask": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "ticket": {
            "type": "string",
            "format": "uuid"
          },
          "number": {
            "type": "string",
            "readOnly": true,
            "nullable": true
          },
          "order": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "short_description": {
            "type": "string",
            "maxLength": 300
          },
          "description": {
            "type": "string"
          },
          "assignment_group": {
            "type": "integer",
            "nullable": true
          },
          "assignment_group_name": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "assignee": {
            "type": "integer",
            "nullable": true
          },
          "assignee_username": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "state": {
            "$ref": "#/components/schemas/StateBe8Enum"
          },
          "workflow_step_ref": {
            "type": "string",
            "maxLength": 100
          },
          "closed_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "assignee_username",
          "assignment_group_name",
          "closed_at",
          "created_at",
          "id",
          "number",
          "short_description",
          "ticket"
        ]
      },
      "PatchedStandardChangeTemplateRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "scope_matcher": {},
          "implementation_plan": {
            "type": "string"
          },
          "rollback_plan": {
            "type": "string"
          },
          "version": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "proposed_by": {
            "type": "integer",
            "nullable": true
          },
          "approved_by": {
            "type": "integer",
            "nullable": true
          },
          "approved_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "StandardChangeTemplate": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "scope_matcher": {},
          "implementation_plan": {
            "type": "string"
          },
          "rollback_plan": {
            "type": "string"
          },
          "version": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "proposed_by": {
            "type": "integer",
            "nullable": true
          },
          "approved_by": {
            "type": "integer",
            "nullable": true
          },
          "approved_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "id",
          "name"
        ]
      },
      "PatchedChangeGateBindingRequest": {
        "type": "object",
        "properties": {
          "workflow_definition_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "workflow_name": {
            "type": "string",
            "maxLength": 200
          },
          "mode": {
            "$ref": "#/components/schemas/ChangeGateBindingModeEnum"
          },
          "approval_rule": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "RoutingPolicyEnum": {
        "enum": [
          "manual",
          "round_robin",
          "load_based"
        ],
        "type": "string",
        "description": "* `manual` - Manual\n* `round_robin` - Round Robin\n* `load_based` - Load Based"
      },
      "CatalogItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "description": {
            "type": "string"
          },
          "icon": {
            "type": "string",
            "maxLength": 50
          },
          "category": {
            "type": "integer",
            "nullable": true
          },
          "app_builder_form_id": {
            "type": "string",
            "format": "uuid"
          },
          "workflow_binding_id": {
            "type": "string",
            "format": "uuid"
          },
          "visibility": {},
          "request_sla_hint": {
            "type": "integer",
            "nullable": true
          },
          "change_gate_mode": {
            "type": "string",
            "maxLength": 10
          },
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "app_builder_form_id",
          "id",
          "name",
          "workflow_binding_id"
        ]
      },
      "PatchedTicketListRequest": {
        "type": "object",
        "properties": {
          "ticket_type": {
            "$ref": "#/components/schemas/TicketTypeEnum"
          },
          "number": {
            "type": "string",
            "minLength": 1,
            "maxLength": 20
          },
          "short_description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          },
          "state": {
            "type": "string",
            "minLength": 1,
            "maxLength": 30
          },
          "priority": {
            "type": "integer",
            "maximum": 32767,
            "minimum": -32768
          },
          "impact": {
            "type": "integer",
            "maximum": 32767,
            "minimum": -32768
          },
          "urgency": {
            "type": "integer",
            "maximum": 32767,
            "minimum": -32768
          },
          "assignment_group": {
            "type": "integer",
            "nullable": true
          },
          "assignee": {
            "type": "integer",
            "nullable": true
          },
          "requester_kind": {
            "$ref": "#/components/schemas/RequesterKindEnum"
          },
          "resolved_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "closed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "origin": {
            "$ref": "#/components/schemas/OriginEnum"
          }
        }
      },
      "ImportedCI": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "job": {
            "type": "integer",
            "readOnly": true
          },
          "sys_id": {
            "type": "string",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "readOnly": true
          },
          "ip_address": {
            "type": "string",
            "readOnly": true,
            "nullable": true
          },
          "os": {
            "type": "string",
            "readOnly": true
          },
          "sys_class_name": {
            "type": "string",
            "readOnly": true
          },
          "operational_status": {
            "type": "string",
            "readOnly": true
          },
          "owner_company": {
            "type": "string",
            "readOnly": true
          },
          "matched_pool_member": {
            "type": "integer",
            "readOnly": true,
            "nullable": true
          },
          "matched_pool_member_name": {
            "type": "string",
            "readOnly": true
          },
          "matched_pool_name": {
            "type": "string",
            "readOnly": true
          },
          "match_confidence": {
            "type": "integer",
            "readOnly": true
          },
          "existing_managed_device": {
            "type": "integer",
            "readOnly": true,
            "nullable": true
          },
          "existing_managed_device_name": {
            "type": "string",
            "readOnly": true
          },
          "decision": {
            "$ref": "#/components/schemas/DecisionEnum"
          },
          "imported_managed_device": {
            "type": "integer",
            "readOnly": true,
            "nullable": true
          }
        },
        "required": [
          "existing_managed_device",
          "existing_managed_device_name",
          "id",
          "imported_managed_device",
          "ip_address",
          "job",
          "match_confidence",
          "matched_pool_member",
          "matched_pool_member_name",
          "matched_pool_name",
          "name",
          "operational_status",
          "os",
          "owner_company",
          "sys_class_name",
          "sys_id"
        ]
      },
      "PatchedMaintenanceWindowRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "recurrence_rrule": {
            "type": "string",
            "maxLength": 500
          },
          "start_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "end_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "duration_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "ci_scope": {},
          "timezone": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          }
        }
      },
      "MetricEnum": {
        "enum": [
          "response",
          "resolution"
        ],
        "type": "string",
        "description": "* `response` - Response\n* `resolution` - Resolution"
      },
      "KbArticleRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "body": {
            "type": "string",
            "minLength": 1
          },
          "state": {
            "$ref": "#/components/schemas/KbArticleStateEnum"
          },
          "tags": {},
          "source_problem": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "view_count": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "helpful": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "not_helpful": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "author": {
            "type": "integer",
            "nullable": true
          },
          "published_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "body",
          "title"
        ]
      },
      "ChangeGateBinding": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "workflow_definition_id": {
            "type": "string",
            "maxLength": 64
          },
          "workflow_name": {
            "type": "string",
            "maxLength": 200
          },
          "mode": {
            "$ref": "#/components/schemas/ChangeGateBindingModeEnum"
          },
          "approval_rule": {
            "type": "integer",
            "nullable": true
          }
        },
        "required": [
          "id",
          "workflow_definition_id"
        ]
      },
      "PaginatedBusinessCalendarList": {
        "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/BusinessCalendar"
            }
          }
        }
      },
      "PaginatedStandardChangeTemplateList": {
        "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/StandardChangeTemplate"
            }
          }
        }
      },
      "SnowMigrationMapStatusEnum": {
        "enum": [
          "imported",
          "ci_unresolved",
          "state_unmapped",
          "skipped",
          "error"
        ],
        "type": "string",
        "description": "* `imported` - Imported\n* `ci_unresolved` - CI Unresolved\n* `state_unmapped` - State Unmapped\n* `skipped` - Skipped\n* `error` - Error"
      },
      "PaginatedApprovalRuleList": {
        "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/ApprovalRule"
            }
          }
        }
      },
      "PatchedRequestTaskRequest": {
        "type": "object",
        "properties": {
          "ticket": {
            "type": "string",
            "format": "uuid"
          },
          "order": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "short_description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "description": {
            "type": "string"
          },
          "assignment_group": {
            "type": "integer",
            "nullable": true
          },
          "assignee": {
            "type": "integer",
            "nullable": true
          },
          "state": {
            "$ref": "#/components/schemas/StateBe8Enum"
          },
          "workflow_step_ref": {
            "type": "string",
            "maxLength": 100
          }
        }
      },
      "PatchedCabMeetingRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "scheduled_at": {
            "type": "string",
            "format": "date-time"
          },
          "duration_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "recurrence": {
            "$ref": "#/components/schemas/RecurrenceEnum"
          },
          "location": {
            "type": "string",
            "maxLength": 300
          },
          "status": {
            "$ref": "#/components/schemas/CabMeetingStatusEnum"
          },
          "attendees": {},
          "agenda_notes": {
            "type": "string"
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "minutes": {
            "type": "string"
          },
          "dispositions": {},
          "chaired_by": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "TicketTypeEnum": {
        "enum": [
          "incident",
          "problem",
          "change",
          "request",
          "requested_item"
        ],
        "type": "string",
        "description": "* `incident` - Incident\n* `problem` - Problem\n* `change` - Change\n* `request` - Request\n* `requested_item` - Requested Item"
      },
      "PatchedChangeTaskRequest": {
        "type": "object",
        "properties": {
          "ticket": {
            "type": "string",
            "format": "uuid"
          },
          "order": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "short_description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "description": {
            "type": "string"
          },
          "task_type": {
            "$ref": "#/components/schemas/ChangeTaskTaskTypeEnum"
          },
          "assignment_group": {
            "type": "integer",
            "nullable": true
          },
          "assignee": {
            "type": "integer",
            "nullable": true
          },
          "workflow_step_ref": {
            "type": "string",
            "maxLength": 100
          },
          "state": {
            "$ref": "#/components/schemas/StateBe8Enum"
          },
          "planned_start": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "planned_end": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "CabMeetingStatusEnum": {
        "enum": [
          "scheduled",
          "in_progress",
          "completed",
          "cancelled"
        ],
        "type": "string",
        "description": "* `scheduled` - Scheduled\n* `in_progress` - In progress\n* `completed` - Completed\n* `cancelled` - Cancelled"
      },
      "GroupMember": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "group": {
            "type": "integer"
          },
          "user": {
            "type": "integer"
          },
          "username": {
            "type": "string",
            "readOnly": true
          },
          "full_name": {
            "type": "string",
            "readOnly": true
          },
          "capacity_weight": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          }
        },
        "required": [
          "full_name",
          "group",
          "id",
          "user",
          "username"
        ]
      },
      "PaginatedTicketWatcherList": {
        "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/TicketWatcher"
            }
          }
        }
      },
      "TicketComment": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "ticket": {
            "type": "string",
            "format": "uuid"
          },
          "author_username": {
            "type": "string",
            "readOnly": true,
            "default": ""
          },
          "author_kind": {
            "type": "string",
            "maxLength": 10
          },
          "visibility": {
            "$ref": "#/components/schemas/VisibilityEnum"
          },
          "body": {
            "type": "string"
          },
          "sync_actor": {
            "type": "string",
            "maxLength": 100
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "author_username",
          "body",
          "created_at",
          "id",
          "ticket"
        ]
      },
      "CmdbImportJobRequest": {
        "type": "object",
        "properties": {
          "snow_instance": {
            "type": "integer"
          }
        },
        "required": [
          "snow_instance"
        ]
      },
      "SlaDefinition": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "applies_to": {},
          "precedence": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "metric": {
            "$ref": "#/components/schemas/MetricEnum"
          },
          "target_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "calendar": {
            "type": "integer",
            "nullable": true
          },
          "pause_states": {},
          "warning_threshold_pct": {
            "type": "integer",
            "maximum": 32767,
            "minimum": -32768
          },
          "rearm_on_reopen": {
            "type": "boolean"
          },
          "archived_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "id",
          "metric",
          "name",
          "target_minutes"
        ]
      },
      "ChangeGateBindingRequest": {
        "type": "object",
        "properties": {
          "workflow_definition_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "workflow_name": {
            "type": "string",
            "maxLength": 200
          },
          "mode": {
            "$ref": "#/components/schemas/ChangeGateBindingModeEnum"
          },
          "approval_rule": {
            "type": "integer",
            "nullable": true
          }
        },
        "required": [
          "workflow_definition_id"
        ]
      },
      "PaginatedRequestTaskList": {
        "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/RequestTask"
            }
          }
        }
      },
      "PatchedBlackoutWindowRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "recurrence_rrule": {
            "type": "string",
            "maxLength": 500
          },
          "start_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "end_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "duration_minutes": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": -2147483648
          },
          "ci_scope": {},
          "kind": {
            "$ref": "#/components/schemas/BlackoutWindowKindEnum"
          },
          "timezone": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "active": {
            "type": "boolean"
          }
        }
      },
      "ChangeGateBindingModeEnum": {
        "enum": [
          "off",
          "record",
          "gate",
          "external"
        ],
        "type": "string",
        "description": "* `off` - Off\n* `record` - Record\n* `gate` - Gate\n* `external` - External (ServiceNow)"
      },
      "PaginatedCmdbImportJobList": {
        "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/CmdbImportJob"
            }
          }
        }
      },
      "PatchedCatalogActionRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "key": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "pattern": "^[-a-zA-Z0-9_]+$"
          },
          "description": {
            "type": "string"
          },
          "operation_ref": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "fixed_params": {},
          "user_params_schema": {},
          "execution_mode": {
            "$ref": "#/components/schemas/ExecutionModeEnum"
          },
          "workflow_ref": {
            "type": "string",
            "maxLength": 300
          },
          "approval_chain": {},
          "audit_category": {
            "type": "string",
            "maxLength": 100
          },
          "is_reversible": {
            "type": "boolean"
          },
          "tags": {},
          "enabled": {
            "type": "boolean"
          }
        }
      }
    }
  }
}