{
  "openapi": "3.0.1",
  "info": {
    "title": "Partners API",
    "version": "v1"
  },
  "servers": [
    {
      "url": "https://api.portal.saymine.com/",
      "description": "MineOS EU API Endpoint"
    },
    {
      "url": "https://api.us.portal.saymine.com/",
      "description": "MineOS US API Endpoint"
    }
  ],
  "paths": {
    "/api/aispm/v2/public/agents": {
      "get": {
        "tags": [
          "AISPM"
        ],
        "summary": "List discovered AI agents.",
        "description": "One page of the AI agents discovered on your organization's devices, one row per agent per device. Filter, search, sort\r\nand page with the query parameters. `total` is the number of rows matching the filters. No matches returns\r\n`{ \"total\": 0, \"items\": [] }`, not a `404`. An unrecognized `sortBy`, `sortDirection` or\r\n`riskLevels` value is a `400` whose message names the accepted values. Authenticate with an API key.",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "description": "Zero-based page index. Absent or negative is treated as the first page.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "Rows per page. Defaults to 25; the maximum is 1000 and a larger value is reduced to it. A value below 1 is raised\r\n            to 1.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "SortBy",
            "in": "query",
            "description": "Field to sort by, case-insensitive: `Name`, `Endpoint`, `Hostname`, `RiskLevel`,\r\n            `BusinessPurpose`, `FirstDetectedAt`, `LastDetectedAt`. Defaults to `LastDetectedAt`. An unknown value is a\r\n            `400` naming the accepted values.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "SortDirection",
            "in": "query",
            "description": "`Ascending` or `Descending` (`Asc`/`Desc` also accepted), case-insensitive. Defaults to\r\n            `Descending`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Search",
            "in": "query",
            "description": "Case-insensitive text search over agent name, agent id, device id, hostname and vendor names.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "RiskLevels",
            "in": "query",
            "description": "Risk levels to include: `VeryLow`, `Low`, `Medium`, `High`, `VeryHigh`. Repeat the parameter or\r\n            comma-separate values. An unknown value is a `400`.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "BusinessPurposes",
            "in": "query",
            "description": "Business purposes to include, by display name. Repeat the parameter or comma-separate values; an unknown value matches\r\n            nothing. Values are combined with OR; different filters with AND.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "Vendors",
            "in": "query",
            "description": "Vendors to include, by vendor id (for example `anthropic.com`) — the vendors an agent's components connect to. Same\r\n            multi-value rules as `businessPurposes`.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "Tools",
            "in": "query",
            "description": "Tools to include, by display name. Same multi-value rules as `businessPurposes`.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "IsCurrent",
            "in": "query",
            "description": "Only agents still reported by the latest scan of their AI tool on their device (`true`), or only those no longer\r\n            reported (`false`). Omit for both.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "Hostnames",
            "in": "query",
            "description": "Device hostnames to include, matched exactly. Same multi-value rules as `businessPurposes`.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmAgentListResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/aispm/v2/public/agents/{id}": {
      "get": {
        "tags": [
          "AISPM"
        ],
        "summary": "Get one agent's details.",
        "description": "Returns the agent together with its detected components (connectors, channels, skills). `404` when no\r\n            agent with this id exists in your organization.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "The agent's unique identifier.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmAgentDetailResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/aispm/v2/public/agents/{id}/vulnerabilities": {
      "get": {
        "tags": [
          "AISPM"
        ],
        "summary": "List an agent's vulnerabilities.",
        "description": "One page of the security findings on this agent, each with its severity, explanation and remediation, and\r\n            whether it is still present in the latest analysis (`isCurrent`). No findings is an empty page, not a `404`;\r\n            `404` when no agent with this id exists in your organization.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "The agent's unique identifier.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "Zero-based page index. Defaults to the first page.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Rows per page. Defaults to 25 and is clamped to the configured maximum.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmAgentVulnerabilityListResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/aispm/v2/public/agents/{id}/signals": {
      "get": {
        "tags": [
          "AISPM"
        ],
        "summary": "List an agent's governance signals.",
        "description": "One page of the governance signals on this agent — observations about purpose, data use and oversight, scored\r\n            separately from security findings. No signals is an empty page, not a `404`; `404` when no agent with this id\r\n            exists in your organization.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "The agent's unique identifier.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "pageNumber",
            "in": "query",
            "description": "Zero-based page index. Defaults to the first page.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Rows per page. Defaults to 25 and is clamped to the configured maximum.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmAgentSignalListResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/aispm/v2/public/agents/{id}/vulnerabilities/groups": {
      "get": {
        "tags": [
          "AISPM"
        ],
        "summary": "List an agent's vulnerabilities grouped by type.",
        "description": "The agent's security findings collapsed into one row per `(category, pattern)`, aggregated across\r\n            every device this agent appears on — so a group's `endpointsCount` can exceed one. List only, no\r\n            drill-down; `404` when no agent with this id exists in your organization.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "The agent's unique identifier.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmAgentIssueGroupListResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "deprecated": true
      }
    },
    "/api/aispm/v2/public/agents/{id}/signals/groups": {
      "get": {
        "tags": [
          "AISPM"
        ],
        "summary": "List an agent's governance signals grouped by type.",
        "description": "The agent's governance signals collapsed into one row per `(signalType, reference)`, aggregated\r\n            across every device this agent appears on. List only, no drill-down; `404` when no agent with this id\r\n            exists in your organization.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "The agent's unique identifier.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmAgentIssueGroupListResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "deprecated": true
      }
    },
    "/api/aispm/v2/public/devices": {
      "get": {
        "tags": [
          "AISPM"
        ],
        "summary": "List enrolled devices.",
        "description": "One page of the devices enrolled in your organization, with each device's last check-in, scheduled scan time,\r\nreporting and tamper status, and how many agents and vendors were found on it. `total` is the number of devices\r\nmatching the filters; an oversized `pageSize` is reduced to the maximum; an unrecognized filter value is a `400`\r\nwhose message names the accepted values; no matches returns `{ \"total\": 0, \"items\": [] }`, not a `404`.\r\nAuthenticate with an API key.",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "description": "Zero-based page index. Absent or negative is treated as the first page.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "Rows per page. Defaults to 25; the maximum is 1000 and a larger value is reduced to it. Zero or a negative value\r\n            means the default.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "SortBy",
            "in": "query",
            "description": "Field to sort by, case-insensitive: `EnrolledAt`, `UpdatedAt`, `DeviceId`, `Hostname`,\r\n            `Platform`, `OsVersion`, `ScannerVersion`, `State`, `LastCheckInAt`, `ConnectedAgentsCount`,\r\n            `ConnectedVendorsCount`, `RiskLevel`. Defaults to `EnrolledAt`. An unknown value is a `400` naming the accepted values.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "SortDirection",
            "in": "query",
            "description": "`Ascending` or `Descending` (`Asc`/`Desc` also accepted), case-insensitive. Defaults to\r\n            `Descending`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Search",
            "in": "query",
            "description": "Case-insensitive text search over device id, hostname and the user account names the response lists.\r\nService-account names are not searchable, because they are not shown.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "States",
            "in": "query",
            "description": "Device states to include: `Pending`, `Approved`, `Rejected`, `Offboarded`. Repeat the parameter\r\n            or comma-separate values; an unknown value is a `400` naming the accepted values. Values are combined with OR; different\r\n            filters with AND.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "Platforms",
            "in": "query",
            "description": "Operating systems to include: `MacOs`, `Windows`, `Linux`. Same multi-value rules as\r\n            `states`.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "OsArchs",
            "in": "query",
            "description": "CPU architectures to include, matched exactly (for example `arm64`). An unknown value matches nothing.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "ScannerVersions",
            "in": "query",
            "description": "Agent versions to include, matched exactly. An unknown value matches nothing.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "ReportingStatuses",
            "in": "query",
            "description": "Reporting statuses to include: `NeverCheckedIn`, `Reporting`, `Stopped`. Same multi-value rules as\r\n            `states`.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "TamperStatuses",
            "in": "query",
            "description": "Tamper statuses to include: `Unknown`, `Clean`, `Tampered`. Same multi-value rules as\r\n            `states`.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "MinConnectedAgents",
            "in": "query",
            "description": "Only devices with at least this many agents (for example `1` for \"has at least one agent\").",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "MinConnectedVendors",
            "in": "query",
            "description": "Only devices whose agents connect to at least this many vendors.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "RiskLevels",
            "in": "query",
            "description": "Device risk bands to include: `Low`, `Medium`, `High`, `VeryHigh` (a device's band is its\r\n            highest-risk agent's). Same multi-value rules as `states`; a device with no findings matches none.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmDeviceStatusListResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/aispm/v2/public/devices/{deviceId}": {
      "get": {
        "tags": [
          "AISPM"
        ],
        "summary": "Get one device's status.",
        "description": "The same fields as one row of the device list. `deviceId` is the value the agents endpoints return as\r\n            `endpoint`. `404` when no device with this id exists in your organization.",
        "parameters": [
          {
            "name": "deviceId",
            "in": "path",
            "description": "The device's identifier, as reported by the MineOS agent on the device.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmDeviceStatusResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/aispm/v2/public/issues/groups": {
      "get": {
        "tags": [
          "AISPM"
        ],
        "summary": "List current issues grouped by type.",
        "description": "One page of your organization's current issues grouped by type — security by category and pattern,\r\n            governance by signal type and reference — each with its total instances, distinct agents and endpoints, and\r\n            worst risk. No matches returns `{ \"total\": 0, \"items\": [] }`, not a `404`; an unrecognized enumerated\r\n            value is a `400` naming the accepted values. Authenticate with an API key.",
        "parameters": [
          {
            "name": "PageNumber",
            "in": "query",
            "description": "Zero-based page index. Absent or negative is treated as the first page.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "Rows per page. Values above the maximum are reduced to it.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "SortBy",
            "in": "query",
            "description": "Field to sort by, case-insensitive: `Risk`, `TotalInstances`, `AgentsCount`, `EndpointsCount`,\r\n            `Category`, `Pattern`, `FirstDiscoveredAt`, `LastScannedAt`. Defaults to `Risk`. An unknown\r\n            value is a `400` naming the accepted values.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "SortDirection",
            "in": "query",
            "description": "`Ascending` or `Descending` (`Asc`/`Desc` also accepted), case-insensitive. Defaults to `Descending`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Search",
            "in": "query",
            "description": "Case-insensitive text search over a group's category, pattern, signal type, entity, reference and description.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "RiskLevels",
            "in": "query",
            "description": "Risk levels to keep whole groups by: `VeryLow`, `Low`, `Medium`, `High`, `VeryHigh`. Repeat the parameter or comma-separate values; an unknown value is a `400`.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "Categories",
            "in": "query",
            "description": "Categories to keep whole groups by. Repeat the parameter or comma-separate values.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "Sources",
            "in": "query",
            "description": "Which kinds of issue to include: `Security` (security findings), `Gov` (governance signals), or both when omitted.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "AgentIds",
            "in": "query",
            "description": "Agent ids to scope the GROUPS by, PRE-aggregation (combined with `agentStableIds`) — re-derives\r\n            the aggregates for the selected agent(s), unlike the whole-group filters above. Repeat the parameter or\r\n            comma-separate values.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "AgentStableIds",
            "in": "query",
            "description": "Agent stable ids to scope the GROUPS by, PRE-aggregation (combined with `agentIds`). Repeat the\r\n            parameter or comma-separate values.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmIssueGroupListResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/aispm/v2/public/issues/groups/summary": {
      "get": {
        "tags": [
          "AISPM"
        ],
        "summary": "Get one issue group, with its affected agents and endpoints.",
        "description": "One issue group addressed by its composite key — security by `source=Security&category=…&pattern=…`,\r\n            governance by `source=Gov&signalType=…&reference=…` — with its header aggregate plus the first page of the\r\n            agents it was found on and of the endpoints it was found on, most-affected first. Every row carries a preview of its\r\n            findings (`instancesTruncated` when there are more); page through the rest with `groups/summary/instances`.\r\n            Use `pageSize` to size both sections; page past them with `groups/summary/agents` and\r\n            `groups/summary/endpoints`. An invalid key combination is a `400`; a key that matches no current issue in your\r\n            organization is a `404`. Authenticate with an API key.",
        "parameters": [
          {
            "name": "Source",
            "in": "query",
            "description": "Which kind of group: `Security` or `Gov`. Required.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Category",
            "in": "query",
            "description": "The security group's category (OPTIONAL for `source=Security`; rejected for `Gov`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Pattern",
            "in": "query",
            "description": "The security group's pattern/sub-category (required for `source=Security`, rejected for `Gov`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "SignalType",
            "in": "query",
            "description": "The governance signal type (required for `source=Gov`, rejected for `Security`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Reference",
            "in": "query",
            "description": "The governance group's opaque reference key (required for `source=Gov`, rejected for `Security`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "AgentIds",
            "in": "query",
            "description": "Agent ids to scope the summary by, PRE-aggregation (combined with `agentStableIds`). Repeat the parameter or comma-separate values.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "AgentStableIds",
            "in": "query",
            "description": "Agent stable ids to scope the summary by, PRE-aggregation (combined with `agentIds`). Repeat the parameter or comma-separate values.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "Rows per embedded section. Defaults to 25; values above the maximum are reduced to it, below 1 raised to 1.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmIssueGroupSummaryResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/aispm/v2/public/issues/groups/summary/agents": {
      "get": {
        "tags": [
          "AISPM"
        ],
        "summary": "List the agents an issue group was found on.",
        "description": "One page of the agents affected by a group, most-affected first, each with how many of the group's issues it\r\n            carries and those issues themselves. An agent installed on several devices is one row, so the total matches the group's\r\n            `agentsCount`. A key that matches no current issue in your organization is a `404`. Authenticate with an API key.",
        "parameters": [
          {
            "name": "Source",
            "in": "query",
            "description": "Which kind of group: `Security` or `Gov`. Required.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Category",
            "in": "query",
            "description": "The security group's category (OPTIONAL for `source=Security`; rejected for `Gov`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Pattern",
            "in": "query",
            "description": "The security group's pattern/sub-category (required for `source=Security`, rejected for `Gov`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "SignalType",
            "in": "query",
            "description": "The governance signal type (required for `source=Gov`, rejected for `Security`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Reference",
            "in": "query",
            "description": "The governance group's opaque reference key (required for `source=Gov`, rejected for `Security`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "AgentIds",
            "in": "query",
            "description": "Agent ids to scope by, PRE-aggregation (combined with `agentStableIds`).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "AgentStableIds",
            "in": "query",
            "description": "Agent stable ids to scope by, PRE-aggregation (combined with `agentIds`).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "PageNumber",
            "in": "query",
            "description": "Zero-based page index. Absent or negative is treated as the first page.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "Rows per page. Defaults to 25; values above the maximum are reduced to it.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "SortBy",
            "in": "query",
            "description": "Field to sort by, case-insensitive: `IssuesCount`, `AgentDisplayName`, `Risk`,\r\n            `EndpointsCount`, `LastScannedAt`. Defaults to `IssuesCount`. An unknown value is a `400`\r\n            naming the accepted values.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "SortDirection",
            "in": "query",
            "description": "`Ascending` or `Descending` (`Asc`/`Desc` also accepted). Defaults to `Descending`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmIssueGroupAgentListResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/aispm/v2/public/issues/groups/summary/endpoints": {
      "get": {
        "tags": [
          "AISPM"
        ],
        "summary": "List the endpoints an issue group was found on.",
        "description": "One page of the devices affected by a group, most-affected first, each with how many of the group's issues sit\r\n            on it and those issues themselves. The total matches the group's `endpointsCount`. A key that matches no current\r\n            issue in your organization is a `404`. Authenticate with an API key.",
        "parameters": [
          {
            "name": "Source",
            "in": "query",
            "description": "Which kind of group: `Security` or `Gov`. Required.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Category",
            "in": "query",
            "description": "The security group's category (OPTIONAL for `source=Security`; rejected for `Gov`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Pattern",
            "in": "query",
            "description": "The security group's pattern/sub-category (required for `source=Security`, rejected for `Gov`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "SignalType",
            "in": "query",
            "description": "The governance signal type (required for `source=Gov`, rejected for `Security`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Reference",
            "in": "query",
            "description": "The governance group's opaque reference key (required for `source=Gov`, rejected for `Security`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "AgentIds",
            "in": "query",
            "description": "Agent ids to scope by, PRE-aggregation (combined with `agentStableIds`).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "AgentStableIds",
            "in": "query",
            "description": "Agent stable ids to scope by, PRE-aggregation (combined with `agentIds`).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "PageNumber",
            "in": "query",
            "description": "Zero-based page index. Absent or negative is treated as the first page.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "Rows per page. Defaults to 25; values above the maximum are reduced to it.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "SortBy",
            "in": "query",
            "description": "Field to sort by, case-insensitive: `InstancesCount`, `Hostname`, `AgentsCount`,\r\n            `LastScannedAt`. Defaults to `InstancesCount`. An unknown value is a `400` naming the accepted values.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "SortDirection",
            "in": "query",
            "description": "`Ascending` or `Descending` (`Asc`/`Desc` also accepted). Defaults to `Descending`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmIssueGroupEndpointListResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/aispm/v2/public/issues/groups/summary/instances": {
      "get": {
        "tags": [
          "AISPM"
        ],
        "summary": "List an issue group's findings.",
        "description": "One page of a group's findings, newest scan first — the full list behind a summary row's preview. Pass\r\n            `agentStableIds` for one agent, `deviceId` for one endpoint, or both for one agent on one endpoint. A key that\r\n            matches no current issue in your organization is a `404`; a device the group is not on is an empty page.\r\n            Authenticate with an API key.",
        "parameters": [
          {
            "name": "Source",
            "in": "query",
            "description": "Which kind of group: `Security` or `Gov`. Required.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Category",
            "in": "query",
            "description": "The security group's category (OPTIONAL for `source=Security`; rejected for `Gov`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Pattern",
            "in": "query",
            "description": "The security group's pattern/sub-category (required for `source=Security`, rejected for `Gov`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "SignalType",
            "in": "query",
            "description": "The governance signal type (required for `source=Gov`, rejected for `Security`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Reference",
            "in": "query",
            "description": "The governance group's opaque reference key (required for `source=Gov`, rejected for `Security`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "AgentIds",
            "in": "query",
            "description": "Agent ids to scope by, PRE-aggregation (combined with `agentStableIds`).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "AgentStableIds",
            "in": "query",
            "description": "Agent stable ids to scope by, PRE-aggregation (combined with `agentIds`).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "DeviceId",
            "in": "query",
            "description": "Only the findings on this device, by its `deviceId`. Omit for every device.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "PageNumber",
            "in": "query",
            "description": "Zero-based page index. Absent or negative is treated as the first page.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "Findings per page. Defaults to 50; values above the maximum are reduced to it.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmIssueGroupInstanceListResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/aispm/v2/public/issues/groups/detail": {
      "get": {
        "tags": [
          "AISPM"
        ],
        "summary": "Get one issue group's details.",
        "description": "One issue group addressed by its composite key — security by `source=Security&category=…&pattern=…`,\r\n            governance by `source=Gov&signalType=…&reference=…` — with its header aggregate, its per-finding\r\n            `instances` and its distinct `endpoints` (each capped, with a `*Truncated` flag). An invalid key\r\n            combination is a `400`; a key that matches no current issue in your organization is a `404`.\r\n            <br>Deprecated: use `groups/summary`, which returns the same group already grouped per agent and per endpoint,\r\n            paged rather than capped.",
        "parameters": [
          {
            "name": "Source",
            "in": "query",
            "description": "Which kind of group: `Security` or `Gov`. Required.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Category",
            "in": "query",
            "description": "The security group's category (OPTIONAL for `source=Security` — a null-Category group is keyed by pattern alone; rejected for `Gov`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Pattern",
            "in": "query",
            "description": "The security group's pattern/sub-category (required for `source=Security`, rejected for `Gov`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "SignalType",
            "in": "query",
            "description": "The governance signal type (required for `source=Gov`, rejected for `Security`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Reference",
            "in": "query",
            "description": "The governance group's opaque reference key (required for `source=Gov`, rejected for `Security`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "AgentIds",
            "in": "query",
            "description": "Agent ids to scope the detail by, PRE-aggregation (combined with `agentStableIds`) — the SAME\r\n            scope the agent-filtered list used, so the detail header cannot diverge from it (AC9). Repeat the parameter\r\n            or comma-separate values.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "AgentStableIds",
            "in": "query",
            "description": "Agent stable ids to scope the detail by, PRE-aggregation (combined with `agentIds`). Repeat the\r\n            parameter or comma-separate values.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmIssueGroupDetailResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "deprecated": true
      }
    },
    "/device-flags": {
      "get": {
        "tags": [
          "AISPM"
        ],
        "summary": "Get device flags and scan schedule",
        "description": "Called by the MineOS device agent at the start of each scan; you do not call this endpoint yourself. It is\r\ndocumented so that the traffic your devices generate is understood. The agent authenticates with the device\r\ncertificate issued at enrollment; there is no request body.\r\n            \r\nResponses:\r\n- `200` — <c>{ \"featureFlags\": { \"fleetKillSwitch\": bool, ... }, \"scanSchedule\": { \"version\", \"slotLocal\", \"windowStartLocal\",\r\n\"windowEndLocal\" } }</c>:\r\n  the feature flags in effect for this device and the local time window in which it should scan\r\n- `403` — no valid device certificate\r\n- `503` — `{ \"status\": \"degraded\" }`: the flags could not be evaluated right now; the agent falls back to its safe\r\ndefaults",
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/aispm/v1/diagnostics-package": {
      "get": {
        "tags": [
          "AISPM"
        ],
        "summary": "Get the device diagnostics tool",
        "description": "Returns a read-only script that you run by hand on one device to find out why the MineOS agent is not working there.\r\nIt changes nothing on the device and needs no credentials. Save `contents` to a file named `filename`, copy it to\r\nthe device and run it; share its output with MineOS support.\r\n            \r\n`os` is required: `macos`, `windows` or `linux`. Requires an Admin user of the organization.\r\n            \r\nResponses: `200` — the tool; `400` — `{ \"error\" }`: missing or unknown `os`;\r\n`503` — `{ \"status\": \"packaging_unavailable\", \"message\" }`: temporarily unavailable in this environment; retry later.",
        "parameters": [
          {
            "name": "os",
            "in": "query",
            "description": "The device's operating system: `macos`, `windows` or `linux`, case-sensitive.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmDiagnosticsPackageResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmUnavailableResponse"
                }
              }
            }
          }
        },
        "x-mcp-exposed": true
      }
    },
    "/enroll": {
      "post": {
        "tags": [
          "AISPM"
        ],
        "summary": "Enroll a device",
        "description": "Called by the MineOS device agent when it first runs on a device (and when it re-enrolls); you do not call this\r\nendpoint yourself. The agent presents your organization's enrollment token — the one embedded in the MDM package —\r\ntogether with a certificate signing request, and receives the device certificate it uses for all later calls.\r\n            \r\nResponses:\r\n- `201` — `{ \"certificate\", \"caChain\", \"deviceId\", \"expiresAt\" }`: the device certificate (PEM), the issuing chain, the\r\ndevice's id and the certificate expiry\r\n- `202` — `{ \"status\": \"pending\", \"retryAfter\" }`: enrollment is held for approval; the agent retries after\r\n`retryAfter` seconds\r\n- `400` — `{ \"error\" }`: the request or the certificate signing request could not be processed\r\n- `401` — `{ \"error\" }`: the enrollment token is invalid, expired or revoked (one answer for every token failure)\r\n- `403` — `{ \"reason\": \"rejected\" }`: this device has been rejected by an administrator\r\n- `429` — `{ \"reason\": \"fleet_cap_reached\" | \"waiting_room_full\", \"retryAfter\" }`: your organization's device limit is\r\nreached\r\n- `503` — `{ \"status\": \"degraded\" }`: certificate issuance is temporarily unavailable; the agent retries",
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollmentRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollmentRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollmentRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollmentRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/enroll/renew": {
      "post": {
        "tags": [
          "AISPM"
        ],
        "summary": "Renew a device certificate",
        "description": "Called by the MineOS device agent before its certificate expires; you do not call this endpoint yourself. The agent\r\nauthenticates with its current device certificate and submits a new certificate signing request for the same device id.\r\n            \r\nResponses: `201` with the same body as enrollment; `400` when the signing request cannot be processed;\r\n`403` — `{ \"reason\": \"identity_mismatch\" }` when the request is for a different device than the certificate;\r\n`403` without a valid device certificate; `503` — `{ \"status\": \"degraded\" }` when issuance is temporarily\r\nunavailable.",
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/RenewRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RenewRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RenewRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RenewRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/aispm/v1/enrollment-tokens": {
      "post": {
        "tags": [
          "AISPM"
        ],
        "summary": "Issue an enrollment token",
        "description": "Creates an additional enrollment token for your organization; existing tokens stay valid. An enrollment token is what a\r\ndevice presents when it first enrolls. In most cases you do not need this call: the MDM package generated by\r\n`POST /api/aispm/v1/mdm-package` already carries a token. Use it when you want a separate token with its own expiry.\r\n            \r\nThe token value is returned once, in this response, and cannot be retrieved again. Requires an Admin user of the organization.\r\n            \r\nResponses: `201` — the new token; `400` — `{ \"error\" }`: `validDays` out of range;\r\n`409` — `{ \"error\" }`: your organization is not yet enabled for AI-agent discovery; contact MineOS support.",
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollmentTokenRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollmentTokenRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollmentTokenRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollmentTokenRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnrollmentTokenResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/aispm/v1/enrollment-tokens/rotate": {
      "post": {
        "tags": [
          "AISPM"
        ],
        "summary": "Rotate the enrollment token",
        "description": "Issues a fresh enrollment token. Previously issued tokens stay valid until they expire or you revoke them with\r\n`DELETE /api/aispm/v1/enrollment-tokens/{tokenId}`. Same request and response as issuing a token.\r\nRequires an Admin user of the organization.",
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollmentTokenRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollmentTokenRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollmentTokenRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollmentTokenRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnrollmentTokenResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/aispm/v1/enrollment-tokens/{tokenId}": {
      "delete": {
        "tags": [
          "AISPM"
        ],
        "summary": "Revoke an enrollment token",
        "description": "Invalidates one enrollment token by its id. Devices that already enrolled with it are not affected; new devices can no\r\nlonger enroll with it. Revoking a token that is already revoked returns `200` with `status: \"alreadyRevoked\"`.\r\nRequires an Admin user of the organization.\r\n            \r\nResponses: `200` — the resulting state; `404` — `{ \"error\" }`: no such token in your organization.",
        "parameters": [
          {
            "name": "tokenId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnrollmentTokenRevocationResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/ingest": {
      "post": {
        "tags": [
          "AISPM"
        ],
        "summary": "Get a report upload URL",
        "description": "Called by the MineOS device agent after each scan to upload its report; you do not call this endpoint yourself. The agent\r\nauthenticates with its device certificate, declares the report id, and receives a short-lived URL to upload the report to.\r\nThe same call carries the device's health check-in (last run outcome, scheduled slot, agent version), which is what the\r\ndevice status endpoints show.\r\n            \r\nResponses:\r\n- `200` — `{ \"uploadUrl\", \"expiresAt\", \"requiredContentType\" }`: upload the report with an HTTP PUT to `uploadUrl`\r\nbefore `expiresAt`\r\n- `400` — `{ \"error\": \"invalid_request\", \"details\": [ ... ] }`: the request is malformed or contains unknown fields\r\n- `403` — `{ \"reason\": \"enrollment_not_active\" }`: the device is not (or no longer) an approved device\r\n- `429` — `{ \"reason\": \"quota_exceeded\" | \"rate_limited\", \"retryAfter\" }`: the device's daily report quota or your\r\norganization's rate limit is reached\r\n- `503` — `{ \"status\": \"degraded\" }`: report storage is temporarily unavailable; the agent retries",
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/AispmIngestMintRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AispmIngestMintRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AispmIngestMintRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AispmIngestMintRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/logs": {
      "post": {
        "tags": [
          "AISPM"
        ],
        "summary": "Get a log upload URL",
        "description": "Called by the MineOS device agent to upload its diagnostic log after a scan; you do not call this endpoint yourself.\r\nThe agent authenticates with its device certificate, declares the log id and compressed size, and receives a short-lived\r\nURL to upload the log to. MineOS stores the log for support purposes only.\r\n            \r\nResponses:\r\n- `200` — `{ \"uploadUrl\", \"expiresAt\", \"requiredContentType\" }`: upload the log with an HTTP PUT to `uploadUrl`\r\nbefore `expiresAt`\r\n- `400` — `{ \"error\": \"invalid_request\", \"details\": [ ... ] }`: the request is malformed or contains unknown fields\r\n- `403` — `{ \"reason\": \"enrollment_not_active\" }`: the device is not (or no longer) an approved device\r\n- `413` — `{ \"reason\": \"log_too_large\" }`: the declared size is over the limit\r\n- `429` — `{ \"reason\": \"quota_exceeded\" | \"rate_limited\", \"retryAfter\" }`: the device's daily log quota or your\r\norganization's rate limit is reached\r\n- `503` — `{ \"status\": \"degraded\" }`: log storage is temporarily unavailable; the agent retries",
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/AispmLogMintRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AispmLogMintRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AispmLogMintRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AispmLogMintRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/logs/unverified": {
      "post": {
        "tags": [
          "AISPM"
        ],
        "summary": "Report a component failure (unenrolled device)",
        "description": "Called by the MineOS device agent when it fails before it holds a device certificate — for example when the installer or\r\nthe updater cannot complete; you do not call this endpoint yourself. The agent authenticates with your organization's\r\nenrollment token and describes the failure; it may then upload a diagnostic log to the returned URL. The device identity\r\nit reports is unverified and is used only to help MineOS support investigate.\r\n            \r\nResponses:\r\n- `200` — `{ \"uploadUrl\", \"expiresAt\", \"requiredContentType\" }`\r\n- `400` — `{ \"error\": \"invalid_request\", \"details\": [ ... ] }`: the request is malformed or contains unknown fields\r\n- `401` — `{ \"reason\": \"invalid_token\" }`: the enrollment token is invalid, expired or revoked\r\n- `413` — `{ \"reason\": \"log_too_large\" }`\r\n- `429` — `{ \"reason\": \"quota_exceeded\" | \"rate_limited\", \"retryAfter\" }`\r\n- `503` — `{ \"status\": \"degraded\" }`: log storage is temporarily unavailable",
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/AispmUnverifiedLogMintRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AispmUnverifiedLogMintRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AispmUnverifiedLogMintRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AispmUnverifiedLogMintRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          }
        }
      }
    },
    "/api/aispm/v1/mdm-package": {
      "post": {
        "tags": [
          "AISPM"
        ],
        "summary": "Generate an MDM deployment package",
        "description": "Builds the deployment script that installs the MineOS AI-agent discovery scanner on your organization's devices\r\nthrough your MDM (Intune, Jamf, Kandji, or any MDM that can run a script). The script is returned in the response\r\nbody: save `contents` to a file named `filename` and upload it to your MDM.\r\n            \r\nThe package is tied to your organization by a packaging token. For every MDM except Jamf the token is embedded in\r\nthe script; for Jamf the script reads it from the policy's `$4` parameter and the token is returned separately\r\nin `token.token`. Generating again returns the same token, so a package can be regenerated at any time.\r\nThe token can be revoked with `DELETE /api/aispm/v1/mdm-package/token`.\r\n            \r\nSupported targets:\r\n- `generic` (default when `mdm` is omitted): `macos`, `windows`, `linux` — `os` is required\r\n- `intune`: `macos`, `windows` — defaults to `windows`\r\n- `jamf`: `macos`\r\n- `kandji`: `macos`\r\n            \r\nRequires an Admin user of the organization. The environment and region are taken from the API host you call;\r\nthey are not request parameters.\r\n            \r\nResponses:\r\n- `200` — the package (see the response schema)\r\n- `400` — unknown `mdm`, unknown or unsupported `os`, or a missing `os` for `generic`; `error` names\r\nthe accepted values\r\n- `403` — `reason: \"tenant_not_onboarded\"`: your organization is not yet enabled for AI-agent discovery; contact MineOS\r\nsupport\r\n- `503` — `status: \"packaging_unavailable\"`: packaging is temporarily unavailable in this environment; retry later\r\n- `500` — the package could not be generated; retry, and contact support if it persists",
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/AispmMdmPackageRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AispmMdmPackageRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AispmMdmPackageRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AispmMdmPackageRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmMdmPackageResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmNotOnboardedResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmUnavailableResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/aispm/v1/mdm-package/token": {
      "delete": {
        "tags": [
          "AISPM"
        ],
        "summary": "Revoke the packaging token",
        "description": "Invalidates your organization's current packaging token. Packages already generated with it stop enrolling new\r\ndevices; devices that are already enrolled are not affected. The next call to `POST /api/aispm/v1/mdm-package`\r\nissues a fresh token, so re-generate and re-deploy the package after revoking.\r\n            \r\nIdempotent: returns `200` with `status: \"noDesignation\"` when there was no token to revoke.\r\nRequires an Admin user of the organization.",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmMdmPackageRevokeResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/aispm/v1/uninstall-package": {
      "get": {
        "tags": [
          "AISPM"
        ],
        "summary": "Get the uninstall package",
        "description": "Returns the script that removes the MineOS agent from a device, for deployment through your MDM. Save `contents` to a\r\nfile named `filename` and upload it to your MDM the same way as the install package. The script is the same for every\r\norganization and contains no credentials.\r\n            \r\n`os` is required: `macos`, `windows` or `linux`. Requires an Admin user of the organization.\r\n            \r\nResponses: `200` — the package; `400` — `{ \"error\" }`: missing or unknown `os`;\r\n`503` — `{ \"status\": \"packaging_unavailable\", \"message\" }`: temporarily unavailable in this environment; retry later.",
        "parameters": [
          {
            "name": "os",
            "in": "query",
            "description": "The device's operating system: `macos`, `windows` or `linux`, case-sensitive.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmUninstallPackageResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AispmUnavailableResponse"
                }
              }
            }
          }
        },
        "x-mcp-exposed": true
      }
    },
    "/api/Partners/ActivateAccount": {
      "post": {
        "tags": [
          "Partners"
        ],
        "summary": "Create a new account",
        "description": "Creating an account results in an invite being sent to the email address in the request.\r\n            If the company already has an account, the request will be denied.",
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/ActivationRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ActivationRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ActivationRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ActivationRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Returns the newly created account ID",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ActivationResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request contains an invalid parameter"
          },
          "401": {
            "description": "The request is not authenticated properly"
          },
          "409": {
            "description": "The domain already has a company assigned to it"
          }
        }
      }
    },
    "/api/Partners/AccountInfo": {
      "get": {
        "tags": [
          "Partners"
        ],
        "summary": "Gets account information",
        "description": "A partner can only get information for accounts he is allowed to. Partners are automatically allowed to account created by them.",
        "parameters": [
          {
            "name": "accountId",
            "in": "query",
            "description": "The ID of the account to get information for",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Returns the information for the account",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InfoResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request contains an invalid parameter"
          },
          "401": {
            "description": "The request is not authenticated properly"
          },
          "403": {
            "description": "The partner is not authorized to access the account ID or it does not exist"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ActivationRequest": {
        "required": [
          "companyName",
          "domains",
          "userEmail"
        ],
        "type": "object",
        "properties": {
          "userEmail": {
            "minLength": 1,
            "type": "string",
            "description": "Email address of the first user to have access to the new account.\r\nthe email address provided must be a business account (not a free domain like gmail/outlook/...)",
            "example": "johndoe@acmecorp.com"
          },
          "companyName": {
            "minLength": 1,
            "type": "string",
            "description": "Name of the company for which the account is created.",
            "example": "Acme Corp"
          },
          "cmpProductId": {
            "type": "string",
            "description": "Optional: If the customer for which the account is being created has a CMP solution, insert its product ID here so it will be linked from the platform. If you are not sure the product ID of you CMP solution, reach out to us.",
            "nullable": true
          },
          "domains": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "A list of website domains that are used by the customer for which the account is being created. At least one is required."
          }
        },
        "additionalProperties": false
      },
      "ActivationResponse": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Account ID of the newly created account.",
            "nullable": true,
            "example": "8d78993b-73ac-4fa1-a3d3-a8fca7a061c7"
          }
        },
        "additionalProperties": false
      },
      "AispmAgentComponentResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The component's unique id in MineOS.",
            "format": "uuid"
          },
          "componentStableId": {
            "type": "string",
            "description": "A stable identifier derived from where the component is defined; the same component keeps it across scans.",
            "nullable": true
          },
          "kind": {
            "type": "string",
            "description": "The kind of component: `McpConnector`, `OutboundChannel`, `Skill`, `Plugin`, `Hook`,\r\n            `HookScript`, `Marketplace` or `ManagedPolicy`.",
            "nullable": true
          },
          "displayName": {
            "type": "string",
            "description": "The component's display name.",
            "nullable": true
          },
          "identifier": {
            "type": "string",
            "description": "The component's own identifier — for a connector, typically the server or package it points at.",
            "nullable": true
          },
          "transport": {
            "type": "string",
            "description": "For connectors, how the agent talks to it (for example `stdio`).",
            "nullable": true
          },
          "hasSecrets": {
            "type": "boolean",
            "description": "Whether the component's configuration references secrets such as API keys. Only this flag is stored — never the names or\r\n            values.",
            "nullable": true
          },
          "vendorId": {
            "type": "string",
            "description": "The id of the vendor the component connects to (for example `anthropic.com`); `null` when unknown.",
            "nullable": true
          },
          "vendorName": {
            "type": "string",
            "description": "The name of the product or service the component connects to; `null` when unknown.",
            "nullable": true
          },
          "agentUsage": {
            "type": "string",
            "description": "What the agent's own instructions say about this component — how to use it, or that it must not be used.",
            "nullable": true
          },
          "reachClass": {
            "type": "string",
            "description": "How far the component can reach off the device: `local`, `loopback`, `remote`,\r\n            or `unknown` when it cannot be established.",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "A short description of what the component is and does; `null` when it has not been classified.",
            "nullable": true
          },
          "category": {
            "type": "string",
            "description": "What kind of thing it is: `data-access`, `dev-tool`, `communication`, `automation`,\r\n            `infra`, `knowledge`, `security` or `other`; `null` when it has not been classified.",
            "nullable": true
          },
          "origin": {
            "type": "string",
            "description": "Who installed the component: `org` (pushed by the organisation), `user` (this\r\n            person's profile), `repo` (the project), or `unknown`.",
            "nullable": true
          },
          "parentPlugin": {
            "$ref": "#/components/schemas/AispmComponentParentPluginResponse"
          },
          "vendor": {
            "$ref": "#/components/schemas/AispmComponentVendorResponse"
          },
          "flags": {
            "$ref": "#/components/schemas/AispmComponentFlagsResponse"
          },
          "firstDetectedAt": {
            "type": "string",
            "description": "When the component was first seen (UTC).",
            "format": "date-time"
          },
          "lastDetectedAt": {
            "type": "string",
            "description": "When the component was last seen (UTC).",
            "format": "date-time"
          },
          "isCurrent": {
            "type": "boolean",
            "description": "Whether the component was still attached to this agent as of its last sighting — not whether the device's latest scan still found it.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One component of an agent: an MCP connector, an outbound channel (for example a messaging integration) or a skill."
      },
      "AispmAgentDetailResponse": {
        "type": "object",
        "properties": {
          "agent": {
            "$ref": "#/components/schemas/AispmAgentListItemResponse"
          },
          "components": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmAgentComponentResponse"
            },
            "description": "All of the agent's components, unpaged.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "An agent with all of its components."
      },
      "AispmAgentIssueGroupListResponse": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "description": "The number of groups for the agent.",
            "format": "int32"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmAgentIssueGroupResponse"
            },
            "description": "The groups.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One page of a single agent's issue groups (list only; no drill-down)."
      },
      "AispmAgentIssueGroupResponse": {
        "type": "object",
        "properties": {
          "source": {
            "type": "string",
            "description": "The kind of issue: `Security` or `Gov`.",
            "nullable": true
          },
          "category": {
            "type": "string",
            "description": "The group's category; `null` when unknown.",
            "nullable": true
          },
          "pattern": {
            "type": "string",
            "description": "The security group's pattern (sub-category); `null` for a governance group.",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "The catalog description for a security group, or the signal's Explanation message for a governance group.",
            "nullable": true
          },
          "signalType": {
            "type": "string",
            "description": "The governance signal type; `null` for a security group.",
            "nullable": true
          },
          "reference": {
            "type": "string",
            "description": "The governance group's opaque reference key; `null` for a security group.",
            "nullable": true
          },
          "entity": {
            "type": "string",
            "description": "The governance group's display entity (component, vendor, or raw reference); `null` for a security group.",
            "nullable": true
          },
          "riskLevel": {
            "type": "string",
            "description": "The group's worst risk level (`VeryLow` to `VeryHigh`); `null` when no instance was evaluated.",
            "nullable": true
          },
          "riskScore": {
            "type": "integer",
            "description": "The group's worst risk score — higher is worse (display-only, not cross-source comparable); `null` when none.",
            "format": "int32",
            "nullable": true
          },
          "totalInstances": {
            "type": "integer",
            "description": "How many findings the group contains.",
            "format": "int32"
          },
          "endpointsCount": {
            "type": "integer",
            "description": "How many distinct endpoints (devices) the agent's stable id spans in this group.",
            "format": "int32"
          },
          "firstDiscoveredAt": {
            "type": "string",
            "description": "When the group's earliest finding was first discovered (UTC).",
            "format": "date-time"
          },
          "lastScannedAt": {
            "type": "string",
            "description": "When the group was last scanned (UTC) — the most recent scan across the agent's devices.",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "One group of a single agent's current issues of one type, aggregated fleet-wide over the agent's devices."
      },
      "AispmAgentListItemResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The agent's unique id in MineOS. Use it with the agent detail, vulnerabilities and signals endpoints.",
            "format": "uuid"
          },
          "agentStableId": {
            "type": "string",
            "description": "A stable identifier derived from where the agent is defined; the same agent keeps it across scans.",
            "nullable": true
          },
          "displayName": {
            "type": "string",
            "description": "The agent's display name; `null` for a tool's built-in default agent — fall back to `agentStableId`.",
            "nullable": true
          },
          "finder": {
            "type": "string",
            "description": "The AI tool the agent runs in (for example `claude-code`, `codex`, `claude-desktop`, `chatgpt-desktop`,\r\n            `cursor`).",
            "nullable": true
          },
          "harnessDisplayName": {
            "type": "string",
            "description": "The AI tool's display name (for example `Claude Code`); `null` when the finder has no seeded harness — fall back to `finder`.",
            "nullable": true
          },
          "harnessVendorId": {
            "$ref": "#/components/schemas/AispmAgentVendorResponse"
          },
          "componentsVendors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmAgentVendorResponse"
            },
            "description": "The distinct vendors the agent's components connect to. Present on the list only; `[]` when none could be identified\r\n            (see `componentCount` for how many components exist).",
            "nullable": true
          },
          "endpoint": {
            "type": "string",
            "description": "The id of the device the agent runs on — the `deviceId` of the devices endpoints.",
            "nullable": true
          },
          "hostname": {
            "type": "string",
            "description": "The device's hostname; `null` when not yet reported — fall back to `endpoint`.",
            "nullable": true
          },
          "osPlatform": {
            "type": "string",
            "description": "The device's operating system: `Windows`, `macOS` or `Linux`; `null` when not yet reported.",
            "nullable": true
          },
          "osVersion": {
            "type": "string",
            "description": "The device's OS version as reported (for example `11`); `null` when not yet reported.",
            "nullable": true
          },
          "osArch": {
            "type": "string",
            "description": "The device's CPU architecture as reported (for example `x64`); `null` when not yet reported.",
            "nullable": true
          },
          "deviceUsers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The people's local user account names on the device, sorted; `[]` when none. Service accounts are not\r\nlisted. The same for every agent on the device.",
            "nullable": true
          },
          "owningUsers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The people's local user accounts that own this agent, sorted; `[]` when the scan named none, and when\r\nit named only service accounts.",
            "nullable": true
          },
          "declaredModel": {
            "type": "string",
            "description": "The AI model the agent's definition declares, if any.",
            "nullable": true
          },
          "directoryPath": {
            "type": "string",
            "description": "The directory on the device where the agent is defined; `null` until reported.",
            "nullable": true
          },
          "definitionSummary": {
            "type": "string",
            "description": "A short summary of what the agent is set up to do; `null` when not yet produced.",
            "nullable": true
          },
          "definitionExcerpt": {
            "type": "string",
            "description": "The beginning of the agent's definition text, with secrets and personal data removed. Detail response only; `null`\r\n            when the agent has no definition text.",
            "nullable": true
          },
          "componentCount": {
            "type": "integer",
            "description": "How many components (connectors, channels, skills) the agent has.",
            "format": "int32"
          },
          "occurrenceCount": {
            "type": "integer",
            "description": "In how many places on the device this same agent was found (for example several clones of one repository). Always at least\r\n            1.",
            "format": "int32"
          },
          "divergentOccurrenceCount": {
            "type": "integer",
            "description": "How many of those places hold a copy that differs from the agent's current definition. 0 while every copy agrees.",
            "format": "int32"
          },
          "firstDetectedAt": {
            "type": "string",
            "description": "When the agent was first seen (UTC).",
            "format": "date-time"
          },
          "lastDetectedAt": {
            "type": "string",
            "description": "When the agent was last seen (UTC).",
            "format": "date-time"
          },
          "riskScore": {
            "type": "integer",
            "description": "The agent's overall risk score — higher is worse; derived from its worst finding's band; `null` when it has no findings.",
            "format": "int32",
            "nullable": true
          },
          "riskLevel": {
            "type": "string",
            "description": "The agent's overall risk level — its worst finding's band: `Low`, `Medium`, `High` or\r\n            `VeryHigh`; `null` when it has no findings.",
            "nullable": true
          },
          "governanceRiskScore": {
            "type": "integer",
            "description": "The agent's raw governance score — higher is better (posture); `null` until analysed.",
            "format": "int32",
            "nullable": true
          },
          "securityPostureScore": {
            "type": "integer",
            "description": "The agent's security-posture score (higher is better); `null` until analysed.",
            "format": "int32",
            "nullable": true
          },
          "isNew": {
            "type": "boolean",
            "description": "Whether the agent was discovered recently."
          },
          "isCurrent": {
            "type": "boolean",
            "description": "Whether the agent was reported by its AI tool's most recent scan on this device; `null` when there is nothing to compare against.",
            "nullable": true
          },
          "businessPurpose": {
            "type": "string",
            "description": "The business purpose MineOS determined for the agent, as a display name; `null` until determined.",
            "nullable": true
          },
          "isBusinessPurposeCurrent": {
            "type": "boolean",
            "description": "Whether `businessPurpose` was confirmed by the latest governance analysis; `null` when this cannot be\r\n            determined.",
            "nullable": true
          },
          "businessPurposeAssessmentId": {
            "type": "integer",
            "description": "The id of the MineOS assessment (processing activity) that covers this agent's business purpose; `null` when none\r\n            matches.",
            "format": "int32",
            "nullable": true
          },
          "businessPurposeExplanation": {
            "type": "string",
            "description": "Why MineOS assigned this business purpose. Detail response only; `null` when no purpose has been determined.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One AI agent found on one device."
      },
      "AispmAgentListResponse": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "description": "The number of agents matching the filters, across all pages.",
            "format": "int32"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmAgentListItemResponse"
            },
            "description": "The agents on this page.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One page of agents."
      },
      "AispmAgentSignalListResponse": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "description": "The number of signals, across all pages.",
            "format": "int32"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmAgentSignalResponse"
            },
            "description": "The signals on this page.",
            "nullable": true
          },
          "governanceRiskScore": {
            "type": "integer",
            "description": "The agent's governance score from its latest completed analysis — higher is better (posture); `null` when none has completed.",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One page of an agent's governance signals."
      },
      "AispmAgentSignalResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The signal's unique id in MineOS.",
            "format": "uuid"
          },
          "signalType": {
            "type": "string",
            "description": "The type of signal.",
            "nullable": true
          },
          "severity": {
            "type": "string",
            "description": "The signal's severity. Governance signals use their own scale, distinct from the agent's five-level risk level.",
            "nullable": true
          },
          "scoreContribution": {
            "type": "integer",
            "description": "How much the signal adds to the agent's governance risk score.",
            "format": "int32"
          },
          "reference": {
            "type": "string",
            "description": "A reference to what the signal is about.",
            "nullable": true
          },
          "assessmentId": {
            "type": "integer",
            "description": "The id of the related MineOS assessment, if any.",
            "format": "int32",
            "nullable": true
          },
          "explanation": {
            "type": "string",
            "description": "An explanation of the signal.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One governance signal on an agent: an observation about its purpose, data use or oversight."
      },
      "AispmAgentVendorResponse": {
        "type": "object",
        "properties": {
          "vendorId": {
            "type": "string",
            "description": "The vendor's id, a domain-style key (for example `anthropic.com`).",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "The vendor's display name (for example `Anthropic`); `null` when MineOS has no name for this id.",
            "nullable": true
          },
          "iconUrl": {
            "type": "string",
            "description": "URL of the vendor's icon; `null` when none is known.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "A vendor: the company behind an AI tool or service."
      },
      "AispmAgentVulnerabilityListResponse": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "description": "The number of findings, across all pages.",
            "format": "int32"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmAgentVulnerabilityResponse"
            },
            "description": "The findings on this page.",
            "nullable": true
          },
          "securityPostureScore": {
            "type": "integer",
            "description": "The agent's security-posture score from the analysis these findings belong to (higher is better); `null` when the\r\n            agent has never been analysed.",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One page of an agent's security findings."
      },
      "AispmAgentVulnerabilityResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The finding's unique id in MineOS.",
            "format": "uuid"
          },
          "ruleId": {
            "type": "string",
            "description": "The id of the detection rule that produced the finding.",
            "nullable": true
          },
          "category": {
            "type": "string",
            "description": "The finding's category.",
            "nullable": true
          },
          "subCategory": {
            "type": "string",
            "description": "The finding's sub-category — the first half of `title`.",
            "nullable": true
          },
          "componentName": {
            "type": "string",
            "description": "The component the finding is on; `null` when it applies to the agent as a whole.",
            "nullable": true
          },
          "title": {
            "type": "string",
            "description": "The finding's title: sub-category and component, for example \"Tool Parameter Abuse - MyToolName\".",
            "nullable": true
          },
          "skillStableId": {
            "type": "string",
            "description": "The stable identifier of the skill the finding is on, if any.",
            "nullable": true
          },
          "severity": {
            "type": "string",
            "description": "The finding's severity.",
            "nullable": true
          },
          "occurrenceCount": {
            "type": "integer",
            "description": "How many times the finding occurs.",
            "format": "int32"
          },
          "confidence": {
            "type": "number",
            "description": "How confident the analysis is in the finding, from 0 to 1; `null` when not scored.",
            "format": "float",
            "nullable": true
          },
          "skillRiskScore": {
            "type": "integer",
            "description": "The risk score of the skill the finding is on — higher means more risk (the opposite direction of\r\n            `securityPostureScore`). `null` when the skill was not scored.",
            "format": "int32",
            "nullable": true
          },
          "firstDetectedAt": {
            "type": "string",
            "description": "When the finding was first seen (UTC).",
            "format": "date-time"
          },
          "lastDetectedAt": {
            "type": "string",
            "description": "When the finding was last seen (UTC).",
            "format": "date-time"
          },
          "isCurrent": {
            "type": "boolean",
            "description": "Whether the finding is still present in the latest analysis; `null` when the agent has not been analysed\r\n            since.",
            "nullable": true
          },
          "explanation": {
            "type": "string",
            "description": "What the finding is and why it matters.",
            "nullable": true
          },
          "remediation": {
            "type": "string",
            "description": "How to fix it.",
            "nullable": true
          },
          "locationFile": {
            "type": "string",
            "description": "The file on the device where the finding was detected, if applicable.",
            "nullable": true
          },
          "attackSurfaceTags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Tags describing the attack surface the finding relates to.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One security finding on an agent."
      },
      "AispmComponentFlagsResponse": {
        "type": "object",
        "properties": {
          "hasSecrets": {
            "type": "boolean",
            "description": "Whether the component's configuration references secrets such as API keys. Only this flag is\r\n            stored — never the names or values.",
            "nullable": true
          },
          "vulnerabilityCount": {
            "type": "integer",
            "description": "How many vulnerability findings name this component.",
            "format": "int32"
          },
          "dormantHookScript": {
            "type": "boolean",
            "description": "Whether this is an executable a hook could run that no hook currently references."
          },
          "disabledPlugin": {
            "type": "boolean",
            "description": "Whether this is a plugin the AI tool has switched off. `false` also when the tool does not\r\n            report the setting."
          }
        },
        "additionalProperties": false,
        "description": "Risk signals about one component."
      },
      "AispmComponentParentPluginResponse": {
        "type": "object",
        "properties": {
          "stableId": {
            "type": "string",
            "description": "A stable identifier derived from where the plugin is defined; the same plugin keeps it across scans.",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "The plugin's display name; `null` when the plugin is no longer reported, in which case\r\n            callers show `stableId`.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "The plugin a component was shipped by."
      },
      "AispmComponentVendorResponse": {
        "type": "object",
        "properties": {
          "serviceId": {
            "type": "string",
            "description": "The id of the vendor the component connects to, for example `anthropic.com`.",
            "nullable": true
          },
          "approvalStatus": {
            "type": "string",
            "description": "Whether your inventory approves this vendor: `approved`, `unapproved` or `not-in-inventory`; `null` when it could not be read.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AispmDeviceStatusListResponse": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "description": "The number of devices matching the filters, across all pages.",
            "format": "int32"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmDeviceStatusResponse"
            },
            "description": "The devices on this page.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One page of devices."
      },
      "AispmDeviceStatusResponse": {
        "type": "object",
        "properties": {
          "deviceId": {
            "type": "string",
            "description": "The device's identifier, as reported by the MineOS agent on the device.",
            "nullable": true
          },
          "state": {
            "type": "string",
            "description": "The device's enrollment state: `Pending`, `Approved`, `Rejected`, `PendingExpired` or\r\n            `Offboarded`.",
            "nullable": true
          },
          "lastCheckInAt": {
            "type": "string",
            "description": "When the device last contacted MineOS (UTC).",
            "format": "date-time",
            "nullable": true
          },
          "reportingStatus": {
            "type": "string",
            "description": "Whether the device is checking in: `Reporting`, `Stopped` (no check-in for longer than expected)\r\n            or `NeverCheckedIn`.",
            "nullable": true
          },
          "lastBootstrapOutcome": {
            "type": "string",
            "description": "The outcome of the agent's last run, as reported by the device.",
            "nullable": true
          },
          "lastBootstrapRunAt": {
            "type": "string",
            "description": "When the agent last ran, by the device's clock (UTC).",
            "format": "date-time",
            "nullable": true
          },
          "tamperStatus": {
            "type": "string",
            "description": "Whether the agent's files on the device passed their integrity check: `Unknown`, `Clean` or\r\n            `Tampered`.",
            "nullable": true
          },
          "schedulerSlot": {
            "type": "string",
            "description": "The daily scan time the device's scheduler is confirmed to run, in device-local `HH:MM`.",
            "nullable": true
          },
          "schedulerSlotPending": {
            "type": "string",
            "description": "A scan time assigned to the device but not yet applied: `HH:MM`, or `unknown`.",
            "nullable": true
          },
          "schedulerSlotPendingCycles": {
            "type": "integer",
            "description": "How many scheduled runs the pending scan time has been waiting: `1` means it is being\r\n            applied, `2` or more means the change is not taking effect.",
            "format": "int32",
            "nullable": true
          },
          "deviceIdSource": {
            "type": "string",
            "description": "Which operating-system identifier the device derived its device id from.",
            "nullable": true
          },
          "bootstrapVersion": {
            "type": "string",
            "description": "The version of the MineOS agent running on the device.",
            "nullable": true
          },
          "platform": {
            "type": "string",
            "description": "The device's operating system: `macos`, `windows` or `linux`.",
            "nullable": true
          },
          "osVersion": {
            "type": "string",
            "description": "The operating-system version, as reported.",
            "nullable": true
          },
          "osArch": {
            "type": "string",
            "description": "The CPU architecture, as reported (for example `arm64`, `x86_64`).",
            "nullable": true
          },
          "hostname": {
            "type": "string",
            "description": "The device's hostname, as reported.",
            "nullable": true
          },
          "users": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The people's local user account names on the device, sorted. Service accounts are not\r\n            listed. Empty when none were reported.",
            "nullable": true
          },
          "connectedAgentsCount": {
            "type": "integer",
            "description": "How many AI agents are currently present on the device. Agents that were\r\n            seen previously but are no longer reported by the device are excluded.",
            "format": "int32"
          },
          "connectedVendorsCount": {
            "type": "integer",
            "description": "How many distinct vendors the device's agents connect to.",
            "format": "int32"
          },
          "reHomedAt": {
            "type": "string",
            "description": "When this device moved to your organization from another one. Absent if it\r\n            enrolled here directly.",
            "format": "date-time",
            "nullable": true
          },
          "reHomedFrom": {
            "type": "string",
            "description": "The service endpoint the device was enrolled against before it moved. Absent if\r\n            it enrolled here directly, or if the device reported a value that is not a usable endpoint.",
            "nullable": true
          },
          "enrolledAt": {
            "type": "string",
            "description": "When the device enrolled in your organization (UTC).",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "description": "When the device's record was last updated (UTC).",
            "format": "date-time"
          },
          "riskLevel": {
            "type": "string",
            "description": "The device's risk — its highest-risk agent's level: `Low`, `Medium`, `High` or\r\n            `VeryHigh`; `null` when no agent on the device has any findings.",
            "nullable": true
          },
          "riskScore": {
            "type": "integer",
            "description": "The device's risk score, derived from `riskLevel`; `null` when it has no findings.",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AispmDiagnosticsPackageResponse": {
        "type": "object",
        "properties": {
          "filename": {
            "type": "string",
            "description": "The file name to save `contents` as.",
            "nullable": true
          },
          "os": {
            "type": "string",
            "description": "The operating system the tool is for: `macos`, `windows` or `linux`.",
            "nullable": true
          },
          "environment": {
            "type": "string",
            "description": "The MineOS environment the tool reports against, derived from the API host you called.",
            "nullable": true
          },
          "contents": {
            "type": "string",
            "description": "The script to run on the device. It is the same for every organization and contains no credentials.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "The diagnostics tool. Save `contents` to a file named `filename` and run it on the device."
      },
      "AispmErrorResponse": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string",
            "description": "What was wrong. For `400` it names the accepted values for the rejected field.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Error body for `400`, `404`, `409` and `500` responses across the AISPM endpoints."
      },
      "AispmIngestMintRequest": {
        "type": "object",
        "properties": {
          "reportId": {
            "type": "string",
            "description": "The report identifier, `YYYYMMDDTHHMMSSZ-<uuid>`. Repeating a report id returns a URL for the same\r\n            report.",
            "nullable": true
          },
          "lastBootstrapOutcome": {
            "type": "string",
            "description": "Optional. The outcome of the agent's last run, as the agent reports it.",
            "nullable": true
          },
          "lastCacheStatus": {
            "type": "string",
            "description": "Optional. Whether the agent's local cache passed its integrity check on the last run.",
            "nullable": true
          },
          "lastRunAt": {
            "type": "string",
            "description": "Optional. When the last run happened, by the device's clock (ISO 8601, UTC).",
            "nullable": true
          },
          "schedulerSlot": {
            "type": "string",
            "description": "Optional. The daily scan time the device's scheduler is confirmed to run, in device-local `HH:MM`.",
            "nullable": true
          },
          "schedulerSlotPending": {
            "type": "string",
            "description": "Optional. A scan time that has been assigned but not yet applied on the device: `HH:MM` or `unknown`.",
            "nullable": true
          },
          "schedulerSlotPendingCycles": {
            "type": "string",
            "description": "Optional. How many scheduled runs the pending scan time has been waiting, as a string.",
            "nullable": true
          },
          "bootstrapVersion": {
            "type": "string",
            "description": "Optional. The version of the agent that is running.",
            "nullable": true
          },
          "reHomedAt": {
            "type": "string",
            "description": "Optional. When this device moved to this organization from another one, as the agent reports it (ISO 8601, UTC).",
            "nullable": true
          },
          "reHomedFrom": {
            "type": "string",
            "description": "Optional. The service endpoint the device was previously enrolled against, as `scheme://host`.",
            "nullable": true
          }
        },
        "additionalProperties": {
          "type": "object"
        },
        "description": "Report upload request sent by the device agent: the report id plus the device's health check-in."
      },
      "AispmIssueGroupAgentListResponse": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "description": "How many agents the group spans in total, across all pages — the same number as the header's `agentsCount`.",
            "format": "int32"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmIssueGroupSummaryAgentResponse"
            },
            "description": "The agents on this page.",
            "nullable": true
          },
          "budgetExceeded": {
            "type": "boolean",
            "description": "True when at least one row's `instances` on this page is a preview (see its `instancesTruncated`)."
          }
        },
        "additionalProperties": false,
        "description": "One page of the agents affected by an issue group."
      },
      "AispmIssueGroupDetailResponse": {
        "type": "object",
        "properties": {
          "header": {
            "$ref": "#/components/schemas/AispmIssueGroupResponse"
          },
          "instances": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmIssueGroupInstanceResponse"
            },
            "description": "The findings in this group (grain = `header.totalInstances`), capped; see Mine.Portal.Module.Aispm.Api.Portal.Contracts.AispmIssueGroupDetailResponse.InstancesTruncated.",
            "nullable": true
          },
          "instancesTruncated": {
            "type": "boolean",
            "description": "True when there are more findings than the cap and Mine.Portal.Module.Aispm.Api.Portal.Contracts.AispmIssueGroupDetailResponse.Instances is a bounded slice."
          },
          "endpoints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmIssueGroupEndpointResponse"
            },
            "description": "The distinct devices this group appears on, capped; see Mine.Portal.Module.Aispm.Api.Portal.Contracts.AispmIssueGroupDetailResponse.EndpointsTruncated.",
            "nullable": true
          },
          "endpointsTruncated": {
            "type": "boolean",
            "description": "True when there are more distinct devices than the cap and Mine.Portal.Module.Aispm.Api.Portal.Contracts.AispmIssueGroupDetailResponse.Endpoints is a bounded slice."
          }
        },
        "additionalProperties": false,
        "description": "One issue group's detail: its header aggregate, its capped per-finding instances and its capped distinct endpoints."
      },
      "AispmIssueGroupEndpointAgentResponse": {
        "type": "object",
        "properties": {
          "agentId": {
            "type": "string",
            "description": "The agent row id.",
            "format": "uuid"
          },
          "agentStableId": {
            "type": "string",
            "description": "The agent's stable id.",
            "nullable": true
          },
          "agentDisplayName": {
            "type": "string",
            "description": "The agent's display name.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One agent carrying a group's findings on a device."
      },
      "AispmIssueGroupEndpointListResponse": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "description": "How many devices the group spans in total, across all pages — the same number as the header's `endpointsCount`.",
            "format": "int32"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmIssueGroupSummaryEndpointResponse"
            },
            "description": "The devices on this page.",
            "nullable": true
          },
          "budgetExceeded": {
            "type": "boolean",
            "description": "True when at least one row's `instances` on this page is a preview (see its `instancesTruncated`)."
          }
        },
        "additionalProperties": false,
        "description": "One page of the devices affected by an issue group."
      },
      "AispmIssueGroupEndpointResponse": {
        "type": "object",
        "properties": {
          "deviceId": {
            "type": "string",
            "description": "The device id.",
            "nullable": true
          },
          "hostname": {
            "type": "string",
            "description": "The device's readable hostname; `null` until reported.",
            "nullable": true
          },
          "osPlatform": {
            "type": "string",
            "description": "The device's operating system, e.g. `macOS`; `null` until reported.",
            "nullable": true
          },
          "osVersion": {
            "type": "string",
            "description": "The device's operating-system version; `null` until reported.",
            "nullable": true
          },
          "osArch": {
            "type": "string",
            "description": "The device's CPU architecture; `null` until reported.",
            "nullable": true
          },
          "deviceUsers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The people's local account names on the device; empty when none were reported, and when every account\r\non it is a service account.",
            "nullable": true
          },
          "instancesCount": {
            "type": "integer",
            "description": "How many of the group's findings are on this device.",
            "format": "int32"
          },
          "agents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmIssueGroupEndpointAgentResponse"
            },
            "description": "The distinct agents carrying the group's findings on this device.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One device a group appears on."
      },
      "AispmIssueGroupInstanceListResponse": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "description": "How many findings match the group, agent and device filters, across all pages.",
            "format": "int32"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmIssueGroupInstanceResponse"
            },
            "description": "The findings on this page.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One page of an issue group's findings, newest scan first."
      },
      "AispmIssueGroupInstanceResponse": {
        "type": "object",
        "properties": {
          "agentId": {
            "type": "string",
            "description": "The agent row id.",
            "format": "uuid"
          },
          "agentStableId": {
            "type": "string",
            "description": "The agent's stable id.",
            "nullable": true
          },
          "agentDisplayName": {
            "type": "string",
            "description": "The agent's display name.",
            "nullable": true
          },
          "deviceId": {
            "type": "string",
            "description": "The id of the device this finding sits on.",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "What the finding is and why it matters (the audited explanation).",
            "nullable": true
          },
          "confidence": {
            "type": "number",
            "description": "The analyzer/resolution confidence; `null` when none was emitted.",
            "format": "float",
            "nullable": true
          },
          "firstDiscoveredAt": {
            "type": "string",
            "description": "When the finding was first discovered.",
            "format": "date-time"
          },
          "lastScannedAt": {
            "type": "string",
            "description": "When the finding was last confirmed by a scan.",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "One finding in a group."
      },
      "AispmIssueGroupListResponse": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "description": "The number of groups matching the filters, across all pages.",
            "format": "int32"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmIssueGroupResponse"
            },
            "description": "The groups on this page.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One page of issue groups."
      },
      "AispmIssueGroupResponse": {
        "type": "object",
        "properties": {
          "source": {
            "type": "string",
            "description": "The kind of issue: `Security` or `Gov`.",
            "nullable": true
          },
          "category": {
            "type": "string",
            "description": "The group's category; `null` when unknown.",
            "nullable": true
          },
          "pattern": {
            "type": "string",
            "description": "The security group's pattern (sub-category); `null` for a governance group.",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "The catalog description for a security group, or the signal's Explanation message for a governance group.",
            "nullable": true
          },
          "signalType": {
            "type": "string",
            "description": "The governance signal type; `null` for a security group.",
            "nullable": true
          },
          "reference": {
            "type": "string",
            "description": "The governance group's opaque reference key; `null` for a security group.",
            "nullable": true
          },
          "entity": {
            "type": "string",
            "description": "The governance group's display entity (component, vendor, or raw reference); `null` for a security group.",
            "nullable": true
          },
          "riskLevel": {
            "type": "string",
            "description": "The group's worst risk level (`VeryLow` to `VeryHigh`); `null` when no instance was evaluated.",
            "nullable": true
          },
          "riskScore": {
            "type": "integer",
            "description": "The group's worst risk score — higher is worse (display-only, not cross-source comparable); `null` when none.",
            "format": "int32",
            "nullable": true
          },
          "totalInstances": {
            "type": "integer",
            "description": "How many findings the group contains.",
            "format": "int32"
          },
          "agentsCount": {
            "type": "integer",
            "description": "How many distinct agents the group spans.",
            "format": "int32"
          },
          "endpointsCount": {
            "type": "integer",
            "description": "How many distinct endpoints (devices) the group spans.",
            "format": "int32"
          },
          "firstDiscoveredAt": {
            "type": "string",
            "description": "When the group's earliest finding was first discovered (UTC).",
            "format": "date-time"
          },
          "lastScannedAt": {
            "type": "string",
            "description": "When the group was last scanned (UTC) — the most recent scan across its agents.",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "One group of current issues of a single type, with its aggregated risk and its distinct-entity counts."
      },
      "AispmIssueGroupSummaryAgentResponse": {
        "type": "object",
        "properties": {
          "agentStableId": {
            "type": "string",
            "description": "The agent's stable identifier — the row's identity.",
            "nullable": true
          },
          "agentId": {
            "type": "string",
            "description": "One of the agent's row ids, for use with the agents endpoints; `null` when there is none. A link target, not an identity — an agent spans one id per device.",
            "format": "uuid",
            "nullable": true
          },
          "agentDisplayName": {
            "type": "string",
            "description": "The agent's display name; `null` for a tool's built-in default agent — fall back to `agentStableId`.",
            "nullable": true
          },
          "issuesCount": {
            "type": "integer",
            "description": "How many of the group's findings are on this agent, across all of its devices.",
            "format": "int32"
          },
          "endpointsCount": {
            "type": "integer",
            "description": "How many distinct devices this agent has the group on.",
            "format": "int32"
          },
          "riskLevel": {
            "type": "string",
            "description": "The agent's worst risk level within this group (`VeryLow` to `VeryHigh`); `null` when none of its findings was evaluated.",
            "nullable": true
          },
          "riskScore": {
            "type": "integer",
            "description": "The agent's worst risk score within this group — higher is worse (display-only); `null` when none.",
            "format": "int32",
            "nullable": true
          },
          "firstDiscoveredAt": {
            "type": "string",
            "description": "When the group was first discovered on this agent.",
            "format": "date-time"
          },
          "lastScannedAt": {
            "type": "string",
            "description": "When the group was last confirmed on this agent by a scan.",
            "format": "date-time"
          },
          "instances": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmIssueGroupInstanceResponse"
            },
            "description": "A preview of this agent's findings in the group, newest first. Page through all of them with\r\n            `groups/summary/instances`.",
            "nullable": true
          },
          "instancesTruncated": {
            "type": "boolean",
            "description": "True when `instances` holds fewer findings than `issuesCount`."
          }
        },
        "additionalProperties": false,
        "description": "One agent affected by an issue group, with the group's findings on it."
      },
      "AispmIssueGroupSummaryEndpointResponse": {
        "type": "object",
        "properties": {
          "deviceId": {
            "type": "string",
            "description": "The device id.",
            "nullable": true
          },
          "hostname": {
            "type": "string",
            "description": "The device's readable hostname; `null` until reported.",
            "nullable": true
          },
          "osPlatform": {
            "type": "string",
            "description": "The device's operating system, e.g. `macOS`; `null` until reported.",
            "nullable": true
          },
          "osVersion": {
            "type": "string",
            "description": "The device's operating-system version; `null` until reported.",
            "nullable": true
          },
          "osArch": {
            "type": "string",
            "description": "The device's CPU architecture; `null` until reported.",
            "nullable": true
          },
          "deviceUsers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The people's local account names on the device; empty when none were reported, and when every account on it is a service account.",
            "nullable": true
          },
          "instancesCount": {
            "type": "integer",
            "description": "How many of the group's findings are on this device.",
            "format": "int32"
          },
          "agentsCount": {
            "type": "integer",
            "description": "How many distinct agents carry the group's findings on this device.",
            "format": "int32"
          },
          "firstDiscoveredAt": {
            "type": "string",
            "description": "When the group was first discovered on this device.",
            "format": "date-time"
          },
          "lastScannedAt": {
            "type": "string",
            "description": "When the group was last confirmed on this device by a scan.",
            "format": "date-time"
          },
          "instances": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmIssueGroupInstanceResponse"
            },
            "description": "A preview of this device's findings in the group, newest first. Page through all of them with\r\n            `groups/summary/instances`.",
            "nullable": true
          },
          "instancesTruncated": {
            "type": "boolean",
            "description": "True when `instances` holds fewer findings than `instancesCount`."
          }
        },
        "additionalProperties": false,
        "description": "One device affected by an issue group, with the group's findings on it."
      },
      "AispmIssueGroupSummaryResponse": {
        "type": "object",
        "properties": {
          "header": {
            "$ref": "#/components/schemas/AispmIssueGroupResponse"
          },
          "agents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmIssueGroupSummaryAgentResponse"
            },
            "description": "The agents this group was found on, one row per agent, most-affected first.",
            "nullable": true
          },
          "agentsBudgetExceeded": {
            "type": "boolean",
            "description": "True when at least one agent row's `instances` is a preview (see its `instancesTruncated`)."
          },
          "endpoints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AispmIssueGroupSummaryEndpointResponse"
            },
            "description": "The devices this group was found on, one row per device, most-affected first.",
            "nullable": true
          },
          "endpointsBudgetExceeded": {
            "type": "boolean",
            "description": "True when at least one endpoint row's `instances` is a preview (see its `instancesTruncated`)."
          }
        },
        "additionalProperties": false,
        "description": "One issue group, structured: its header aggregate plus the first page of its affected agents and of its affected endpoints."
      },
      "AispmLogMintRequest": {
        "type": "object",
        "properties": {
          "logId": {
            "type": "string",
            "description": "The log identifier, `YYYYMMDDTHHMMSSZ-<uuid>`, one per agent run. Repeating a log id returns a URL for the same\r\n            log.",
            "nullable": true
          },
          "sizeBytes": {
            "type": "integer",
            "description": "The compressed size in bytes of the log to be uploaded. Required; a size over the limit is answered with\r\n            `413`.",
            "format": "int64",
            "nullable": true
          },
          "source": {
            "type": "string",
            "description": "The component reporting the log. Only `scanner` is accepted here; installer and updater failures go through <c>POST\r\n            /logs/unverified</c>.",
            "nullable": true
          }
        },
        "additionalProperties": {
          "type": "object"
        },
        "description": "Log upload request sent by the device agent."
      },
      "AispmMdmPackageRequest": {
        "type": "object",
        "properties": {
          "mdm": {
            "type": "string",
            "description": "The MDM to package for: `generic`, `intune`, `jamf`, or `kandji`, case-sensitive. Omitted means\r\n            `generic`. Any other value is rejected with `400`.",
            "nullable": true
          },
          "os": {
            "type": "string",
            "description": "The target operating system: `macos`, `windows`, or `linux`, case-sensitive. Required for\r\n            `generic`; for a named MDM it defaults to that MDM's default (`intune`: `windows`; `jamf` and\r\n            `kandji`: `macos`). A pair the MDM does not support is rejected with `400`.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "The deployment target. Your organization and the environment are derived from the call, not from the body."
      },
      "AispmMdmPackageResponse": {
        "type": "object",
        "properties": {
          "filename": {
            "type": "string",
            "description": "The file name to save `contents` as. It carries the script type, and the target OS unless the package kind has\r\n            only one (a Jamf package is always macOS).",
            "nullable": true
          },
          "mdm": {
            "type": "string",
            "description": "The MDM the package was generated for; `generic` when the request did not name one.",
            "nullable": true
          },
          "os": {
            "type": "string",
            "description": "The target operating system the package was generated for: `macos`, `windows`, or `linux`.",
            "nullable": true
          },
          "environment": {
            "type": "string",
            "description": "The MineOS environment the package enrolls devices into, derived from the API host you called.",
            "nullable": true
          },
          "contents": {
            "type": "string",
            "description": "The deployment script to upload to your MDM. For Jamf it reads the packaging token from the policy's `$4` parameter;\r\n            for every other MDM the token is already embedded.",
            "nullable": true
          },
          "tokenInFile": {
            "type": "boolean",
            "description": "`true` when the packaging token is embedded in `contents`; `false` for Jamf, where you supply\r\n            `token.token` as the policy's `$4` parameter."
          },
          "token": {
            "$ref": "#/components/schemas/AispmMdmPackageTokenInfo"
          }
        },
        "additionalProperties": false,
        "description": "The generated package. Save `contents` to a file named `filename` and upload it to your MDM."
      },
      "AispmMdmPackageRevokeResponse": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "description": "`revoked` when a token was revoked; `noDesignation` when there was no token to revoke.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Result of revoking the packaging token."
      },
      "AispmMdmPackageTokenInfo": {
        "type": "object",
        "properties": {
          "tokenId": {
            "type": "string",
            "description": "The token's identifier. Safe to log; it is the prefix of `token`.",
            "nullable": true
          },
          "token": {
            "type": "string",
            "description": "The full token credential. Treat it as a secret: anyone holding it can enroll devices into your organization.",
            "nullable": true
          },
          "note": {
            "type": "string",
            "description": "How to use the token for the requested MDM.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "The packaging token that ties generated packages to your organization."
      },
      "AispmNotOnboardedResponse": {
        "type": "object",
        "properties": {
          "reason": {
            "type": "string",
            "description": "Always `tenant_not_onboarded`: your organization is not yet enabled for AI-agent discovery. Contact MineOS\r\n            support.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Body of the response that says your organization is not enabled for AI-agent discovery yet: `403` when asking for\r\n            a package, `409` when asking for insights."
      },
      "AispmUnavailableResponse": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "description": "Always `packaging_unavailable`.",
            "nullable": true
          },
          "message": {
            "type": "string",
            "description": "A short explanation of why packaging is unavailable right now.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "`503` body: package generation is temporarily unavailable."
      },
      "AispmUninstallPackageResponse": {
        "type": "object",
        "properties": {
          "filename": {
            "type": "string",
            "description": "The file name to save `contents` as.",
            "nullable": true
          },
          "os": {
            "type": "string",
            "description": "The operating system the package is for: `macos`, `windows` or `linux`.",
            "nullable": true
          },
          "environment": {
            "type": "string",
            "description": "The MineOS environment the package was generated for, derived from the API host you called.",
            "nullable": true
          },
          "contents": {
            "type": "string",
            "description": "The uninstall script to deploy. It is the same for every organization and contains no credentials.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "The uninstall package. Save `contents` to a file named `filename` and upload it to your MDM."
      },
      "AispmUnverifiedLogMintRequest": {
        "type": "object",
        "properties": {
          "logId": {
            "type": "string",
            "description": "The log identifier, `YYYYMMDDTHHMMSSZ-<uuid>`, one per run.",
            "nullable": true
          },
          "sizeBytes": {
            "type": "integer",
            "description": "The compressed size in bytes of the log to be uploaded. Required; a size over the limit is answered with\r\n            `413`.",
            "format": "int64",
            "nullable": true
          },
          "source": {
            "type": "string",
            "description": "The component reporting the failure: `bootstrap` (the installer), `updater`, or `scanner`.",
            "nullable": true
          },
          "enrollmentToken": {
            "type": "string",
            "description": "Your organization's enrollment token, as embedded in the MDM package.",
            "nullable": true
          },
          "outcome": {
            "type": "string",
            "description": "What failed, in the component's own vocabulary (for example `verify-failed`). Required.",
            "nullable": true
          },
          "stage": {
            "type": "string",
            "description": "Optional. The step within the outcome that failed (for example `signature`).",
            "nullable": true
          },
          "osArch": {
            "type": "string",
            "description": "Optional. The device's platform and architecture (for example `darwin-arm64`).",
            "nullable": true
          },
          "componentVersion": {
            "type": "string",
            "description": "Optional. The reporting component's version (for example `1.3.0`).",
            "nullable": true
          },
          "claimedDeviceId": {
            "type": "string",
            "description": "Optional. The device id the component believes it has. Unverified; used only to help support correlate reports.",
            "nullable": true
          },
          "claimedHostname": {
            "type": "string",
            "description": "Optional. The device's hostname as the component sees it. Unverified; used only to help support correlate\r\n            reports.",
            "nullable": true
          }
        },
        "additionalProperties": {
          "type": "object"
        },
        "description": "Failure report sent by a device agent component that does not yet hold a device certificate."
      },
      "EnrollmentRequest": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Your organization's enrollment token, as embedded in the MDM package. An invalid token is answered with\r\n            `401`.",
            "nullable": true
          },
          "csr": {
            "type": "string",
            "description": "A PEM-encoded PKCS#10 certificate signing request whose subject common name is the device id.",
            "nullable": true
          },
          "deviceIdSource": {
            "type": "string",
            "description": "Optional. Which operating-system identifier the device derived its device id from. Informational only; any value is\r\n            accepted.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Enrollment request sent by the device agent."
      },
      "EnrollmentTokenRequest": {
        "type": "object",
        "properties": {
          "validDays": {
            "type": "integer",
            "description": "How many days the token stays valid, from 1 to 365.",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "The lifetime of the token to issue. Your organization is derived from the call, not from the body."
      },
      "EnrollmentTokenResponse": {
        "type": "object",
        "properties": {
          "tokenId": {
            "type": "string",
            "description": "The token's identifier. Use it to revoke the token; it is safe to log.",
            "nullable": true
          },
          "token": {
            "type": "string",
            "description": "The full token credential. Treat it as a secret: anyone holding it can enroll devices into your organization. It is not\r\n            shown again.",
            "nullable": true
          },
          "expiresAt": {
            "type": "string",
            "description": "When the token expires (UTC).",
            "format": "date-time",
            "nullable": true
          },
          "note": {
            "type": "string",
            "description": "Guidance on handling the token.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "A newly issued enrollment token. The token value appears only in this response."
      },
      "EnrollmentTokenRevocationResponse": {
        "type": "object",
        "properties": {
          "tokenId": {
            "type": "string",
            "description": "The identifier of the token the call referred to.",
            "nullable": true
          },
          "status": {
            "type": "string",
            "description": "`revoked` when the token was revoked by this call; `alreadyRevoked` when it had been revoked before.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Result of revoking an enrollment token."
      },
      "InfoResponse": {
        "type": "object",
        "properties": {
          "privacyCenterUrl": {
            "type": "string",
            "description": "Privacy Center URL",
            "nullable": true,
            "example": "https://acmecorp.saymine.io/acmecorp"
          },
          "users": {
            "type": "integer",
            "description": "Number of users with access to the account.",
            "format": "int32",
            "example": 1
          },
          "closedRequests": {
            "type": "integer",
            "description": "Total number of already handled requests.",
            "format": "int32",
            "example": 10
          },
          "openRequests": {
            "type": "integer",
            "description": "Total number of currently open requests that need to be handled.",
            "format": "int32",
            "example": 3
          }
        },
        "additionalProperties": false
      },
      "ProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "instance": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": { }
      },
      "RenewRequest": {
        "type": "object",
        "properties": {
          "csr": {
            "type": "string",
            "description": "A fresh PEM-encoded PKCS#10 certificate signing request for the same device id as the current certificate.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Certificate renewal request sent by the device agent."
      }
    },
    "securitySchemes": {
      "Bearer": {
        "type": "apiKey",
        "description": "Authorization header using the Bearer scheme. \r\n\r\nEnter 'Bearer' [space] and then your API Key in the text input below.\r\n\r\nExample: 'Bearer 12345abcdef'",
        "name": "Authorization",
        "in": "header"
      }
    }
  },
  "security": [
    {
      "Bearer": [ ]
    }
  ]
}